@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.
Files changed (371) hide show
  1. package/README.md +126 -0
  2. package/package.json +53 -0
  3. package/skills/1password/SKILL.md +70 -0
  4. package/skills/1password/references/cli-examples.md +29 -0
  5. package/skills/1password/references/get-started.md +17 -0
  6. package/skills/apple-notes/SKILL.md +77 -0
  7. package/skills/apple-reminders/SKILL.md +96 -0
  8. package/skills/bear-notes/SKILL.md +107 -0
  9. package/skills/bird/SKILL.md +224 -0
  10. package/skills/blogwatcher/SKILL.md +69 -0
  11. package/skills/blucli/SKILL.md +47 -0
  12. package/skills/bluebubbles/SKILL.md +131 -0
  13. package/skills/camsnap/SKILL.md +45 -0
  14. package/skills/canvas/SKILL.md +203 -0
  15. package/skills/clawhub/SKILL.md +77 -0
  16. package/skills/coding-agent/SKILL.md +284 -0
  17. package/skills/discord/SKILL.md +578 -0
  18. package/skills/eightctl/SKILL.md +50 -0
  19. package/skills/food-order/SKILL.md +48 -0
  20. package/skills/gemini/SKILL.md +43 -0
  21. package/skills/gifgrep/SKILL.md +79 -0
  22. package/skills/github/SKILL.md +77 -0
  23. package/skills/gog/SKILL.md +116 -0
  24. package/skills/goplaces/SKILL.md +52 -0
  25. package/skills/healthcheck/SKILL.md +245 -0
  26. package/skills/himalaya/SKILL.md +257 -0
  27. package/skills/himalaya/references/configuration.md +184 -0
  28. package/skills/himalaya/references/message-composition.md +199 -0
  29. package/skills/imsg/SKILL.md +74 -0
  30. package/skills/local-places/SERVER_README.md +101 -0
  31. package/skills/local-places/SKILL.md +102 -0
  32. package/skills/local-places/pyproject.toml +21 -0
  33. package/skills/local-places/src/local_places/__init__.py +2 -0
  34. package/skills/local-places/src/local_places/google_places.py +314 -0
  35. package/skills/local-places/src/local_places/main.py +65 -0
  36. package/skills/local-places/src/local_places/schemas.py +107 -0
  37. package/skills/mcporter/SKILL.md +61 -0
  38. package/skills/model-usage/SKILL.md +69 -0
  39. package/skills/model-usage/references/codexbar-cli.md +33 -0
  40. package/skills/model-usage/scripts/model_usage.py +310 -0
  41. package/skills/nano-banana-pro/SKILL.md +58 -0
  42. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  43. package/skills/nano-pdf/SKILL.md +38 -0
  44. package/skills/notion/SKILL.md +172 -0
  45. package/skills/obsidian/SKILL.md +81 -0
  46. package/skills/openai-image-gen/SKILL.md +89 -0
  47. package/skills/openai-image-gen/scripts/gen.py +240 -0
  48. package/skills/openai-whisper/SKILL.md +38 -0
  49. package/skills/openai-whisper-api/SKILL.md +52 -0
  50. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  51. package/skills/openhue/SKILL.md +51 -0
  52. package/skills/oracle/SKILL.md +125 -0
  53. package/skills/ordercli/SKILL.md +78 -0
  54. package/skills/peekaboo/SKILL.md +190 -0
  55. package/skills/sag/SKILL.md +87 -0
  56. package/skills/security-ask-questions-if-underspecified/.claude-plugin/plugin.json +10 -0
  57. package/skills/security-ask-questions-if-underspecified/README.md +24 -0
  58. package/skills/security-ask-questions-if-underspecified/skills/ask-questions-if-underspecified/SKILL.md +85 -0
  59. package/skills/security-audit-context-building/.claude-plugin/plugin.json +10 -0
  60. package/skills/security-audit-context-building/README.md +58 -0
  61. package/skills/security-audit-context-building/commands/audit-context.md +21 -0
  62. package/skills/security-audit-context-building/skills/audit-context-building/SKILL.md +297 -0
  63. package/skills/security-audit-context-building/skills/audit-context-building/resources/COMPLETENESS_CHECKLIST.md +47 -0
  64. package/skills/security-audit-context-building/skills/audit-context-building/resources/FUNCTION_MICRO_ANALYSIS_EXAMPLE.md +355 -0
  65. package/skills/security-audit-context-building/skills/audit-context-building/resources/OUTPUT_REQUIREMENTS.md +71 -0
  66. package/skills/security-building-secure-contracts/.claude-plugin/plugin.json +10 -0
  67. package/skills/security-building-secure-contracts/README.md +241 -0
  68. package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/SKILL.md +284 -0
  69. package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +405 -0
  70. package/skills/security-building-secure-contracts/skills/audit-prep-assistant/SKILL.md +409 -0
  71. package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/SKILL.md +329 -0
  72. package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +722 -0
  73. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/SKILL.md +218 -0
  74. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/ASSESSMENT_CRITERIA.md +355 -0
  75. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/EXAMPLE_REPORT.md +248 -0
  76. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/REPORT_FORMAT.md +33 -0
  77. package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/SKILL.md +334 -0
  78. package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +740 -0
  79. package/skills/security-building-secure-contracts/skills/guidelines-advisor/SKILL.md +252 -0
  80. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/ASSESSMENT_AREAS.md +329 -0
  81. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/DELIVERABLES.md +118 -0
  82. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/EXAMPLE_REPORT.md +298 -0
  83. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/SKILL.md +161 -0
  84. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/EXAMPLE_REPORT.md +279 -0
  85. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/WORKFLOW_STEPS.md +132 -0
  86. package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/SKILL.md +389 -0
  87. package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +669 -0
  88. package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/SKILL.md +298 -0
  89. package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +791 -0
  90. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/SKILL.md +362 -0
  91. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/ASSESSMENT_CATEGORIES.md +571 -0
  92. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/REPORT_TEMPLATES.md +141 -0
  93. package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/SKILL.md +388 -0
  94. package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +595 -0
  95. package/skills/security-burpsuite-project-parser/.claude-plugin/plugin.json +10 -0
  96. package/skills/security-burpsuite-project-parser/README.md +103 -0
  97. package/skills/security-burpsuite-project-parser/commands/burp-search.md +18 -0
  98. package/skills/security-burpsuite-project-parser/skills/SKILL.md +358 -0
  99. package/skills/security-burpsuite-project-parser/skills/scripts/burp-search.sh +99 -0
  100. package/skills/security-claude-in-chrome-troubleshooting/.claude-plugin/plugin.json +8 -0
  101. package/skills/security-claude-in-chrome-troubleshooting/README.md +31 -0
  102. package/skills/security-claude-in-chrome-troubleshooting/skills/claude-in-chrome-troubleshooting/SKILL.md +251 -0
  103. package/skills/security-constant-time-analysis/.claude-plugin/plugin.json +9 -0
  104. package/skills/security-constant-time-analysis/README.md +381 -0
  105. package/skills/security-constant-time-analysis/commands/ct-check.md +20 -0
  106. package/skills/security-constant-time-analysis/ct_analyzer/__init__.py +49 -0
  107. package/skills/security-constant-time-analysis/ct_analyzer/analyzer.py +1284 -0
  108. package/skills/security-constant-time-analysis/ct_analyzer/script_analyzers.py +3081 -0
  109. package/skills/security-constant-time-analysis/ct_analyzer/tests/__init__.py +1 -0
  110. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_analyzer.py +1397 -0
  111. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/bn_excerpt.js +205 -0
  112. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_constant_time.c +181 -0
  113. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.c +74 -0
  114. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.go +78 -0
  115. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.rs +92 -0
  116. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.cs +174 -0
  117. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.java +161 -0
  118. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.kt +181 -0
  119. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.php +140 -0
  120. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.py +252 -0
  121. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.rb +188 -0
  122. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.swift +199 -0
  123. package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.ts +154 -0
  124. package/skills/security-constant-time-analysis/pyproject.toml +52 -0
  125. package/skills/security-constant-time-analysis/skills/constant-time-analysis/README.md +90 -0
  126. package/skills/security-constant-time-analysis/skills/constant-time-analysis/SKILL.md +219 -0
  127. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/compiled.md +129 -0
  128. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/javascript.md +136 -0
  129. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/kotlin.md +252 -0
  130. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/php.md +172 -0
  131. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/python.md +179 -0
  132. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/ruby.md +198 -0
  133. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/swift.md +288 -0
  134. package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/vm-compiled.md +354 -0
  135. package/skills/security-constant-time-analysis/uv.lock +8 -0
  136. package/skills/security-culture-index/.claude-plugin/plugin.json +8 -0
  137. package/skills/security-culture-index/README.md +79 -0
  138. package/skills/security-culture-index/skills/interpreting-culture-index/SKILL.md +293 -0
  139. package/skills/security-culture-index/skills/interpreting-culture-index/references/anti-patterns.md +255 -0
  140. package/skills/security-culture-index/skills/interpreting-culture-index/references/conversation-starters.md +408 -0
  141. package/skills/security-culture-index/skills/interpreting-culture-index/references/interview-trait-signals.md +253 -0
  142. package/skills/security-culture-index/skills/interpreting-culture-index/references/motivators.md +158 -0
  143. package/skills/security-culture-index/skills/interpreting-culture-index/references/patterns-archetypes.md +147 -0
  144. package/skills/security-culture-index/skills/interpreting-culture-index/references/primary-traits.md +307 -0
  145. package/skills/security-culture-index/skills/interpreting-culture-index/references/secondary-traits.md +228 -0
  146. package/skills/security-culture-index/skills/interpreting-culture-index/references/team-composition.md +148 -0
  147. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/check_deps.py +108 -0
  148. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/__init__.py +20 -0
  149. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/constants.py +122 -0
  150. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/extract.py +187 -0
  151. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/models.py +16 -0
  152. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/opencv_extractor.py +520 -0
  153. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/extract_pdf.py +237 -0
  154. package/skills/security-culture-index/skills/interpreting-culture-index/scripts/pyproject.toml +18 -0
  155. package/skills/security-culture-index/skills/interpreting-culture-index/templates/burnout-report.md +113 -0
  156. package/skills/security-culture-index/skills/interpreting-culture-index/templates/comparison-report.md +103 -0
  157. package/skills/security-culture-index/skills/interpreting-culture-index/templates/hiring-profile.md +127 -0
  158. package/skills/security-culture-index/skills/interpreting-culture-index/templates/individual-report.md +85 -0
  159. package/skills/security-culture-index/skills/interpreting-culture-index/templates/predicted-profile.md +165 -0
  160. package/skills/security-culture-index/skills/interpreting-culture-index/templates/team-report.md +109 -0
  161. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/analyze-team.md +188 -0
  162. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/coach-manager.md +267 -0
  163. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/compare-profiles.md +188 -0
  164. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/define-hiring-profile.md +220 -0
  165. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/detect-burnout.md +206 -0
  166. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/extract-from-pdf.md +121 -0
  167. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interpret-individual.md +183 -0
  168. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interview-debrief.md +234 -0
  169. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/mediate-conflict.md +306 -0
  170. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/plan-onboarding.md +322 -0
  171. package/skills/security-culture-index/skills/interpreting-culture-index/workflows/predict-from-interview.md +250 -0
  172. package/skills/security-differential-review/.claude-plugin/plugin.json +10 -0
  173. package/skills/security-differential-review/README.md +109 -0
  174. package/skills/security-differential-review/commands/diff-review.md +21 -0
  175. package/skills/security-differential-review/skills/differential-review/SKILL.md +220 -0
  176. package/skills/security-differential-review/skills/differential-review/adversarial.md +203 -0
  177. package/skills/security-differential-review/skills/differential-review/methodology.md +234 -0
  178. package/skills/security-differential-review/skills/differential-review/patterns.md +300 -0
  179. package/skills/security-differential-review/skills/differential-review/reporting.md +369 -0
  180. package/skills/security-dwarf-expert/.claude-plugin/plugin.json +10 -0
  181. package/skills/security-dwarf-expert/README.md +38 -0
  182. package/skills/security-dwarf-expert/skills/dwarf-expert/SKILL.md +93 -0
  183. package/skills/security-dwarf-expert/skills/dwarf-expert/reference/coding.md +31 -0
  184. package/skills/security-dwarf-expert/skills/dwarf-expert/reference/dwarfdump.md +50 -0
  185. package/skills/security-dwarf-expert/skills/dwarf-expert/reference/readelf.md +8 -0
  186. package/skills/security-entry-point-analyzer/.claude-plugin/plugin.json +10 -0
  187. package/skills/security-entry-point-analyzer/README.md +74 -0
  188. package/skills/security-entry-point-analyzer/commands/entry-points.md +18 -0
  189. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/SKILL.md +251 -0
  190. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/cosmwasm.md +182 -0
  191. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-aptos.md +107 -0
  192. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-sui.md +87 -0
  193. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solana.md +155 -0
  194. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solidity.md +135 -0
  195. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/ton.md +185 -0
  196. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/vyper.md +141 -0
  197. package/skills/security-firebase-apk-scanner/.claude-plugin/plugin.json +10 -0
  198. package/skills/security-firebase-apk-scanner/README.md +85 -0
  199. package/skills/security-firebase-apk-scanner/commands/scan-apk.md +18 -0
  200. package/skills/security-firebase-apk-scanner/scanner.sh +1408 -0
  201. package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/SKILL.md +197 -0
  202. package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/references/vulnerabilities.md +803 -0
  203. package/skills/security-fix-review/.claude-plugin/plugin.json +13 -0
  204. package/skills/security-fix-review/README.md +118 -0
  205. package/skills/security-fix-review/commands/fix-review.md +24 -0
  206. package/skills/security-fix-review/skills/fix-review/SKILL.md +264 -0
  207. package/skills/security-fix-review/skills/fix-review/references/bug-detection.md +408 -0
  208. package/skills/security-fix-review/skills/fix-review/references/finding-matching.md +298 -0
  209. package/skills/security-fix-review/skills/fix-review/references/report-parsing.md +398 -0
  210. package/skills/security-insecure-defaults/.claude-plugin/plugin.json +10 -0
  211. package/skills/security-insecure-defaults/README.md +45 -0
  212. package/skills/security-insecure-defaults/skills/insecure-defaults/SKILL.md +117 -0
  213. package/skills/security-insecure-defaults/skills/insecure-defaults/references/examples.md +409 -0
  214. package/skills/security-modern-python/.claude-plugin/plugin.json +10 -0
  215. package/skills/security-modern-python/README.md +58 -0
  216. package/skills/security-modern-python/hooks/hooks.json +16 -0
  217. package/skills/security-modern-python/hooks/intercept-legacy-python.bats +388 -0
  218. package/skills/security-modern-python/hooks/intercept-legacy-python.sh +109 -0
  219. package/skills/security-modern-python/hooks/test_helper.bash +75 -0
  220. package/skills/security-modern-python/skills/modern-python/SKILL.md +333 -0
  221. package/skills/security-modern-python/skills/modern-python/references/dependabot.md +43 -0
  222. package/skills/security-modern-python/skills/modern-python/references/migration-checklist.md +141 -0
  223. package/skills/security-modern-python/skills/modern-python/references/pep723-scripts.md +259 -0
  224. package/skills/security-modern-python/skills/modern-python/references/prek.md +211 -0
  225. package/skills/security-modern-python/skills/modern-python/references/pyproject.md +254 -0
  226. package/skills/security-modern-python/skills/modern-python/references/ruff-config.md +240 -0
  227. package/skills/security-modern-python/skills/modern-python/references/security-setup.md +255 -0
  228. package/skills/security-modern-python/skills/modern-python/references/testing.md +284 -0
  229. package/skills/security-modern-python/skills/modern-python/references/uv-commands.md +200 -0
  230. package/skills/security-modern-python/skills/modern-python/templates/dependabot.yml +36 -0
  231. package/skills/security-modern-python/skills/modern-python/templates/pre-commit-config.yaml +66 -0
  232. package/skills/security-property-based-testing/.claude-plugin/plugin.json +9 -0
  233. package/skills/security-property-based-testing/README.md +47 -0
  234. package/skills/security-property-based-testing/skills/property-based-testing/README.md +88 -0
  235. package/skills/security-property-based-testing/skills/property-based-testing/SKILL.md +109 -0
  236. package/skills/security-property-based-testing/skills/property-based-testing/references/design.md +191 -0
  237. package/skills/security-property-based-testing/skills/property-based-testing/references/generating.md +200 -0
  238. package/skills/security-property-based-testing/skills/property-based-testing/references/libraries.md +130 -0
  239. package/skills/security-property-based-testing/skills/property-based-testing/references/refactoring.md +181 -0
  240. package/skills/security-property-based-testing/skills/property-based-testing/references/reviewing.md +209 -0
  241. package/skills/security-property-based-testing/skills/property-based-testing/references/strategies.md +124 -0
  242. package/skills/semgrep-rule-creator/.claude-plugin/plugin.json +8 -0
  243. package/skills/semgrep-rule-creator/README.md +43 -0
  244. package/skills/semgrep-rule-creator/commands/semgrep-rule.md +26 -0
  245. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/SKILL.md +168 -0
  246. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/quick-reference.md +203 -0
  247. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/workflow.md +240 -0
  248. package/skills/semgrep-rule-variant-creator/.claude-plugin/plugin.json +9 -0
  249. package/skills/semgrep-rule-variant-creator/README.md +86 -0
  250. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/SKILL.md +205 -0
  251. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/applicability-analysis.md +250 -0
  252. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/language-syntax-guide.md +324 -0
  253. package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/workflow.md +518 -0
  254. package/skills/session-logs/SKILL.md +115 -0
  255. package/skills/sharp-edges/.claude-plugin/plugin.json +10 -0
  256. package/skills/sharp-edges/README.md +48 -0
  257. package/skills/sharp-edges/skills/sharp-edges/SKILL.md +292 -0
  258. package/skills/sharp-edges/skills/sharp-edges/references/auth-patterns.md +252 -0
  259. package/skills/sharp-edges/skills/sharp-edges/references/case-studies.md +274 -0
  260. package/skills/sharp-edges/skills/sharp-edges/references/config-patterns.md +333 -0
  261. package/skills/sharp-edges/skills/sharp-edges/references/crypto-apis.md +190 -0
  262. package/skills/sharp-edges/skills/sharp-edges/references/lang-c.md +205 -0
  263. package/skills/sharp-edges/skills/sharp-edges/references/lang-csharp.md +285 -0
  264. package/skills/sharp-edges/skills/sharp-edges/references/lang-go.md +270 -0
  265. package/skills/sharp-edges/skills/sharp-edges/references/lang-java.md +263 -0
  266. package/skills/sharp-edges/skills/sharp-edges/references/lang-javascript.md +269 -0
  267. package/skills/sharp-edges/skills/sharp-edges/references/lang-kotlin.md +265 -0
  268. package/skills/sharp-edges/skills/sharp-edges/references/lang-php.md +245 -0
  269. package/skills/sharp-edges/skills/sharp-edges/references/lang-python.md +274 -0
  270. package/skills/sharp-edges/skills/sharp-edges/references/lang-ruby.md +273 -0
  271. package/skills/sharp-edges/skills/sharp-edges/references/lang-rust.md +272 -0
  272. package/skills/sharp-edges/skills/sharp-edges/references/lang-swift.md +287 -0
  273. package/skills/sharp-edges/skills/sharp-edges/references/language-specific.md +588 -0
  274. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  275. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  276. package/skills/skill-creator/SKILL.md +370 -0
  277. package/skills/skill-creator/license.txt +202 -0
  278. package/skills/skill-creator/scripts/init_skill.py +378 -0
  279. package/skills/skill-creator/scripts/package_skill.py +111 -0
  280. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  281. package/skills/slack/SKILL.md +144 -0
  282. package/skills/songsee/SKILL.md +49 -0
  283. package/skills/sonoscli/SKILL.md +46 -0
  284. package/skills/spec-to-code-compliance/.claude-plugin/plugin.json +10 -0
  285. package/skills/spec-to-code-compliance/README.md +67 -0
  286. package/skills/spec-to-code-compliance/commands/spec-compliance.md +22 -0
  287. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/SKILL.md +349 -0
  288. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +69 -0
  289. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +417 -0
  290. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +105 -0
  291. package/skills/spotify-player/SKILL.md +64 -0
  292. package/skills/static-analysis/.claude-plugin/plugin.json +8 -0
  293. package/skills/static-analysis/README.md +59 -0
  294. package/skills/static-analysis/skills/codeql/SKILL.md +315 -0
  295. package/skills/static-analysis/skills/sarif-parsing/SKILL.md +479 -0
  296. package/skills/static-analysis/skills/sarif-parsing/resources/jq-queries.md +162 -0
  297. package/skills/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +331 -0
  298. package/skills/static-analysis/skills/semgrep/SKILL.md +337 -0
  299. package/skills/summarize/SKILL.md +87 -0
  300. package/skills/testing-handbook-skills/.claude-plugin/plugin.json +8 -0
  301. package/skills/testing-handbook-skills/README.md +241 -0
  302. package/skills/testing-handbook-skills/scripts/pyproject.toml +8 -0
  303. package/skills/testing-handbook-skills/scripts/validate-skills.py +657 -0
  304. package/skills/testing-handbook-skills/skills/address-sanitizer/SKILL.md +341 -0
  305. package/skills/testing-handbook-skills/skills/aflpp/SKILL.md +640 -0
  306. package/skills/testing-handbook-skills/skills/atheris/SKILL.md +515 -0
  307. package/skills/testing-handbook-skills/skills/cargo-fuzz/SKILL.md +454 -0
  308. package/skills/testing-handbook-skills/skills/codeql/SKILL.md +549 -0
  309. package/skills/testing-handbook-skills/skills/constant-time-testing/SKILL.md +507 -0
  310. package/skills/testing-handbook-skills/skills/coverage-analysis/SKILL.md +607 -0
  311. package/skills/testing-handbook-skills/skills/fuzzing-dictionary/SKILL.md +297 -0
  312. package/skills/testing-handbook-skills/skills/fuzzing-obstacles/SKILL.md +426 -0
  313. package/skills/testing-handbook-skills/skills/harness-writing/SKILL.md +614 -0
  314. package/skills/testing-handbook-skills/skills/libafl/SKILL.md +625 -0
  315. package/skills/testing-handbook-skills/skills/libfuzzer/SKILL.md +795 -0
  316. package/skills/testing-handbook-skills/skills/ossfuzz/SKILL.md +426 -0
  317. package/skills/testing-handbook-skills/skills/ruzzy/SKILL.md +443 -0
  318. package/skills/testing-handbook-skills/skills/semgrep/SKILL.md +601 -0
  319. package/skills/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md +372 -0
  320. package/skills/testing-handbook-skills/skills/testing-handbook-generator/agent-prompt.md +280 -0
  321. package/skills/testing-handbook-skills/skills/testing-handbook-generator/discovery.md +452 -0
  322. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/domain-skill.md +504 -0
  323. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/fuzzer-skill.md +454 -0
  324. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/technique-skill.md +527 -0
  325. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/tool-skill.md +366 -0
  326. package/skills/testing-handbook-skills/skills/testing-handbook-generator/testing.md +482 -0
  327. package/skills/testing-handbook-skills/skills/wycheproof/SKILL.md +533 -0
  328. package/skills/things-mac/SKILL.md +86 -0
  329. package/skills/tmux/SKILL.md +135 -0
  330. package/skills/tmux/scripts/find-sessions.sh +112 -0
  331. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  332. package/skills/trello/SKILL.md +95 -0
  333. package/skills/variant-analysis/.claude-plugin/plugin.json +8 -0
  334. package/skills/variant-analysis/README.md +41 -0
  335. package/skills/variant-analysis/commands/variants.md +23 -0
  336. package/skills/variant-analysis/skills/variant-analysis/METHODOLOGY.md +327 -0
  337. package/skills/variant-analysis/skills/variant-analysis/SKILL.md +142 -0
  338. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/cpp.ql +119 -0
  339. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/go.ql +69 -0
  340. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/java.ql +71 -0
  341. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/javascript.ql +63 -0
  342. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/python.ql +80 -0
  343. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/cpp.yaml +98 -0
  344. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/go.yaml +63 -0
  345. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/java.yaml +61 -0
  346. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/javascript.yaml +60 -0
  347. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/python.yaml +72 -0
  348. package/skills/variant-analysis/skills/variant-analysis/resources/variant-report-template.md +75 -0
  349. package/skills/video-frames/SKILL.md +46 -0
  350. package/skills/video-frames/scripts/frame.sh +81 -0
  351. package/skills/voice-call/SKILL.md +45 -0
  352. package/skills/wacli/SKILL.md +72 -0
  353. package/skills/weather/SKILL.md +54 -0
  354. package/skills/yara-authoring/.claude-plugin/plugin.json +9 -0
  355. package/skills/yara-authoring/README.md +131 -0
  356. package/skills/yara-authoring/skills/yara-rule-authoring/SKILL.md +645 -0
  357. package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Mac_ProtonRAT_Jan25.yar +99 -0
  358. package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_NPM_SupplyChain_Jan25.yar +170 -0
  359. package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Win_Remcos_Jan25.yar +103 -0
  360. package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_CRX_SuspiciousPermissions.yar +134 -0
  361. package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_JS_Obfuscation_Jan25.yar +185 -0
  362. package/skills/yara-authoring/skills/yara-rule-authoring/references/crx-module.md +214 -0
  363. package/skills/yara-authoring/skills/yara-rule-authoring/references/dex-module.md +383 -0
  364. package/skills/yara-authoring/skills/yara-rule-authoring/references/performance.md +333 -0
  365. package/skills/yara-authoring/skills/yara-rule-authoring/references/strings.md +433 -0
  366. package/skills/yara-authoring/skills/yara-rule-authoring/references/style-guide.md +257 -0
  367. package/skills/yara-authoring/skills/yara-rule-authoring/references/testing.md +399 -0
  368. package/skills/yara-authoring/skills/yara-rule-authoring/scripts/atom_analyzer.py +526 -0
  369. package/skills/yara-authoring/skills/yara-rule-authoring/scripts/pyproject.toml +25 -0
  370. package/skills/yara-authoring/skills/yara-rule-authoring/scripts/yara_lint.py +631 -0
  371. package/skills/yara-authoring/skills/yara-rule-authoring/workflows/rule-development.md +493 -0
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel, Field, field_validator
4
+
5
+
6
+ class LatLng(BaseModel):
7
+ lat: float = Field(ge=-90, le=90)
8
+ lng: float = Field(ge=-180, le=180)
9
+
10
+
11
+ class LocationBias(BaseModel):
12
+ lat: float = Field(ge=-90, le=90)
13
+ lng: float = Field(ge=-180, le=180)
14
+ radius_m: float = Field(gt=0)
15
+
16
+
17
+ class Filters(BaseModel):
18
+ types: list[str] | None = None
19
+ open_now: bool | None = None
20
+ min_rating: float | None = Field(default=None, ge=0, le=5)
21
+ price_levels: list[int] | None = None
22
+ keyword: str | None = Field(default=None, min_length=1)
23
+
24
+ @field_validator("types")
25
+ @classmethod
26
+ def validate_types(cls, value: list[str] | None) -> list[str] | None:
27
+ if value is None:
28
+ return value
29
+ if len(value) > 1:
30
+ raise ValueError(
31
+ "Only one type is supported. Use query/keyword for additional filtering."
32
+ )
33
+ return value
34
+
35
+ @field_validator("price_levels")
36
+ @classmethod
37
+ def validate_price_levels(cls, value: list[int] | None) -> list[int] | None:
38
+ if value is None:
39
+ return value
40
+ invalid = [level for level in value if level not in range(0, 5)]
41
+ if invalid:
42
+ raise ValueError("price_levels must be integers between 0 and 4.")
43
+ return value
44
+
45
+ @field_validator("min_rating")
46
+ @classmethod
47
+ def validate_min_rating(cls, value: float | None) -> float | None:
48
+ if value is None:
49
+ return value
50
+ if (value * 2) % 1 != 0:
51
+ raise ValueError("min_rating must be in 0.5 increments.")
52
+ return value
53
+
54
+
55
+ class SearchRequest(BaseModel):
56
+ query: str = Field(min_length=1)
57
+ location_bias: LocationBias | None = None
58
+ filters: Filters | None = None
59
+ limit: int = Field(default=10, ge=1, le=20)
60
+ page_token: str | None = None
61
+
62
+
63
+ class PlaceSummary(BaseModel):
64
+ place_id: str
65
+ name: str | None = None
66
+ address: str | None = None
67
+ location: LatLng | None = None
68
+ rating: float | None = None
69
+ price_level: int | None = None
70
+ types: list[str] | None = None
71
+ open_now: bool | None = None
72
+
73
+
74
+ class SearchResponse(BaseModel):
75
+ results: list[PlaceSummary]
76
+ next_page_token: str | None = None
77
+
78
+
79
+ class LocationResolveRequest(BaseModel):
80
+ location_text: str = Field(min_length=1)
81
+ limit: int = Field(default=5, ge=1, le=10)
82
+
83
+
84
+ class ResolvedLocation(BaseModel):
85
+ place_id: str
86
+ name: str | None = None
87
+ address: str | None = None
88
+ location: LatLng | None = None
89
+ types: list[str] | None = None
90
+
91
+
92
+ class LocationResolveResponse(BaseModel):
93
+ results: list[ResolvedLocation]
94
+
95
+
96
+ class PlaceDetails(BaseModel):
97
+ place_id: str
98
+ name: str | None = None
99
+ address: str | None = None
100
+ location: LatLng | None = None
101
+ rating: float | None = None
102
+ price_level: int | None = None
103
+ types: list[str] | None = None
104
+ phone: str | None = None
105
+ website: str | None = None
106
+ hours: list[str] | None = None
107
+ open_now: bool | None = None
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: mcporter
3
+ description: Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
4
+ homepage: http://mcporter.dev
5
+ metadata:
6
+ {
7
+ "otto":
8
+ {
9
+ "emoji": "📦",
10
+ "requires": { "bins": ["mcporter"] },
11
+ "install":
12
+ [
13
+ {
14
+ "id": "node",
15
+ "kind": "node",
16
+ "package": "mcporter",
17
+ "bins": ["mcporter"],
18
+ "label": "Install mcporter (node)",
19
+ },
20
+ ],
21
+ },
22
+ }
23
+ ---
24
+
25
+ # mcporter
26
+
27
+ Use `mcporter` to work with MCP servers directly.
28
+
29
+ Quick start
30
+
31
+ - `mcporter list`
32
+ - `mcporter list <server> --schema`
33
+ - `mcporter call <server.tool> key=value`
34
+
35
+ Call tools
36
+
37
+ - Selector: `mcporter call linear.list_issues team=ENG limit:5`
38
+ - Function syntax: `mcporter call "linear.create_issue(title: \"Bug\")"`
39
+ - Full URL: `mcporter call https://api.example.com/mcp.fetch url:https://example.com`
40
+ - Stdio: `mcporter call --stdio "bun run ./server.ts" scrape url=https://example.com`
41
+ - JSON payload: `mcporter call <server.tool> --args '{"limit":5}'`
42
+
43
+ Auth + config
44
+
45
+ - OAuth: `mcporter auth <server | url> [--reset]`
46
+ - Config: `mcporter config list|get|add|remove|import|login|logout`
47
+
48
+ Daemon
49
+
50
+ - `mcporter daemon start|status|stop|restart`
51
+
52
+ Codegen
53
+
54
+ - CLI: `mcporter generate-cli --server <name>` or `--command <url>`
55
+ - Inspect: `mcporter inspect-cli <path> [--json]`
56
+ - TS: `mcporter emit-ts <server> --mode client|types`
57
+
58
+ Notes
59
+
60
+ - Config default: `./config/mcporter.json` (override with `--config`).
61
+ - Prefer `--output json` for machine-readable results.
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: model-usage
3
+ description: Use CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
4
+ metadata:
5
+ {
6
+ "otto":
7
+ {
8
+ "emoji": "📊",
9
+ "os": ["darwin"],
10
+ "requires": { "bins": ["codexbar"] },
11
+ "install":
12
+ [
13
+ {
14
+ "id": "brew-cask",
15
+ "kind": "brew",
16
+ "cask": "steipete/tap/codexbar",
17
+ "bins": ["codexbar"],
18
+ "label": "Install CodexBar (brew cask)",
19
+ },
20
+ ],
21
+ },
22
+ }
23
+ ---
24
+
25
+ # Model usage
26
+
27
+ ## Overview
28
+
29
+ Get per-model usage cost from CodexBar's local cost logs. Supports "current model" (most recent daily entry) or "all models" summaries for Codex or Claude.
30
+
31
+ TODO: add Linux CLI support guidance once CodexBar CLI install path is documented for Linux.
32
+
33
+ ## Quick start
34
+
35
+ 1. Fetch cost JSON via CodexBar CLI or pass a JSON file.
36
+ 2. Use the bundled script to summarize by model.
37
+
38
+ ```bash
39
+ python {baseDir}/scripts/model_usage.py --provider codex --mode current
40
+ python {baseDir}/scripts/model_usage.py --provider codex --mode all
41
+ python {baseDir}/scripts/model_usage.py --provider claude --mode all --format json --pretty
42
+ ```
43
+
44
+ ## Current model logic
45
+
46
+ - Uses the most recent daily row with `modelBreakdowns`.
47
+ - Picks the model with the highest cost in that row.
48
+ - Falls back to the last entry in `modelsUsed` when breakdowns are missing.
49
+ - Override with `--model <name>` when you need a specific model.
50
+
51
+ ## Inputs
52
+
53
+ - Default: runs `codexbar cost --format json --provider <codex|claude>`.
54
+ - File or stdin:
55
+
56
+ ```bash
57
+ codexbar cost --provider codex --format json > /tmp/cost.json
58
+ python {baseDir}/scripts/model_usage.py --input /tmp/cost.json --mode all
59
+ cat /tmp/cost.json | python {baseDir}/scripts/model_usage.py --input - --mode current
60
+ ```
61
+
62
+ ## Output
63
+
64
+ - Text (default) or JSON (`--format json --pretty`).
65
+ - Values are cost-only per model; tokens are not split by model in CodexBar output.
66
+
67
+ ## References
68
+
69
+ - Read `references/codexbar-cli.md` for CLI flags and cost JSON fields.
@@ -0,0 +1,33 @@
1
+ # CodexBar CLI quick ref (usage + cost)
2
+
3
+ ## Install
4
+
5
+ - App: Preferences -> Advanced -> Install CLI
6
+ - Repo: ./bin/install-codexbar-cli.sh
7
+
8
+ ## Commands
9
+
10
+ - Usage snapshot (web/cli sources):
11
+ - codexbar usage --format json --pretty
12
+ - codexbar --provider all --format json
13
+ - Local cost usage (Codex + Claude only):
14
+ - codexbar cost --format json --pretty
15
+ - codexbar cost --provider codex|claude --format json
16
+
17
+ ## Cost JSON fields
18
+
19
+ The payload is an array (one per provider).
20
+
21
+ - provider, source, updatedAt
22
+ - sessionTokens, sessionCostUSD
23
+ - last30DaysTokens, last30DaysCostUSD
24
+ - daily[]: date, inputTokens, outputTokens, cacheReadTokens, cacheCreationTokens, totalTokens, totalCost, modelsUsed, modelBreakdowns[]
25
+ - modelBreakdowns[]: modelName, cost
26
+ - totals: totalInputTokens, totalOutputTokens, cacheReadTokens, cacheCreationTokens, totalTokens, totalCost
27
+
28
+ ## Notes
29
+
30
+ - Cost usage is local-only. It reads JSONL logs under:
31
+ - Codex: ~/.codex/sessions/\*_/_.jsonl
32
+ - Claude: ~/.config/claude/projects/**/\*.jsonl or ~/.claude/projects/**/\*.jsonl
33
+ - If web usage is required (non-local), use codexbar usage (not cost).
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Summarize CodexBar local cost usage by model.
4
+
5
+ Defaults to current model (most recent daily entry), or list all models.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import argparse
11
+ import json
12
+ import os
13
+ import subprocess
14
+ import sys
15
+ from dataclasses import dataclass
16
+ from datetime import date, datetime, timedelta
17
+ from typing import Any, Dict, Iterable, List, Optional, Tuple
18
+
19
+
20
+ def eprint(msg: str) -> None:
21
+ print(msg, file=sys.stderr)
22
+
23
+
24
+ def run_codexbar_cost(provider: str) -> List[Dict[str, Any]]:
25
+ cmd = ["codexbar", "cost", "--format", "json", "--provider", provider]
26
+ try:
27
+ output = subprocess.check_output(cmd, text=True)
28
+ except FileNotFoundError:
29
+ raise RuntimeError("codexbar not found on PATH. Install CodexBar CLI first.")
30
+ except subprocess.CalledProcessError as exc:
31
+ raise RuntimeError(f"codexbar cost failed (exit {exc.returncode}).")
32
+ try:
33
+ payload = json.loads(output)
34
+ except json.JSONDecodeError as exc:
35
+ raise RuntimeError(f"Failed to parse codexbar JSON output: {exc}")
36
+ if not isinstance(payload, list):
37
+ raise RuntimeError("Expected codexbar cost JSON array.")
38
+ return payload
39
+
40
+
41
+ def load_payload(input_path: Optional[str], provider: str) -> Dict[str, Any]:
42
+ if input_path:
43
+ if input_path == "-":
44
+ raw = sys.stdin.read()
45
+ else:
46
+ with open(input_path, "r", encoding="utf-8") as handle:
47
+ raw = handle.read()
48
+ data = json.loads(raw)
49
+ else:
50
+ data = run_codexbar_cost(provider)
51
+
52
+ if isinstance(data, dict):
53
+ return data
54
+
55
+ if isinstance(data, list):
56
+ for entry in data:
57
+ if isinstance(entry, dict) and entry.get("provider") == provider:
58
+ return entry
59
+ raise RuntimeError(f"Provider '{provider}' not found in codexbar payload.")
60
+
61
+ raise RuntimeError("Unsupported JSON input format.")
62
+
63
+
64
+ @dataclass
65
+ class ModelCost:
66
+ model: str
67
+ cost: float
68
+
69
+
70
+ def parse_daily_entries(payload: Dict[str, Any]) -> List[Dict[str, Any]]:
71
+ daily = payload.get("daily")
72
+ if not daily:
73
+ return []
74
+ if not isinstance(daily, list):
75
+ return []
76
+ return [entry for entry in daily if isinstance(entry, dict)]
77
+
78
+
79
+ def parse_date(value: str) -> Optional[date]:
80
+ try:
81
+ return datetime.strptime(value, "%Y-%m-%d").date()
82
+ except Exception:
83
+ return None
84
+
85
+
86
+ def filter_by_days(entries: List[Dict[str, Any]], days: Optional[int]) -> List[Dict[str, Any]]:
87
+ if not days:
88
+ return entries
89
+ cutoff = date.today() - timedelta(days=days - 1)
90
+ filtered: List[Dict[str, Any]] = []
91
+ for entry in entries:
92
+ day = entry.get("date")
93
+ if not isinstance(day, str):
94
+ continue
95
+ parsed = parse_date(day)
96
+ if parsed and parsed >= cutoff:
97
+ filtered.append(entry)
98
+ return filtered
99
+
100
+
101
+ def aggregate_costs(entries: Iterable[Dict[str, Any]]) -> Dict[str, float]:
102
+ totals: Dict[str, float] = {}
103
+ for entry in entries:
104
+ breakdowns = entry.get("modelBreakdowns")
105
+ if not breakdowns:
106
+ continue
107
+ if not isinstance(breakdowns, list):
108
+ continue
109
+ for item in breakdowns:
110
+ if not isinstance(item, dict):
111
+ continue
112
+ model = item.get("modelName")
113
+ cost = item.get("cost")
114
+ if not isinstance(model, str):
115
+ continue
116
+ if not isinstance(cost, (int, float)):
117
+ continue
118
+ totals[model] = totals.get(model, 0.0) + float(cost)
119
+ return totals
120
+
121
+
122
+ def pick_current_model(entries: List[Dict[str, Any]]) -> Tuple[Optional[str], Optional[str]]:
123
+ if not entries:
124
+ return None, None
125
+ sorted_entries = sorted(
126
+ entries,
127
+ key=lambda entry: entry.get("date") or "",
128
+ )
129
+ for entry in reversed(sorted_entries):
130
+ breakdowns = entry.get("modelBreakdowns")
131
+ if isinstance(breakdowns, list) and breakdowns:
132
+ scored: List[ModelCost] = []
133
+ for item in breakdowns:
134
+ if not isinstance(item, dict):
135
+ continue
136
+ model = item.get("modelName")
137
+ cost = item.get("cost")
138
+ if isinstance(model, str) and isinstance(cost, (int, float)):
139
+ scored.append(ModelCost(model=model, cost=float(cost)))
140
+ if scored:
141
+ scored.sort(key=lambda item: item.cost, reverse=True)
142
+ return scored[0].model, entry.get("date") if isinstance(entry.get("date"), str) else None
143
+ models_used = entry.get("modelsUsed")
144
+ if isinstance(models_used, list) and models_used:
145
+ last = models_used[-1]
146
+ if isinstance(last, str):
147
+ return last, entry.get("date") if isinstance(entry.get("date"), str) else None
148
+ return None, None
149
+
150
+
151
+ def usd(value: Optional[float]) -> str:
152
+ if value is None:
153
+ return "—"
154
+ return f"${value:,.2f}"
155
+
156
+
157
+ def latest_day_cost(entries: List[Dict[str, Any]], model: str) -> Tuple[Optional[str], Optional[float]]:
158
+ if not entries:
159
+ return None, None
160
+ sorted_entries = sorted(
161
+ entries,
162
+ key=lambda entry: entry.get("date") or "",
163
+ )
164
+ for entry in reversed(sorted_entries):
165
+ breakdowns = entry.get("modelBreakdowns")
166
+ if not isinstance(breakdowns, list):
167
+ continue
168
+ for item in breakdowns:
169
+ if not isinstance(item, dict):
170
+ continue
171
+ if item.get("modelName") == model:
172
+ cost = item.get("cost") if isinstance(item.get("cost"), (int, float)) else None
173
+ day = entry.get("date") if isinstance(entry.get("date"), str) else None
174
+ return day, float(cost) if cost is not None else None
175
+ return None, None
176
+
177
+
178
+ def render_text_current(
179
+ provider: str,
180
+ model: str,
181
+ latest_date: Optional[str],
182
+ total_cost: Optional[float],
183
+ latest_cost: Optional[float],
184
+ latest_cost_date: Optional[str],
185
+ entry_count: int,
186
+ ) -> str:
187
+ lines = [f"Provider: {provider}", f"Current model: {model}"]
188
+ if latest_date:
189
+ lines.append(f"Latest model date: {latest_date}")
190
+ lines.append(f"Total cost (rows): {usd(total_cost)}")
191
+ if latest_cost_date:
192
+ lines.append(f"Latest day cost: {usd(latest_cost)} ({latest_cost_date})")
193
+ lines.append(f"Daily rows: {entry_count}")
194
+ return "\n".join(lines)
195
+
196
+
197
+ def render_text_all(provider: str, totals: Dict[str, float]) -> str:
198
+ lines = [f"Provider: {provider}", "Models:"]
199
+ for model, cost in sorted(totals.items(), key=lambda item: item[1], reverse=True):
200
+ lines.append(f"- {model}: {usd(cost)}")
201
+ return "\n".join(lines)
202
+
203
+
204
+ def build_json_current(
205
+ provider: str,
206
+ model: str,
207
+ latest_date: Optional[str],
208
+ total_cost: Optional[float],
209
+ latest_cost: Optional[float],
210
+ latest_cost_date: Optional[str],
211
+ entry_count: int,
212
+ ) -> Dict[str, Any]:
213
+ return {
214
+ "provider": provider,
215
+ "mode": "current",
216
+ "model": model,
217
+ "latestModelDate": latest_date,
218
+ "totalCostUSD": total_cost,
219
+ "latestDayCostUSD": latest_cost,
220
+ "latestDayCostDate": latest_cost_date,
221
+ "dailyRowCount": entry_count,
222
+ }
223
+
224
+
225
+ def build_json_all(provider: str, totals: Dict[str, float]) -> Dict[str, Any]:
226
+ return {
227
+ "provider": provider,
228
+ "mode": "all",
229
+ "models": [
230
+ {"model": model, "totalCostUSD": cost}
231
+ for model, cost in sorted(totals.items(), key=lambda item: item[1], reverse=True)
232
+ ],
233
+ }
234
+
235
+
236
+ def main() -> int:
237
+ parser = argparse.ArgumentParser(description="Summarize CodexBar model usage from local cost logs.")
238
+ parser.add_argument("--provider", choices=["codex", "claude"], default="codex")
239
+ parser.add_argument("--mode", choices=["current", "all"], default="current")
240
+ parser.add_argument("--model", help="Explicit model name to report instead of auto-current.")
241
+ parser.add_argument("--input", help="Path to codexbar cost JSON (or '-' for stdin).")
242
+ parser.add_argument("--days", type=int, help="Limit to last N days (based on daily rows).")
243
+ parser.add_argument("--format", choices=["text", "json"], default="text")
244
+ parser.add_argument("--pretty", action="store_true", help="Pretty-print JSON output.")
245
+
246
+ args = parser.parse_args()
247
+
248
+ try:
249
+ payload = load_payload(args.input, args.provider)
250
+ except Exception as exc:
251
+ eprint(str(exc))
252
+ return 1
253
+
254
+ entries = parse_daily_entries(payload)
255
+ entries = filter_by_days(entries, args.days)
256
+
257
+ if args.mode == "current":
258
+ model = args.model
259
+ latest_date = None
260
+ if not model:
261
+ model, latest_date = pick_current_model(entries)
262
+ if not model:
263
+ eprint("No model data found in codexbar cost payload.")
264
+ return 2
265
+ totals = aggregate_costs(entries)
266
+ total_cost = totals.get(model)
267
+ latest_cost_date, latest_cost = latest_day_cost(entries, model)
268
+
269
+ if args.format == "json":
270
+ payload_out = build_json_current(
271
+ provider=args.provider,
272
+ model=model,
273
+ latest_date=latest_date,
274
+ total_cost=total_cost,
275
+ latest_cost=latest_cost,
276
+ latest_cost_date=latest_cost_date,
277
+ entry_count=len(entries),
278
+ )
279
+ indent = 2 if args.pretty else None
280
+ print(json.dumps(payload_out, indent=indent, sort_keys=args.pretty))
281
+ else:
282
+ print(
283
+ render_text_current(
284
+ provider=args.provider,
285
+ model=model,
286
+ latest_date=latest_date,
287
+ total_cost=total_cost,
288
+ latest_cost=latest_cost,
289
+ latest_cost_date=latest_cost_date,
290
+ entry_count=len(entries),
291
+ )
292
+ )
293
+ return 0
294
+
295
+ totals = aggregate_costs(entries)
296
+ if not totals:
297
+ eprint("No model breakdowns found in codexbar cost payload.")
298
+ return 2
299
+
300
+ if args.format == "json":
301
+ payload_out = build_json_all(provider=args.provider, totals=totals)
302
+ indent = 2 if args.pretty else None
303
+ print(json.dumps(payload_out, indent=indent, sort_keys=args.pretty))
304
+ else:
305
+ print(render_text_all(provider=args.provider, totals=totals))
306
+ return 0
307
+
308
+
309
+ if __name__ == "__main__":
310
+ raise SystemExit(main())
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: nano-banana-pro
3
+ description: Generate or edit images via Gemini 3 Pro Image (Nano Banana Pro).
4
+ homepage: https://ai.google.dev/
5
+ metadata:
6
+ {
7
+ "otto":
8
+ {
9
+ "emoji": "🍌",
10
+ "requires": { "bins": ["uv"], "env": ["GEMINI_API_KEY"] },
11
+ "primaryEnv": "GEMINI_API_KEY",
12
+ "install":
13
+ [
14
+ {
15
+ "id": "uv-brew",
16
+ "kind": "brew",
17
+ "formula": "uv",
18
+ "bins": ["uv"],
19
+ "label": "Install uv (brew)",
20
+ },
21
+ ],
22
+ },
23
+ }
24
+ ---
25
+
26
+ # Nano Banana Pro (Gemini 3 Pro Image)
27
+
28
+ Use the bundled script to generate or edit images.
29
+
30
+ Generate
31
+
32
+ ```bash
33
+ uv run {baseDir}/scripts/generate_image.py --prompt "your image description" --filename "output.png" --resolution 1K
34
+ ```
35
+
36
+ Edit (single image)
37
+
38
+ ```bash
39
+ uv run {baseDir}/scripts/generate_image.py --prompt "edit instructions" --filename "output.png" -i "/path/in.png" --resolution 2K
40
+ ```
41
+
42
+ Multi-image composition (up to 14 images)
43
+
44
+ ```bash
45
+ uv run {baseDir}/scripts/generate_image.py --prompt "combine these into one scene" --filename "output.png" -i img1.png -i img2.png -i img3.png
46
+ ```
47
+
48
+ API key
49
+
50
+ - `GEMINI_API_KEY` env var
51
+ - Or set `skills."nano-banana-pro".apiKey` / `skills."nano-banana-pro".env.GEMINI_API_KEY` in `~/.otto/otto.json`
52
+
53
+ Notes
54
+
55
+ - Resolutions: `1K` (default), `2K`, `4K`.
56
+ - Use timestamps in filenames: `yyyy-mm-dd-hh-mm-ss-name.png`.
57
+ - The script prints a `MEDIA:` line for Otto to auto-attach on supported chat providers.
58
+ - Do not read the image back; report the saved path only.