pwn 0.5.708 → 0.5.710

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 (450) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/documentation/Installation.md +1 -0
  4. data/etc/default_skills/exploitdev/SKILL.md +38 -0
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  6. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  7. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  8. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  9. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  10. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  12. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  13. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  14. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +58 -0
  15. data/etc/default_skills/pwn/plugins/credential_attack/references/urls.md +3 -0
  16. data/etc/default_skills/pwn/plugins/exploit_db/SKILL.md +49 -0
  17. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +63 -0
  18. data/etc/default_skills/pwn/plugins/frida/SKILL.md +51 -0
  19. data/etc/default_skills/pwn/plugins/fuzz/SKILL.md +2 -0
  20. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +53 -0
  21. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  22. data/etc/default_skills/pwn/plugins/k8s/SKILL.md +51 -0
  23. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +50 -0
  24. data/etc/default_skills/pwn/plugins/preflight_checker/SKILL.md +59 -0
  25. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +53 -0
  26. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  27. data/etc/default_skills/pwn/plugins/recon/SKILL.md +57 -0
  28. data/etc/default_skills/pwn/plugins/recon/references/urls.md +6 -0
  29. data/etc/default_skills/pwn/plugins/semgrep/SKILL.md +48 -0
  30. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  31. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  32. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +49 -0
  33. data/lib/pwn/ai/agent/assembly.rb +4 -1
  34. data/lib/pwn/ai/agent/btc.rb +4 -1
  35. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  36. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  37. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  38. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  39. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  40. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  41. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  42. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  43. data/lib/pwn/ai/agent/learning.rb +142 -25
  44. data/lib/pwn/ai/agent/loop.rb +53 -46
  45. data/lib/pwn/ai/agent/metrics.rb +133 -23
  46. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  47. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  48. data/lib/pwn/ai/agent/policy.rb +158 -18
  49. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  50. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  51. data/lib/pwn/ai/agent/reflect.rb +9 -5
  52. data/lib/pwn/ai/agent/registry.rb +65 -12
  53. data/lib/pwn/ai/agent/result.rb +19 -10
  54. data/lib/pwn/ai/agent/reward.rb +150 -32
  55. data/lib/pwn/ai/agent/sast.rb +4 -1
  56. data/lib/pwn/ai/agent/swarm.rb +72 -36
  57. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  58. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  59. data/lib/pwn/ai/agent/tools/sessions.rb +8 -1
  60. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  61. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  62. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  63. data/lib/pwn/ai/agent.rb +4 -0
  64. data/lib/pwn/ai/anthropic.rb +41 -7
  65. data/lib/pwn/ai/gemini.rb +21 -11
  66. data/lib/pwn/ai/grok.rb +44 -6
  67. data/lib/pwn/ai/http_retry.rb +40 -12
  68. data/lib/pwn/ai/ollama.rb +19 -10
  69. data/lib/pwn/ai/open_ai.rb +81 -30
  70. data/lib/pwn/ai/open_web_ui.rb +20 -14
  71. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  72. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  73. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  74. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  75. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  76. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  77. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  78. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  79. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  80. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  81. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  82. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  83. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  84. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  85. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  86. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  87. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  88. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  89. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  90. data/lib/pwn/ai/red_team.rb +4 -0
  91. data/lib/pwn/ai.rb +4 -0
  92. data/lib/pwn/aws/acm.rb +5 -2
  93. data/lib/pwn/aws/api_gateway.rb +10 -7
  94. data/lib/pwn/aws/app_stream.rb +5 -2
  95. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  96. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  97. data/lib/pwn/aws/auto_scaling.rb +5 -2
  98. data/lib/pwn/aws/batch.rb +5 -2
  99. data/lib/pwn/aws/budgets.rb +5 -2
  100. data/lib/pwn/aws/cloud_formation.rb +5 -2
  101. data/lib/pwn/aws/cloud_front.rb +7 -4
  102. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  103. data/lib/pwn/aws/cloud_search.rb +5 -2
  104. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  105. data/lib/pwn/aws/cloud_trail.rb +5 -2
  106. data/lib/pwn/aws/cloud_watch.rb +5 -2
  107. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  108. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  109. data/lib/pwn/aws/code_build.rb +5 -2
  110. data/lib/pwn/aws/code_commit.rb +5 -2
  111. data/lib/pwn/aws/code_deploy.rb +5 -2
  112. data/lib/pwn/aws/code_pipeline.rb +5 -2
  113. data/lib/pwn/aws/cognito_identity.rb +5 -2
  114. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  115. data/lib/pwn/aws/cognito_sync.rb +5 -2
  116. data/lib/pwn/aws/config_service.rb +5 -2
  117. data/lib/pwn/aws/data_pipleline.rb +5 -2
  118. data/lib/pwn/aws/database_migration_service.rb +5 -2
  119. data/lib/pwn/aws/device_farm.rb +5 -2
  120. data/lib/pwn/aws/direct_connect.rb +5 -2
  121. data/lib/pwn/aws/directory_service.rb +5 -2
  122. data/lib/pwn/aws/dynamo_db.rb +5 -2
  123. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  124. data/lib/pwn/aws/ec2.rb +5 -2
  125. data/lib/pwn/aws/ecr.rb +5 -2
  126. data/lib/pwn/aws/ecs.rb +5 -2
  127. data/lib/pwn/aws/efs.rb +5 -2
  128. data/lib/pwn/aws/elasti_cache.rb +5 -2
  129. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  130. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  131. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  132. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  133. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  134. data/lib/pwn/aws/emr.rb +5 -2
  135. data/lib/pwn/aws/firehose.rb +5 -2
  136. data/lib/pwn/aws/game_lift.rb +5 -2
  137. data/lib/pwn/aws/glacier.rb +6 -3
  138. data/lib/pwn/aws/health.rb +5 -2
  139. data/lib/pwn/aws/iam.rb +10 -4
  140. data/lib/pwn/aws/import_export.rb +5 -2
  141. data/lib/pwn/aws/inspector.rb +5 -2
  142. data/lib/pwn/aws/iot.rb +5 -2
  143. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  144. data/lib/pwn/aws/kinesis.rb +5 -2
  145. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  146. data/lib/pwn/aws/kms.rb +5 -2
  147. data/lib/pwn/aws/lambda.rb +5 -2
  148. data/lib/pwn/aws/lambda_preview.rb +5 -2
  149. data/lib/pwn/aws/lex.rb +5 -2
  150. data/lib/pwn/aws/lightsail.rb +5 -2
  151. data/lib/pwn/aws/machine_learning.rb +5 -2
  152. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  153. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  154. data/lib/pwn/aws/ops_works.rb +5 -2
  155. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  156. data/lib/pwn/aws/pinpoint.rb +5 -2
  157. data/lib/pwn/aws/polly.rb +5 -2
  158. data/lib/pwn/aws/rds.rb +5 -2
  159. data/lib/pwn/aws/redshift.rb +5 -2
  160. data/lib/pwn/aws/rekognition.rb +5 -2
  161. data/lib/pwn/aws/route53.rb +5 -2
  162. data/lib/pwn/aws/route53_domains.rb +5 -2
  163. data/lib/pwn/aws/s3.rb +5 -2
  164. data/lib/pwn/aws/service_catalog.rb +5 -2
  165. data/lib/pwn/aws/ses.rb +5 -2
  166. data/lib/pwn/aws/shield.rb +5 -2
  167. data/lib/pwn/aws/simple_db.rb +5 -2
  168. data/lib/pwn/aws/sms.rb +5 -2
  169. data/lib/pwn/aws/snowball.rb +5 -2
  170. data/lib/pwn/aws/sns.rb +5 -2
  171. data/lib/pwn/aws/sqs.rb +5 -2
  172. data/lib/pwn/aws/ssm.rb +5 -2
  173. data/lib/pwn/aws/states.rb +5 -2
  174. data/lib/pwn/aws/storage_gateway.rb +5 -2
  175. data/lib/pwn/aws/sts.rb +4 -1
  176. data/lib/pwn/aws/support.rb +5 -2
  177. data/lib/pwn/aws/swf.rb +5 -2
  178. data/lib/pwn/aws/waf.rb +5 -2
  179. data/lib/pwn/aws/waf_regional.rb +5 -2
  180. data/lib/pwn/aws/workspaces.rb +5 -2
  181. data/lib/pwn/aws/x_ray.rb +5 -2
  182. data/lib/pwn/aws.rb +4 -0
  183. data/lib/pwn/banner/anon.rb +3 -0
  184. data/lib/pwn/banner/bubble.rb +3 -0
  185. data/lib/pwn/banner/cheshire.rb +3 -0
  186. data/lib/pwn/banner/code_cave.rb +3 -0
  187. data/lib/pwn/banner/dont_panic.rb +3 -0
  188. data/lib/pwn/banner/f_society.rb +3 -0
  189. data/lib/pwn/banner/fork_bomb.rb +3 -0
  190. data/lib/pwn/banner/jmp_esp.rb +3 -0
  191. data/lib/pwn/banner/matrix.rb +5 -1
  192. data/lib/pwn/banner/ninja.rb +3 -0
  193. data/lib/pwn/banner/off_the_air.rb +3 -0
  194. data/lib/pwn/banner/pirate.rb +3 -0
  195. data/lib/pwn/banner/radare2.rb +3 -0
  196. data/lib/pwn/banner/radare2_ai.rb +3 -0
  197. data/lib/pwn/banner/white_rabbit.rb +3 -0
  198. data/lib/pwn/banner.rb +6 -2
  199. data/lib/pwn/blockchain/btc.rb +8 -3
  200. data/lib/pwn/blockchain/eth.rb +10 -3
  201. data/lib/pwn/blockchain.rb +4 -0
  202. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  203. data/lib/pwn/bounty.rb +4 -0
  204. data/lib/pwn/config.rb +79 -13
  205. data/lib/pwn/cron.rb +297 -20
  206. data/lib/pwn/driver.rb +2 -18
  207. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  208. data/lib/pwn/ffi/fftw.rb +31 -6
  209. data/lib/pwn/ffi/hack_rf.rb +59 -8
  210. data/lib/pwn/ffi/liquid.rb +63 -10
  211. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  212. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  213. data/lib/pwn/ffi/stdio.rb +7 -8
  214. data/lib/pwn/ffi/volk.rb +36 -7
  215. data/lib/pwn/ffi.rb +12 -0
  216. data/lib/pwn/memory.rb +136 -16
  217. data/lib/pwn/memory_index.rb +34 -19
  218. data/lib/pwn/migrate.rb +34 -24
  219. data/lib/pwn/module_skills.rb +39 -8
  220. data/lib/pwn/plugins/aflplusplus.rb +72 -0
  221. data/lib/pwn/plugins/android.rb +71 -245
  222. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  223. data/lib/pwn/plugins/assembly.rb +9 -4
  224. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  225. data/lib/pwn/plugins/baresip.rb +59 -12
  226. data/lib/pwn/plugins/basic_auth.rb +9 -3
  227. data/lib/pwn/plugins/beef.rb +28 -18
  228. data/lib/pwn/plugins/binary_parser.rb +133 -0
  229. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  230. data/lib/pwn/plugins/burp_suite.rb +98 -68
  231. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  232. data/lib/pwn/plugins/char.rb +33 -3
  233. data/lib/pwn/plugins/credential_attack.rb +158 -0
  234. data/lib/pwn/plugins/credit_card.rb +6 -1
  235. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  236. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  237. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  238. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  239. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  240. data/lib/pwn/plugins/detect_os.rb +5 -0
  241. data/lib/pwn/plugins/ein.rb +3 -0
  242. data/lib/pwn/plugins/exploit_db.rb +69 -0
  243. data/lib/pwn/plugins/exploit_dev.rb +330 -0
  244. data/lib/pwn/plugins/file_fu.rb +11 -8
  245. data/lib/pwn/plugins/frida.rb +112 -0
  246. data/lib/pwn/plugins/fuzz.rb +42 -6
  247. data/lib/pwn/plugins/gdb.rb +115 -0
  248. data/lib/pwn/plugins/git.rb +19 -14
  249. data/lib/pwn/plugins/github.rb +38 -15
  250. data/lib/pwn/plugins/google_workspace.rb +188 -45
  251. data/lib/pwn/plugins/hacker_one.rb +159 -35
  252. data/lib/pwn/plugins/hunter.rb +6 -3
  253. data/lib/pwn/plugins/ip_info.rb +9 -4
  254. data/lib/pwn/plugins/irc.rb +28 -15
  255. data/lib/pwn/plugins/jenkins.rb +65 -57
  256. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  257. data/lib/pwn/plugins/jobs.rb +110 -0
  258. data/lib/pwn/plugins/json_pathify.rb +9 -5
  259. data/lib/pwn/plugins/k8s.rb +73 -0
  260. data/lib/pwn/plugins/log.rb +113 -13
  261. data/lib/pwn/plugins/mail_agent.rb +87 -79
  262. data/lib/pwn/plugins/metasploit.rb +11 -6
  263. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  264. data/lib/pwn/plugins/msr206.rb +42 -28
  265. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  266. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  267. data/lib/pwn/plugins/nmap_it.rb +14 -34
  268. data/lib/pwn/plugins/nuclei.rb +90 -0
  269. data/lib/pwn/plugins/oauth2.rb +11 -5
  270. data/lib/pwn/plugins/ocr.rb +3 -0
  271. data/lib/pwn/plugins/open_api.rb +5 -2
  272. data/lib/pwn/plugins/openvas.rb +33 -25
  273. data/lib/pwn/plugins/packet.rb +152 -31
  274. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  275. data/lib/pwn/plugins/pony.rb +86 -1
  276. data/lib/pwn/plugins/preflight_checker.rb +166 -0
  277. data/lib/pwn/plugins/process_tube.rb +139 -0
  278. data/lib/pwn/plugins/ps.rb +7 -1
  279. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  280. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  281. data/lib/pwn/plugins/radare2.rb +253 -0
  282. data/lib/pwn/plugins/recon.rb +196 -0
  283. data/lib/pwn/plugins/repl.rb +122 -1
  284. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  285. data/lib/pwn/plugins/semgrep.rb +61 -0
  286. data/lib/pwn/plugins/serial.rb +24 -14
  287. data/lib/pwn/plugins/shodan.rb +54 -35
  288. data/lib/pwn/plugins/slack_client.rb +11 -6
  289. data/lib/pwn/plugins/sock.rb +17 -8
  290. data/lib/pwn/plugins/spider.rb +5 -2
  291. data/lib/pwn/plugins/sqlmap.rb +49 -0
  292. data/lib/pwn/plugins/ssn.rb +3 -0
  293. data/lib/pwn/plugins/thread_pool.rb +6 -9
  294. data/lib/pwn/plugins/tor.rb +9 -4
  295. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  296. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  297. data/lib/pwn/plugins/twitter_api.rb +6 -2
  298. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  299. data/lib/pwn/plugins/vault.rb +12 -3
  300. data/lib/pwn/plugins/vin.rb +24 -12
  301. data/lib/pwn/plugins/voice.rb +7 -2
  302. data/lib/pwn/plugins/volatility.rb +67 -0
  303. data/lib/pwn/plugins/vsphere.rb +9 -5
  304. data/lib/pwn/plugins/xxd.rb +12 -43
  305. data/lib/pwn/plugins/zaproxy.rb +30 -16
  306. data/lib/pwn/plugins.rb +22 -0
  307. data/lib/pwn/reports/ai_red_team.rb +6 -2
  308. data/lib/pwn/reports/csv.rb +8 -1
  309. data/lib/pwn/reports/fuzz.rb +5 -2
  310. data/lib/pwn/reports/html.rb +8 -1
  311. data/lib/pwn/reports/html_footer.rb +4 -3
  312. data/lib/pwn/reports/html_header.rb +6 -2
  313. data/lib/pwn/reports/json.rb +8 -1
  314. data/lib/pwn/reports/markdown.rb +8 -1
  315. data/lib/pwn/reports/pdf.rb +8 -1
  316. data/lib/pwn/reports/phone.rb +5 -2
  317. data/lib/pwn/reports/sast.rb +6 -2
  318. data/lib/pwn/reports/uri_buster.rb +5 -2
  319. data/lib/pwn/reports/xml.rb +8 -1
  320. data/lib/pwn/reports.rb +19 -0
  321. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  322. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  323. data/lib/pwn/sast/aws.rb +9 -3
  324. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  325. data/lib/pwn/sast/base64.rb +9 -3
  326. data/lib/pwn/sast/beef_hook.rb +9 -3
  327. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  328. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  329. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  330. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  331. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  332. data/lib/pwn/sast/csrf.rb +9 -3
  333. data/lib/pwn/sast/deserial_java.rb +9 -3
  334. data/lib/pwn/sast/emoticon.rb +9 -3
  335. data/lib/pwn/sast/eval.rb +9 -3
  336. data/lib/pwn/sast/factory.rb +9 -3
  337. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  338. data/lib/pwn/sast/inner_html.rb +9 -3
  339. data/lib/pwn/sast/keystore.rb +9 -3
  340. data/lib/pwn/sast/local_storage.rb +9 -3
  341. data/lib/pwn/sast/location_hash.rb +9 -3
  342. data/lib/pwn/sast/log4j.rb +9 -3
  343. data/lib/pwn/sast/logger.rb +9 -3
  344. data/lib/pwn/sast/md5.rb +9 -3
  345. data/lib/pwn/sast/outer_html.rb +9 -3
  346. data/lib/pwn/sast/padding_oracle.rb +9 -3
  347. data/lib/pwn/sast/password.rb +9 -3
  348. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  349. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  350. data/lib/pwn/sast/pom_version.rb +9 -3
  351. data/lib/pwn/sast/port.rb +9 -3
  352. data/lib/pwn/sast/post_message.rb +9 -3
  353. data/lib/pwn/sast/private_key.rb +9 -3
  354. data/lib/pwn/sast/redirect.rb +9 -3
  355. data/lib/pwn/sast/redos.rb +9 -3
  356. data/lib/pwn/sast/shell.rb +9 -3
  357. data/lib/pwn/sast/signature.rb +9 -3
  358. data/lib/pwn/sast/sql.rb +9 -3
  359. data/lib/pwn/sast/ssl.rb +9 -3
  360. data/lib/pwn/sast/sudo.rb +9 -3
  361. data/lib/pwn/sast/task_tag.rb +9 -3
  362. data/lib/pwn/sast/test_case_engine.rb +11 -7
  363. data/lib/pwn/sast/throw_errors.rb +9 -3
  364. data/lib/pwn/sast/token.rb +9 -3
  365. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  366. data/lib/pwn/sast/use_after_free.rb +9 -3
  367. data/lib/pwn/sast/version.rb +9 -3
  368. data/lib/pwn/sast/window_location_hash.rb +9 -3
  369. data/lib/pwn/sast.rb +4 -0
  370. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  371. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  372. data/lib/pwn/sdr/decoder/base.rb +74 -22
  373. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  374. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  375. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  376. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  377. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  378. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  379. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  380. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  381. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  382. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  383. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  384. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  385. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  386. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  387. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  388. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  389. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  390. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  391. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  392. data/lib/pwn/sdr/decoder.rb +9 -0
  393. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  394. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  395. data/lib/pwn/sdr/gqrx.rb +178 -119
  396. data/lib/pwn/sdr/rfidler.rb +4 -1
  397. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  398. data/lib/pwn/sdr.rb +14 -0
  399. data/lib/pwn/sessions.rb +86 -16
  400. data/lib/pwn/setup.rb +106 -37
  401. data/lib/pwn/version.rb +1 -1
  402. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  403. data/lib/pwn/www/bing.rb +10 -5
  404. data/lib/pwn/www/bug_crowd.rb +11 -5
  405. data/lib/pwn/www/checkip.rb +8 -4
  406. data/lib/pwn/www/coinbase_pro.rb +11 -5
  407. data/lib/pwn/www/duckduckgo.rb +12 -6
  408. data/lib/pwn/www/facebook.rb +11 -5
  409. data/lib/pwn/www/github.rb +11 -5
  410. data/lib/pwn/www/google.rb +11 -5
  411. data/lib/pwn/www/hacker_one.rb +20 -9
  412. data/lib/pwn/www/linkedin.rb +11 -5
  413. data/lib/pwn/www/pandora.rb +11 -5
  414. data/lib/pwn/www/pastebin.rb +9 -4
  415. data/lib/pwn/www/paypal.rb +19 -11
  416. data/lib/pwn/www/synack.rb +11 -5
  417. data/lib/pwn/www/torch.rb +13 -8
  418. data/lib/pwn/www/trading_view.rb +11 -5
  419. data/lib/pwn/www/twitter.rb +11 -5
  420. data/lib/pwn/www/uber.rb +11 -5
  421. data/lib/pwn/www/upwork.rb +11 -5
  422. data/lib/pwn/www/wayback_machine.rb +12 -6
  423. data/lib/pwn/www/youtube.rb +10 -5
  424. data/lib/pwn/www.rb +4 -0
  425. data/spec/conventions_spec.rb +118 -2
  426. data/spec/integration/help_contract_spec.rb +2 -0
  427. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  428. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  429. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  431. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  432. data/spec/lib/pwn/plugins/exploit_db_spec.rb +13 -0
  433. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  434. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  435. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  436. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  437. data/spec/lib/pwn/plugins/k8s_spec.rb +13 -0
  438. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  439. data/spec/lib/pwn/plugins/preflight_checker_spec.rb +23 -0
  440. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  441. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  442. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  443. data/spec/lib/pwn/plugins/semgrep_spec.rb +13 -0
  444. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  445. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  446. data/spec/lib/pwn/req_queue_spec.rb +168 -0
  447. data/third_party/pwn_rdoc.jsonl +160 -5
  448. metadata +63 -7
  449. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  450. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -626,38 +626,90 @@ module PWN
626
626
  # Display Usage for this Module
627
627
 
628
628
  public_class_method def self.help
629
- puts "USAGE (100 % ruby-native — no external binaries):
629
+ puts "USAGE:
630
+ # Run run native and return its result
630
631
  #{self}.run_native(
631
- freq_obj: 'required - freq_obj from PWN::SDR::GQRX.init_freq',
632
- protocol: 'required - short protocol name',
633
- demod: 'required - object with #feed(samples,&emit)',
634
- rate: 'optional - UDP sample rate (default 48000)'
632
+ freq_obj: 'required - freq_obj Hash from PWN::SDR::GQRX.init_freq',
633
+ protocol: 'required - short name for banner / log filename (defaults to SIGNAL)',
634
+ demod: 'required - object responding to #feed(samples,&emit)',
635
+ rate: 'optional - assumed UDP sample rate (default 48000)'
635
636
  )
636
637
 
637
- #{self}.run_iq(
638
- freq_obj: 'required - freq_obj Hash',
639
- protocol: 'required - short protocol name',
640
- demod: 'required - #feed_iq(iq, rate:, &emit) or #feed',
641
- sample_rate: 'optional - Hz (default 2_048_000)',
642
- source: 'optional - :auto|:rtlsdr|:hackrf|:adalm_pluto|:soapy|:file',
643
- file: 'optional - .cu8/.cs16 capture path',
644
- fm_demod: 'optional - FM-demod then #feed (default false)',
645
- fallback: 'optional - :detector|:raise|:silent (default :detector)'
638
+ # Run run detector and return its result
639
+ #{self}.run_detector(
640
+ freq_obj: 'required - freq_obj Hash from PWN::SDR::GQRX.init_freq',
641
+ protocol: 'required - short name for banner / log filename (defaults to SIGNAL)',
642
+ note: 'optional - one-line explanation shown once',
643
+ threshold: 'optional - dBFS above rolling floor to call a burst (default 8.0)',
644
+ describe: 'optional - Proc.new { |burst_hash| Hash } extra fields'
646
645
  )
647
646
 
648
- #{self}.run_detector(
649
- freq_obj: 'required - freq_obj from PWN::SDR::GQRX.init_freq',
650
- protocol: 'required - short protocol name',
651
- note: 'optional - explanation shown to operator',
652
- threshold: 'optional - dB above floor for burst (default 8.0)',
653
- describe: 'optional - Proc { |burst| Hash } extra fields'
647
+ # Run match line and return its result
648
+ #{self}.match_line?(
649
+ line: 'optional - line value consumed by #match_line?',
650
+ matcher: 'optional - matcher value consumed by #match_line?'
651
+ )
652
+
653
+ # Run resolve iq source and return its result
654
+ #{self}.resolve_iq_source(
655
+ freq_obj: 'required - freq obj value consumed by #resolve_iq_source',
656
+ source: 'optional - :auto|:rtlsdr|:hackrf|:adalm_pluto|:soapy|:file',
657
+ sample_rate: 'optional - desired rate Hz',
658
+ file: 'optional - path to .cu8/.cs16/.iq capture (defaults to freq_obj[:iq_file])',
659
+ iq_format: 'optional - iq format value consumed by #resolve_iq_source (defaults to freq_obj[:iq_format])',
660
+ index: 'optional - index value consumed by #resolve_iq_source',
661
+ gain_db: 'optional - gain db value consumed by #resolve_iq_source (defaults to freq_obj[:gain_db])',
662
+ ppm: 'optional - ppm value consumed by #resolve_iq_source',
663
+ serial: 'optional - serial value consumed by #resolve_iq_source',
664
+ lna_gain: 'optional - lna gain value consumed by #resolve_iq_source (defaults to 16)',
665
+ vga_gain: 'optional - vga gain value consumed by #resolve_iq_source (defaults to 20)',
666
+ amp: 'optional - amp value consumed by #resolve_iq_source',
667
+ uri: 'optional - URI or URL string',
668
+ chunk_samples: 'optional - chunk samples value consumed by #resolve_iq_source',
669
+ soapy_args: 'optional - soapy args value consumed by #resolve_iq_source (defaults to freq_obj[:soapy_args])',
670
+ channel: 'optional - channel value consumed by #resolve_iq_source (defaults to 0)'
671
+ )
672
+
673
+ # Run read iq chunk and return its result
674
+ #{self}.read_iq_chunk(
675
+ source: 'required - source value consumed by #read_iq_chunk',
676
+ bytes: 'optional - bytes value consumed by #read_iq_chunk'
654
677
  )
655
678
 
656
- #{self}.resolve_iq_source(freq_obj:, source: :auto, sample_rate:, file:)
657
- #{self}.match_line?(line: str, matcher: Regexp|String|Array)
679
+ # Run unpack iq and return its result
680
+ #{self}.unpack_iq(
681
+ source: 'optional - source value consumed by #unpack_iq',
682
+ data: 'optional - data value consumed by #unpack_iq'
683
+ )
684
+
685
+ # Run close iq source and return its result
686
+ #{self}.close_iq_source(
687
+ source: 'optional - source value consumed by #close_iq_source'
688
+ )
689
+
690
+ # OR #feed(samples, &emit) when fm_demod:true,
691
+ #{self}.run_iq(
692
+ freq_obj: 'required - freq_obj Hash',
693
+ protocol: 'required - short name (defaults to SIGNAL)',
694
+ demod: 'required - object with #feed_iq(iq, rate:, &emit',
695
+ sample_rate: 'optional - Hz (default 2_048_000)',
696
+ source: 'optional - :auto|:rtlsdr|:hackrf|:adalm_pluto|:soapy|:file',
697
+ file: 'optional - path to capture',
698
+ fm_demod: 'optional - FM-demod I/Q→audio then #feed (default false)',
699
+ chunk_bytes: 'optional - bytes per read (default 262144)',
700
+ fallback: 'optional - :detector|:raise|:silent (default :detector)',
701
+ note: 'optional - shown once when falling back',
702
+ describe: 'optional - Proc for detector fallback',
703
+ gain_db: 'optional - gain db value consumed by #run_iq',
704
+ uri: 'optional - URI or URL string',
705
+ index: 'optional - index value consumed by #run_iq',
706
+ threshold: 'optional - threshold value consumed by #run_iq'
707
+ )
658
708
 
709
+ # Print the AUTHOR(S) string for this module.
659
710
  #{self}.authors
660
711
  "
712
+ constants.sort
661
713
  end
662
714
  end
663
715
  end
@@ -191,18 +191,30 @@ module PWN
191
191
  end
192
192
 
193
193
  public_class_method def self.help
194
- puts "USAGE (true-air I/Q via PWN::FFI + detector fallback):
194
+ puts "USAGE:
195
+ # Run ble crc24 and return its result
196
+ #{self}.ble_crc24(
197
+ bytes: 'optional - bytes value consumed by #ble_crc24 (defaults to [])'
198
+ )
199
+
200
+ # Run decode and return its result
195
201
  #{self}.decode(
196
202
  freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq',
197
- source: 'optional - :auto|:rtlsdr|:adalm_pluto|:file',
198
- file: 'optional - .cu8/.cs16 capture (≥2 Msps)',
199
- channel: 'optional - BLE adv channel 37|38|39 (default nearest to freq)'
203
+ channel: 'optional - channel value consumed by #decode',
204
+ sample_rate: 'optional - sample rate value consumed by #decode',
205
+ source: 'optional - source value consumed by #decode',
206
+ file: 'optional - filesystem path'
200
207
  )
201
208
 
202
- #{self}.ble_crc24(bytes: [..])
209
+ # Run parse line and return its result
210
+ #{self}.parse_line(
211
+ line: 'optional - line value consumed by #parse_line'
212
+ )
203
213
 
214
+ # Print the AUTHOR(S) string for this module.
204
215
  #{self}.authors
205
216
  "
217
+ constants.sort
206
218
  end
207
219
  end
208
220
  end
@@ -138,15 +138,24 @@ module PWN
138
138
  end
139
139
 
140
140
  public_class_method def self.help
141
- puts "USAGE (true-air I/Q via PWN::FFI + detector fallback):
141
+ puts "USAGE:
142
+ # Run decode and return its result
142
143
  #{self}.decode(
143
144
  freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq',
144
- source: 'optional - :auto|:rtlsdr|:adalm_pluto|:file',
145
- file: 'optional - .cu8/.cs16 capture (≥2.304 Msps)'
145
+ sample_rate: 'optional - sample rate value consumed by #decode',
146
+ source: 'optional - source value consumed by #decode',
147
+ file: 'optional - filesystem path'
146
148
  )
147
149
 
150
+ # Run parse line and return its result
151
+ #{self}.parse_line(
152
+ line: 'optional - line value consumed by #parse_line'
153
+ )
154
+
155
+ # Print the AUTHOR(S) string for this module.
148
156
  #{self}.authors
149
157
  "
158
+ constants.sort
150
159
  end
151
160
  end
152
161
  end
@@ -1005,47 +1005,237 @@ module PWN
1005
1005
  # Display Usage for this Module
1006
1006
 
1007
1007
  public_class_method def self.help
1008
- puts "USAGE (pure-Ruby DSP + optional PWN::FFI acceleration):
1009
- #{self}.native = true|false # toggle VOLK/liquid/FFTW backends
1010
- #{self}.unpack_s16le(data: raw_bytes) # → Volk
1011
- #{self}.unpack_cs16le(data: raw_cs16) # I/Q s16 f32
1012
- #{self}.unpack_cu8(data: raw_u8) # RTL-SDR u8 I/Q
1013
- #{self}.mag_sq(iq:) / #{self}.iq_rms_dbfs(iq:)
1014
- #{self}.fm_demod_iq(iq:, kf: 1.0) # Liquid
1015
- #{self}.correlate(samples:, template:)
1016
- #{self}.resample(samples:, src_rate:, dst_rate:) # Liquid
1017
- #{self}.goertzel(samples:, rate:, freq:)
1018
- #{self}.envelope(samples:, window: 32)
1019
- #{self}.envelope_signed(samples:, window: 8)
1020
- #{self}.dc_block(samples:, alpha: 0.995, m: nil) # → Liquid if m:
1021
- #{self}.nrz_slice(samples:, rate:, baud:, invert: false)
1022
- #{self}.fsk_slice(samples:, rate:, baud:, mark_hz:, space_hz:)
1023
- #{self}.find_sync(bits:, pattern:, width:, max_err: 0, from: 0)
1024
- #{self}.bits_to_int(bits:)
1025
- #{self}.even_parity_ok?(word:, width: 32)
1026
- #{self}.bch_31_21_syndrome(word:)
1027
- #{self}.baudot_decode(bits:)
1028
- #{self}.rms_dbfs(samples:) # Volk (≥64)
1029
- #{self}.resample_iq(iq:, src_rate:, dst_rate:) # → Liquid crcf
1030
- #{self}.mix_iq(iq:, rate:, freq:) # Liquid nco
1031
- #{self}.gfsk_slice(iq:, rate:, baud:, bt: 0.35) # Liquid gmskdem
1032
- #{self}.slice_4fsk(samples:, rate:, baud:) # C4FM/4-GFSK
1033
- #{self}.manchester_decode(bits:, ieee: false)
1034
- #{self}.diff_decode(bits:)
1035
- #{self}.bytes_from_bits(bits:, lsb_first: false)
1036
- #{self}.crc16(bytes:, poly: 0x1021, init: 0xFFFF)
1037
- #{self}.whiten_lfsr(bytes:, poly:, init:, width: 7)
1038
- #{self}.ook_pulses(iq:, rate:, min_us: 20)
1039
- #{self}.cfft_mag(iq:, n:, shift: true) # FFTW
1040
- #{self}.cmul(a:, b:, conj_b: false)
1041
- #{self}.zadoff_chu(root:, n: 63) # LTE PSS
1042
- #{self}.ca_code(prn: 1..32) # GPS L1 C/A
1043
-
1044
- Constants: MORSE_TABLE, BAUDOT_LTRS, BAUDOT_FIGS
1045
- Backends: PWN::FFI.backends # { Volk: true, Liquid: true, AdalmPluto: true, … }
1046
-
1008
+ puts "USAGE:
1009
+ # Run unpack s16le and return its result
1010
+ #{self}.unpack_s16le(
1011
+ data: 'required - raw String of little-endian signed 16-bit PCM'
1012
+ )
1013
+
1014
+ # Run resample and return its result
1015
+ #{self}.resample(
1016
+ samples: 'required - samples value consumed by #resample',
1017
+ src_rate: 'required - input sample rate (Hz)',
1018
+ dst_rate: 'required - output sample rate (Hz)'
1019
+ )
1020
+
1021
+ # Run goertzel and return its result
1022
+ #{self}.goertzel(
1023
+ samples: 'required - samples value consumed by #goertzel',
1024
+ rate: 'required - sample rate (Hz)',
1025
+ freq: 'required - target tone frequency (Hz)'
1026
+ )
1027
+
1028
+ # Run envelope and return its result
1029
+ #{self}.envelope(
1030
+ samples: 'required - samples value consumed by #envelope',
1031
+ window: 'optional - moving-average window in samples (default 32)'
1032
+ )
1033
+
1034
+ # Run dc block and return its result
1035
+ #{self}.dc_block(
1036
+ samples: 'required - samples value consumed by #dc_block',
1037
+ alpha: 'optional - pole (default 0.995)',
1038
+ m: 'optional - m value consumed by #dc_block',
1039
+ as_db: 'optional - as db value consumed by #dc_block (defaults to 60.0)'
1040
+ )
1041
+
1042
+ # Run nrz slice and return its result
1043
+ #{self}.nrz_slice(
1044
+ samples: 'required - Array<Float> (post-FM-discriminator baseband)',
1045
+ rate: 'required - sample rate (Hz)',
1046
+ baud: 'required - symbol rate',
1047
+ invert: 'optional - flip bit polarity (default false)'
1048
+ )
1049
+
1050
+ # Signed moving average (like envelope but keeps sign)
1051
+ #{self}.envelope_signed(
1052
+ samples: 'optional - samples value consumed by #envelope_signed',
1053
+ window: 'optional - window value consumed by #envelope_signed'
1054
+ )
1055
+
1056
+ # Run fsk slice and return its result
1057
+ #{self}.fsk_slice(
1058
+ samples: 'required - samples value consumed by #fsk_slice',
1059
+ rate: 'required - sample rate (Hz)',
1060
+ baud: 'required - symbol rate',
1061
+ mark_hz: 'required - mark tone (bit=1)',
1062
+ space_hz: 'required - space tone (bit=0)'
1063
+ )
1064
+
1065
+ # Run find sync and return its result
1066
+ #{self}.find_sync(
1067
+ bits: 'required - bits value consumed by #find_sync',
1068
+ pattern: 'required - Array<0|1> or Integer (MSB-first)',
1069
+ width: 'optional - bit-width when pattern is Integer',
1070
+ max_err: 'optional - allowed bit errors (default 0)',
1071
+ from: 'optional - start index (default 0)'
1072
+ )
1073
+
1074
+ # Run bits to int and return its result
1075
+ #{self}.bits_to_int(
1076
+ bits: 'optional - bits value consumed by #bits_to_int'
1077
+ )
1078
+
1079
+ # Run even parity ok and return its result
1080
+ #{self}.even_parity_ok?(
1081
+ word: 'optional - word value consumed by #even_parity_ok?',
1082
+ width: 'optional - cyclic de Bruijn sequence width in bytes'
1083
+ )
1084
+
1085
+ # BCH(31,21) syndrome — generator poly 0b11101101001 (0x769)
1086
+ #{self}.bch_31_21_syndrome(
1087
+ word: 'optional - word value consumed by #bch_31_21_syndrome'
1088
+ )
1089
+
1090
+ # Run baudot decode and return its result
1091
+ #{self}.baudot_decode(
1092
+ bits: 'optional - bits value consumed by #baudot_decode'
1093
+ )
1094
+
1095
+ # Run rms dbfs and return its result
1096
+ #{self}.rms_dbfs(
1097
+ samples: 'required - samples value consumed by #rms_dbfs'
1098
+ )
1099
+
1100
+ # ── True-air I/Q primitives (used by Base.run_iq) ─────────────────
1101
+ #{self}.unpack_cs16le(
1102
+ data: 'required - raw String of interleaved little-endian s16 I/Q'
1103
+ )
1104
+
1105
+ # Run unpack cu8 and return its result
1106
+ #{self}.unpack_cu8(
1107
+ data: 'required - raw String of interleaved u8 I/Q (RTL-SDR)'
1108
+ )
1109
+
1110
+ # Run mag sq and return its result
1111
+ #{self}.mag_sq(
1112
+ iq: 'required - interleaved Array<Float> [I0,Q0,I1,Q1,…]'
1113
+ )
1114
+
1115
+ # Run fm demod iq and return its result
1116
+ #{self}.fm_demod_iq(
1117
+ iq: 'required - interleaved Array<Float> [I0,Q0,…]',
1118
+ kf: 'optional - modulation index scale (default 1.0)'
1119
+ )
1120
+
1121
+ # Run iq rms dbfs and return its result
1122
+ #{self}.iq_rms_dbfs(
1123
+ iq: 'required - interleaved Array<Float> [I0,Q0,…]'
1124
+ )
1125
+
1126
+ # Correlate a real template against magnitude-squared energy for
1127
+ #{self}.correlate(
1128
+ samples: 'required - samples value consumed by #correlate',
1129
+ template: 'required - Array<Float> (same units)'
1130
+ )
1131
+
1132
+ # ── True-air I/Q chain (all Decoder::* modules) ──────────────────
1133
+ #{self}.resample_iq(
1134
+ iq: 'required - interleaved [I0,Q0,…] Array<Float>',
1135
+ src_rate: 'required - Hz, dst_rate: required - Hz',
1136
+ dst_rate: 'optional - dst rate value consumed by #resample_iq'
1137
+ )
1138
+
1139
+ # Run mix iq and return its result
1140
+ #{self}.mix_iq(
1141
+ iq: 'required - interleaved I/Q, rate: required - Hz',
1142
+ freq: 'required - offset Hz to shift DOWN by',
1143
+ rate: 'optional - rate value consumed by #mix_iq'
1144
+ )
1145
+
1146
+ # Run gfsk slice and return its result
1147
+ #{self}.gfsk_slice(
1148
+ iq: 'required - interleaved I/Q, rate:, baud:',
1149
+ bt: 'optional - Gaussian BT (default 0.35), invert: false',
1150
+ rate: 'optional - rate value consumed by #gfsk_slice',
1151
+ baud: 'optional - baud value consumed by #gfsk_slice',
1152
+ invert: 'optional - invert value consumed by #gfsk_slice'
1153
+ )
1154
+
1155
+ # Run slice 4fsk and return its result
1156
+ #{self}.slice_4fsk(
1157
+ samples: 'required - real FM-discriminator baseband',
1158
+ rate: 'optional - rate value consumed by #slice_4fsk',
1159
+ baud: 'optional - baud value consumed by #slice_4fsk'
1160
+ )
1161
+
1162
+ # Run manchester decode and return its result
1163
+ #{self}.manchester_decode(
1164
+ bits: 'required - Array<0|1> at 2×data rate',
1165
+ ieee: 'optional - true = 01→1 10→0 (IEEE 802.3), else 10→1 01→0'
1166
+ )
1167
+
1168
+ # Run diff decode and return its result
1169
+ #{self}.diff_decode(
1170
+ bits: 'optional - bits value consumed by #diff_decode'
1171
+ )
1172
+
1173
+ # Run bytes from bits and return its result
1174
+ #{self}.bytes_from_bits(
1175
+ bits: 'optional - Array<0|1>, lsb_first: false',
1176
+ lsb_first: 'optional - lsb first value consumed by #bytes_from_bits'
1177
+ )
1178
+
1179
+ # Run crc16 and return its result
1180
+ #{self}.crc16(
1181
+ bytes: 'optional - Array<Integer>, poly: 0x1021, init: 0xFFFF',
1182
+ refin: 'optional - false, refout: false, xorout: 0x0000',
1183
+ poly: 'optional - poly value consumed by #crc16',
1184
+ init: 'optional - init value consumed by #crc16',
1185
+ refout: 'optional - refout value consumed by #crc16',
1186
+ xorout: 'optional - xorout value consumed by #crc16'
1187
+ )
1188
+
1189
+ # Run whiten lfsr and return its result
1190
+ #{self}.whiten_lfsr(
1191
+ bytes: 'optional - Array<Integer>, poly: Integer, init: Integer, width: 7',
1192
+ poly: 'optional - poly value consumed by #whiten_lfsr',
1193
+ init: 'optional - init value consumed by #whiten_lfsr',
1194
+ width: 'optional - cyclic de Bruijn sequence width in bytes'
1195
+ )
1196
+
1197
+ # Run ook pulses and return its result
1198
+ #{self}.ook_pulses(
1199
+ iq: 'required - interleaved I/Q, rate:',
1200
+ min_us: 'optional - drop shorter pulses (default 20)',
1201
+ rate: 'optional - rate value consumed by #ook_pulses'
1202
+ )
1203
+
1204
+ # Run cfft mag and return its result
1205
+ #{self}.cfft_mag(
1206
+ iq: 'required - interleaved I/Q, n: optional - FFT size',
1207
+ shift: 'optional - fftshift so DC is centred (default true)',
1208
+ n: 'optional - count, width, or size'
1209
+ )
1210
+
1211
+ # Naive O(n²) complex DFT — pure-Ruby fallback for small n
1212
+ #{self}.dft_naive(
1213
+ iq: 'optional - iq value consumed by #dft_naive',
1214
+ n: 'optional - count, width, or size'
1215
+ )
1216
+
1217
+ # Run zadoff chu and return its result
1218
+ #{self}.zadoff_chu(
1219
+ root: 'optional - root value consumed by #zadoff_chu',
1220
+ n: 'optional - count, width, or size'
1221
+ )
1222
+
1223
+ # Run ca code and return its result
1224
+ #{self}.ca_code(
1225
+ prn: 'required - prn value consumed by #ca_code'
1226
+ )
1227
+
1228
+ # Run cmul and return its result
1229
+ #{self}.cmul(
1230
+ a: 'optional - a value consumed by #cmul',
1231
+ b: 'optional - b value consumed by #cmul',
1232
+ conj_b: 'optional - conj b value consumed by #cmul'
1233
+ )
1234
+
1235
+ # Print the AUTHOR(S) string for this module.
1047
1236
  #{self}.authors
1048
1237
  "
1238
+ constants.sort
1049
1239
  end
1050
1240
  end
1051
1241
  end
@@ -473,24 +473,72 @@ module PWN
473
473
  # Display Usage for this Module
474
474
 
475
475
  public_class_method def self.help
476
- puts "USAGE (true-air I/Q + GQRX-audio native paths, no external binaries):
477
- #{self}.decode(
478
- freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'
476
+ puts "USAGE:
477
+ # Run sync check and return its result
478
+ #{self}.sync_check(
479
+ buf: 'optional - buf value consumed by #sync_check'
479
480
  )
480
481
 
481
- demod = #{self}::Demod.new(rate: 48_000)
482
- demod.feed(samples) { |msg| puts msg[:summary] }
482
+ # Run popcnt and return its result
483
+ #{self}.popcnt(
484
+ val: 'optional - val value consumed by #popcnt'
485
+ )
483
486
 
484
- #{self}.bch_fix(word: Integer) # [fixed, nerr]
485
- #{self}.alpha_decode(words:, mw1:, mw2:)
486
- #{self}.numeric_decode(words:, mw1:, mw2:)
487
+ # Run even parity and return its result
488
+ #{self}.even_parity?(
489
+ word: 'optional - word value consumed by #even_parity?'
490
+ )
491
+
492
+ # Run bch syn and return its result
493
+ #{self}.bch_syn(
494
+ word: 'optional - word value consumed by #bch_syn'
495
+ )
496
+
497
+ # Run bch fix and return its result
498
+ #{self}.bch_fix(
499
+ word: 'optional - word value consumed by #bch_fix'
500
+ )
501
+
502
+ # ) { |msg| ... }
503
+ #{self}.emit_phase(
504
+ words: 'optional - phase:, cycle:, frame:, mode:, sync_cw: (defaults to [])',
505
+ phase: 'optional - phase value consumed by #emit_phase',
506
+ cycle: 'optional - cycle value consumed by #emit_phase',
507
+ frame: 'optional - frame value consumed by #emit_phase',
508
+ mode: 'optional - mode value consumed by #emit_phase'
509
+ )
487
510
 
488
- NOTE: Set GQRX to Narrow FM (~15-20 kHz). All four FLEX modes
489
- (1600/2, 1600/4, 3200/2, 3200/4 sym-rate/levels) are
490
- fully decoded across every active phase (A/B/C/D).
511
+ # Run alpha decode and return its result
512
+ #{self}.alpha_decode(
513
+ words: 'optional - words value consumed by #alpha_decode (defaults to [])',
514
+ mw1: 'optional - mw1 value consumed by #alpha_decode',
515
+ mw2: 'optional - mw2 value consumed by #alpha_decode'
516
+ )
517
+
518
+ # Run numeric decode and return its result
519
+ #{self}.numeric_decode(
520
+ words: 'optional - words value consumed by #numeric_decode (defaults to [])',
521
+ mw1: 'optional - mw1 value consumed by #numeric_decode',
522
+ mw2: 'optional - mw2 value consumed by #numeric_decode'
523
+ )
524
+
525
+ # Run hex decode and return its result
526
+ #{self}.hex_decode(
527
+ words: 'optional - words value consumed by #hex_decode (defaults to [])'
528
+ )
529
+
530
+ # Run decode and return its result
531
+ #{self}.decode(
532
+ freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq',
533
+ source: 'optional - source value consumed by #decode',
534
+ file: 'optional - filesystem path',
535
+ sample_rate: 'optional - sample rate value consumed by #decode'
536
+ )
491
537
 
538
+ # Print the AUTHOR(S) string for this module.
492
539
  #{self}.authors
493
540
  "
541
+ constants.sort
494
542
  end
495
543
  end
496
544
  end
@@ -140,15 +140,24 @@ module PWN
140
140
  end
141
141
 
142
142
  public_class_method def self.help
143
- puts "USAGE (true-air I/Q via PWN::FFI + detector fallback):
143
+ puts "USAGE:
144
+ # Run decode and return its result
144
145
  #{self}.decode(
145
146
  freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq',
146
- source: 'optional - :auto|:rtlsdr|:adalm_pluto|:file',
147
- file: 'optional - .cu8/.cs16 capture (≥2.048 Msps)'
147
+ sample_rate: 'optional - sample rate value consumed by #decode',
148
+ source: 'optional - source value consumed by #decode',
149
+ file: 'optional - filesystem path'
148
150
  )
149
151
 
152
+ # Run parse line and return its result
153
+ #{self}.parse_line(
154
+ line: 'optional - line value consumed by #parse_line'
155
+ )
156
+
157
+ # Print the AUTHOR(S) string for this module.
150
158
  #{self}.authors
151
159
  "
160
+ constants.sort
152
161
  end
153
162
  end
154
163
  end
@@ -229,17 +229,37 @@ module PWN
229
229
  end
230
230
 
231
231
  public_class_method def self.help
232
- puts "USAGE (true-air I/Q via PWN::FFI + detector fallback):
232
+ puts "USAGE:
233
+ # Run viterbi decode and return its result
234
+ #{self}.viterbi_decode(
235
+ bits: 'required - Array<0|1> soft/hard coded bits (rate-1/2)',
236
+ k: 'optional - 5, g0: 0o23, g1: 0o33',
237
+ g0: 'optional - g0 value consumed by #viterbi_decode',
238
+ g1: 'optional - g1 value consumed by #viterbi_decode'
239
+ )
240
+
241
+ # Run parity and return its result
242
+ #{self}.parity(
243
+ parity: 'optional - parity value consumed by #parity'
244
+ )
245
+
246
+ # Run decode and return its result
233
247
  #{self}.decode(
234
248
  freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq',
235
- source: 'optional - :auto|:rtlsdr|:adalm_pluto|:file',
236
- file: 'optional - .cu8/.cs16 capture (≥1.0833 Msps)'
249
+ sample_rate: 'optional - sample rate value consumed by #decode',
250
+ source: 'optional - source value consumed by #decode',
251
+ file: 'optional - filesystem path'
237
252
  )
238
253
 
239
- #{self}.viterbi_decode(bits:, k: 5, g0: 0o23, g1: 0o33)
254
+ # Run parse line and return its result
255
+ #{self}.parse_line(
256
+ line: 'optional - line value consumed by #parse_line'
257
+ )
240
258
 
259
+ # Print the AUTHOR(S) string for this module.
241
260
  #{self}.authors
242
261
  "
262
+ constants.sort
243
263
  end
244
264
  end
245
265
  end
@@ -112,15 +112,24 @@ module PWN
112
112
  end
113
113
 
114
114
  public_class_method def self.help
115
- puts "USAGE (true-air I/Q via PWN::FFI + detector fallback):
115
+ puts "USAGE:
116
+ # Run decode and return its result
116
117
  #{self}.decode(
117
118
  freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq',
118
- source: 'optional - :auto|:rtlsdr|:adalm_pluto|:file',
119
- file: 'optional - .cu8/.cs16 capture'
119
+ sample_rate: 'optional - sample rate value consumed by #decode',
120
+ source: 'optional - source value consumed by #decode',
121
+ file: 'optional - filesystem path'
120
122
  )
121
123
 
124
+ # Run parse line and return its result
125
+ #{self}.parse_line(
126
+ line: 'optional - line value consumed by #parse_line'
127
+ )
128
+
129
+ # Print the AUTHOR(S) string for this module.
122
130
  #{self}.authors
123
131
  "
132
+ constants.sort
124
133
  end
125
134
  end
126
135
  end