evolver-tools 17.0.0__tar.gz → 19.0.0__tar.gz

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 (248) hide show
  1. {evolver_tools-17.0.0/src/evolver_tools.egg-info → evolver_tools-19.0.0}/PKG-INFO +2 -2
  2. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/pyproject.toml +2 -2
  3. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/cli.py +1 -1
  4. evolver_tools-19.0.0/src/evolver_tools/vendor/base32.py +61 -0
  5. evolver_tools-19.0.0/src/evolver_tools/vendor/cowsay.py +165 -0
  6. evolver_tools-19.0.0/src/evolver_tools/vendor/epoch.py +93 -0
  7. evolver_tools-19.0.0/src/evolver_tools/vendor/factor.py +80 -0
  8. evolver_tools-19.0.0/src/evolver_tools/vendor/hexdump.py +87 -0
  9. evolver_tools-19.0.0/src/evolver_tools/vendor/nl.py +90 -0
  10. evolver_tools-19.0.0/src/evolver_tools/vendor/rot13.py +71 -0
  11. evolver_tools-19.0.0/src/evolver_tools/vendor/subnet.py +76 -0
  12. evolver_tools-19.0.0/src/evolver_tools/vendor/timeout.py +68 -0
  13. evolver_tools-19.0.0/src/evolver_tools/vendor/yes.py +39 -0
  14. {evolver_tools-17.0.0 → evolver_tools-19.0.0/src/evolver_tools.egg-info}/PKG-INFO +2 -2
  15. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools.egg-info/SOURCES.txt +10 -0
  16. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/LICENSE +0 -0
  17. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/README.md +0 -0
  18. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/setup.cfg +0 -0
  19. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/__init__.py +0 -0
  20. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/__main__.py +0 -0
  21. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/autoreg.py +0 -0
  22. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
  23. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
  24. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
  25. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
  26. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
  27. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
  28. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
  29. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
  30. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/backup.py +0 -0
  31. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
  32. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
  33. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/banner.py +0 -0
  34. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
  35. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
  36. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
  37. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
  38. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
  39. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
  40. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
  41. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
  42. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
  43. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
  44. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
  45. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
  46. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
  47. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
  48. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
  49. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
  50. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
  51. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
  52. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
  53. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
  54. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
  55. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
  56. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
  57. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
  58. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
  59. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
  60. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
  61. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
  62. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
  63. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
  64. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
  65. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
  66. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
  67. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/csv_view.py +0 -0
  68. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
  69. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
  70. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
  71. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
  72. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
  73. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
  74. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
  75. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
  76. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
  77. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
  78. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
  79. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
  80. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
  81. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
  82. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
  83. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
  84. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
  85. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
  86. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
  87. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
  88. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
  89. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
  90. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
  91. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
  92. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
  93. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
  94. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
  95. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
  96. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
  97. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
  98. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
  99. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
  100. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
  101. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
  102. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
  103. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
  104. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/hash_check.py +0 -0
  105. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
  106. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
  107. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
  108. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
  109. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
  110. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
  111. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
  112. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
  113. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
  114. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
  115. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
  116. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
  117. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
  118. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
  119. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
  120. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
  121. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
  122. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
  123. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/join.py +0 -0
  124. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/joke.py +0 -0
  125. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
  126. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
  127. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
  128. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
  129. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
  130. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
  131. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
  132. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
  133. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
  134. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
  135. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
  136. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/license.py +0 -0
  137. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
  138. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
  139. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
  140. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
  141. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
  142. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
  143. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
  144. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
  145. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
  146. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
  147. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
  148. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/morse.py +0 -0
  149. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
  150. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
  151. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
  152. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
  153. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
  154. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
  155. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
  156. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
  157. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
  158. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
  159. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
  160. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/port_scan.py +0 -0
  161. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
  162. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
  163. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
  164. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
  165. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
  166. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
  167. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
  168. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
  169. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/qc_calc.py +0 -0
  170. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/qc_report.py +0 -0
  171. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/qc_sample.py +0 -0
  172. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/qr_cli.py +0 -0
  173. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
  174. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/quote.py +0 -0
  175. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
  176. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
  177. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
  178. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/random.py +0 -0
  179. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
  180. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
  181. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
  182. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
  183. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/restore.py +0 -0
  184. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
  185. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
  186. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
  187. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
  188. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
  189. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
  190. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
  191. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
  192. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
  193. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
  194. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
  195. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
  196. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
  197. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
  198. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
  199. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
  200. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/split.py +0 -0
  201. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
  202. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
  203. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
  204. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
  205. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
  206. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
  207. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
  208. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
  209. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
  210. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
  211. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
  212. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
  213. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
  214. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/template.py +0 -0
  215. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
  216. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
  217. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
  218. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
  219. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
  220. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
  221. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
  222. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/tree.py +0 -0
  223. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
  224. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
  225. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
  226. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
  227. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
  228. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
  229. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/url_parser.py +0 -0
  230. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
  231. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
  232. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
  233. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
  234. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
  235. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
  236. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
  237. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
  238. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
  239. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
  240. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
  241. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
  242. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
  243. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
  244. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
  245. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
  246. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
  247. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
  248. {evolver_tools-17.0.0 → evolver_tools-19.0.0}/src/evolver_tools.egg-info/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolver-tools
3
- Version: 17.0.0
4
- Summary: 171 CLI tools + 9 flagship projects — one pip install
3
+ Version: 19.0.0
4
+ Summary: 181 CLI tools + 9 flagship projects — one pip install
5
5
  Author: EVOLVER
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://evolver-dev.github.io/evolver-tools
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "evolver-tools"
7
- version = "17.0.0"
8
- description = "171 CLI tools + 9 flagship projects — one pip install"
7
+ version = "19.0.0"
8
+ description = "181 CLI tools + 9 flagship projects — one pip install"
9
9
  readme = "README.md"
10
10
  license = "MIT"
11
11
  requires-python = ">=3.8"
@@ -14,7 +14,7 @@ from evolver_tools.autoreg import auto_discover
14
14
  def list_tools():
15
15
  """Display all available tools."""
16
16
  tools = auto_discover()
17
- print(f'\x1b[1;36m===== EVOLVER Tools v17.0.0 =====\x1b[0m')
17
+ print(f'\x1b[1;36m===== EVOLVER Tools v19.0.0 =====\x1b[0m')
18
18
  print()
19
19
  for name, info in sorted(tools.items()):
20
20
  print(f' \033[1;33m{name:<18}\033[0m {info["desc"]}')
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env python3
2
+ """base32 — Base32 encoding/decoding tool.
3
+
4
+ Usage: base32 encode "hello"
5
+ base32 decode "NBSWY3DP"
6
+ echo "hello" | base32 encode
7
+
8
+ Zero-dependency (stdlib only).
9
+ """
10
+
11
+ import sys
12
+ import base64
13
+
14
+
15
+ def main():
16
+ args = sys.argv[1:]
17
+
18
+ mode = 'encode'
19
+ for a in args[:]:
20
+ if a in ('encode', '--encode', '-e'):
21
+ mode = 'encode'
22
+ args.remove(a)
23
+ elif a in ('decode', '--decode', '-d'):
24
+ mode = 'decode'
25
+ args.remove(a)
26
+ elif a in ('-h', '--help'):
27
+ print(__doc__)
28
+ return
29
+
30
+ text_args = [a for a in args if not a.startswith('-')]
31
+
32
+ if text_args:
33
+ text = ' '.join(text_args)
34
+ elif not sys.stdin.isatty():
35
+ text = sys.stdin.read().strip()
36
+ else:
37
+ print("Usage: base32 (encode|decode) [text]")
38
+ print(" echo <text> | base32 encode")
39
+ return
40
+
41
+ if mode == 'encode':
42
+ encoded = base64.b32encode(text.encode()).decode()
43
+ print(encoded)
44
+ else:
45
+ try:
46
+ decoded = base64.b32decode(text.upper().encode()).decode()
47
+ print(decoded)
48
+ except Exception as e:
49
+ print(f"Error: {e}", file=sys.stderr)
50
+ sys.exit(1)
51
+
52
+
53
+ # === Auto-registration metadata ===
54
+ TOOL_META = {
55
+ "name": "base32",
56
+ "func": "main",
57
+ "desc": 'Base32 encode/decode (stdin or arg)',
58
+ }
59
+
60
+ if __name__ == '__main__':
61
+ main()
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env python3
2
+ """cowsay — ASCII cow saying text.
3
+
4
+ Usage: cowsay "Hello World"
5
+ echo "Hello" | cowsay
6
+ cowsay -l # list all animals
7
+ cowsay -f tux "Hello" # use tux (penguin)
8
+
9
+ Supports multiple animals: cow, tux, dragon, bunny, cheese, daemon
10
+ Zero-dependency (stdlib only).
11
+ """
12
+
13
+ import sys
14
+
15
+ ANIMALS = {}
16
+
17
+ # Cow
18
+ ANIMALS['cow'] = r"""
19
+ \ ^__^
20
+ \ (oo)\_______
21
+ (__)\ )\/\
22
+ ||----w |
23
+ || ||
24
+ """
25
+
26
+ ANIMALS['tux'] = r"""
27
+ \
28
+ \
29
+ .--.
30
+ |o_o |
31
+ |:_/ |
32
+ // \ \
33
+ (| | )
34
+ /'\_ _/`\
35
+ \___)=(___/
36
+ """
37
+
38
+ ANIMALS['dragon'] = r"""
39
+ \ / \ //\
40
+ \ |\___/| / \// \
41
+ /0 0 \__ / // | \ \
42
+ / / \/_/ // | \ \
43
+ @_^_@'/ \/_ // | \ \
44
+ //_^_/ \/_ // | \ \
45
+ ( //) | \/// | \ \
46
+ ( / /) _|_ / ) // | \ _\
47
+ ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.
48
+ (( / / )) ,-{ _ `-.|.-~-. .~ `.
49
+ (( // / )) '/\ / ~-. _ .-~ .-~^-. \
50
+ (( /// )) `. { } / \ \
51
+ (( / )) .----~-.\ \-' .~ \ `. \^-.
52
+ ///.----..> \ _ -~ `. ^-` ^-_
53
+ ///-._ _ _ _ _ _ _}^ - - - -~ `-~ _-~^
54
+ """
55
+
56
+ ANIMALS['bunny'] = r"""
57
+ \ (
58
+ \ )
59
+ __(
60
+ / |
61
+ / /|
62
+ / / |
63
+ ( ( |
64
+ \ \ |
65
+ \ \|
66
+ \ \
67
+ \ \
68
+ \ \_
69
+ \__,_)
70
+ """
71
+
72
+ ANIMALS['cheese'] = r"""
73
+ \
74
+ \ ╔═══════════════╗
75
+ ║ (•_•) ║
76
+ ║ <) )╯ ║
77
+ ║ / \ ║
78
+ ╚═══════════════╝
79
+ """
80
+
81
+ ANIMALS['daemon'] = r"""
82
+ \
83
+ \
84
+ \/\/
85
+ |\/
86
+ /\
87
+ / _\
88
+ / / \
89
+ /_/ \__
90
+ \_\ /_/
91
+ \_\ /_/
92
+ \/_\/_/
93
+ \/_/
94
+ """
95
+
96
+
97
+ def make_speech(text, animal='cow'):
98
+ lines = text.split('\n')
99
+ max_len = max(len(l) for l in lines) if lines else 0
100
+ width = min(max_len + 2, 60)
101
+
102
+ if len(lines) == 1:
103
+ speech = f"< {text} >"
104
+ else:
105
+ speech = []
106
+ speech.append(f" {'_' * width}")
107
+ for i, line in enumerate(lines):
108
+ if i == 0:
109
+ speech.append(f"/ {' ' * (width - 2)} \\" if max_len < width else f"/ {line:<{width-2}} \\")
110
+ elif i == len(lines) - 1:
111
+ speech.append(f"\\ {line:<{width-2}} /")
112
+ else:
113
+ speech.append(f"| {line:<{width-2}} |")
114
+ speech.append(f" -{'-' * width}")
115
+ speech = '\n'.join(speech)
116
+
117
+ art = ANIMALS.get(animal, ANIMALS['cow'])
118
+ return f"{speech}\n{art}"
119
+
120
+
121
+ def main():
122
+ args = sys.argv[1:]
123
+ animal = 'cow'
124
+
125
+ filtered = []
126
+ i = 0
127
+ while i < len(args):
128
+ if args[i] == '-f' and i + 1 < len(args):
129
+ animal = args[i + 1].lower()
130
+ i += 2
131
+ elif args[i] == '-l':
132
+ print("Available animals:", ', '.join(sorted(ANIMALS.keys())))
133
+ return
134
+ elif args[i] in ('-h', '--help'):
135
+ print(__doc__)
136
+ return
137
+ else:
138
+ filtered.append(args[i])
139
+ i += 1
140
+
141
+ if filtered:
142
+ text = ' '.join(filtered)
143
+ elif not sys.stdin.isatty():
144
+ text = sys.stdin.read().strip()
145
+ else:
146
+ print("Usage: cowsay <text> or echo <text> | cowsay [-f animal]")
147
+ print(" cowsay -l (list animals)")
148
+ return
149
+
150
+ if animal not in ANIMALS:
151
+ print(f"Unknown animal: {animal}. Use -l to list.", file=sys.stderr)
152
+ sys.exit(1)
153
+
154
+ print(make_speech(text, animal))
155
+
156
+
157
+ # === Auto-registration metadata ===
158
+ TOOL_META = {
159
+ "name": "cowsay",
160
+ "func": "main",
161
+ "desc": 'ASCII cow saying text (cow/tux/dragon/bunny)',
162
+ }
163
+
164
+ if __name__ == '__main__':
165
+ main()
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env python3
2
+ """epoch — Unix timestamp / human date converter.
3
+
4
+ Usage: epoch # -> current Unix time
5
+ epoch now # -> current date
6
+ epoch 1717171717 # -> human-readable
7
+ epoch "2026-06-01 12:00" # -> Unix timestamp
8
+ epoch --utc # UTC mode
9
+
10
+ Supports various input formats including ISO 8601.
11
+ Zero-dependency (stdlib only).
12
+ """
13
+
14
+ import sys
15
+ from datetime import datetime, timezone
16
+
17
+
18
+ def parse_date(text):
19
+ """Try to parse a date string, return datetime or None."""
20
+ formats = [
21
+ '%Y-%m-%d %H:%M:%S',
22
+ '%Y-%m-%d %H:%M',
23
+ '%Y-%m-%d',
24
+ '%Y/%m/%d %H:%M:%S',
25
+ '%Y/%m/%d %H:%M',
26
+ '%Y/%m/%d',
27
+ '%m/%d/%Y %H:%M:%S',
28
+ '%m/%d/%Y %H:%M',
29
+ '%m/%d/%Y',
30
+ ]
31
+ for fmt in formats:
32
+ try:
33
+ return datetime.strptime(text, fmt)
34
+ except ValueError:
35
+ continue
36
+ return None
37
+
38
+
39
+ def main():
40
+ args = sys.argv[1:]
41
+ utc_mode = '-u' in args or '--utc' in args
42
+ args = [a for a in args if a not in ('-u', '--utc')]
43
+
44
+ if '-h' in args or '--help' in args:
45
+ print(__doc__)
46
+ return
47
+
48
+ if not args or args[0] == 'now':
49
+ now = datetime.now(timezone.utc if utc_mode else None)
50
+ ts = int(now.timestamp())
51
+ if not args:
52
+ print(ts)
53
+ else:
54
+ print(f"Unix: {ts}")
55
+ print(f"Local: {now.strftime('%Y-%m-%d %H:%M:%S')}")
56
+ print(f"UTC: {datetime.fromtimestamp(ts, tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')}")
57
+ return
58
+
59
+ text = ' '.join(args)
60
+
61
+ # Try as Unix timestamp
62
+ try:
63
+ ts = int(text)
64
+ dt_local = datetime.fromtimestamp(ts)
65
+ dt_utc = datetime.fromtimestamp(ts, tz=timezone.utc)
66
+ print(f"Unix: {ts}")
67
+ print(f"Local: {dt_local.strftime('%Y-%m-%d %H:%M:%S')}")
68
+ print(f"UTC: {dt_utc.strftime('%Y-%m-%d %H:%M:%S')}")
69
+ return
70
+ except ValueError:
71
+ pass
72
+
73
+ # Try as date string
74
+ dt = parse_date(text)
75
+ if dt:
76
+ ts = int(dt.replace(tzinfo=timezone.utc).timestamp())
77
+ print(f"Date: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
78
+ print(f"Unix: {ts}")
79
+ return
80
+
81
+ print(f"Error: cannot parse '{text}'", file=sys.stderr)
82
+ sys.exit(1)
83
+
84
+
85
+ # === Auto-registration metadata ===
86
+ TOOL_META = {
87
+ "name": "epoch",
88
+ "func": "main",
89
+ "desc": 'Unix timestamp / human date converter',
90
+ }
91
+
92
+ if __name__ == '__main__':
93
+ main()
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env python3
2
+ """factor — Prime factorization of integers.
3
+
4
+ Usage: factor 123
5
+ factor 12 15 21
6
+ echo "100" | factor
7
+
8
+ Like standard Unix 'factor' command.
9
+ Zero-dependency (stdlib only).
10
+ """
11
+
12
+ import sys
13
+ import math
14
+
15
+
16
+ def factorize(n):
17
+ """Return list of prime factors for n."""
18
+ n = int(n)
19
+ if n < 2:
20
+ return []
21
+ factors = []
22
+ d = 2
23
+ while d * d <= n:
24
+ while n % d == 0:
25
+ factors.append(d)
26
+ n //= d
27
+ d += 1 if d == 2 else 2 # skip evens after 2
28
+ if n > 1:
29
+ factors.append(n)
30
+ return factors
31
+
32
+
33
+ def main():
34
+ args = sys.argv[1:]
35
+
36
+ if '-h' in args or '--help' in args:
37
+ print(__doc__)
38
+ return
39
+
40
+ numbers = []
41
+
42
+ if args:
43
+ for a in args:
44
+ try:
45
+ numbers.append(int(a))
46
+ except ValueError:
47
+ pass
48
+ elif not sys.stdin.isatty():
49
+ data = sys.stdin.read().strip()
50
+ for token in data.split():
51
+ try:
52
+ numbers.append(int(token))
53
+ except ValueError:
54
+ pass
55
+
56
+ if not numbers:
57
+ print("Usage: factor <number> [number...]")
58
+ print(" echo <number> | factor")
59
+ return
60
+
61
+ for n in numbers:
62
+ if n < 2:
63
+ print(f"{n}: {n}")
64
+ else:
65
+ factors = factorize(n)
66
+ if len(factors) == 1:
67
+ print(f"{n}: {n}")
68
+ else:
69
+ print(f"{n}: {' '.join(str(f) for f in factors)}")
70
+
71
+
72
+ # === Auto-registration metadata ===
73
+ TOOL_META = {
74
+ "name": "factor",
75
+ "func": "main",
76
+ "desc": 'Prime factorization of integers',
77
+ }
78
+
79
+ if __name__ == '__main__':
80
+ main()
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env python3
2
+ """hexdump — Hex dump with ASCII view.
3
+
4
+ Usage: hexdump <file>
5
+ echo "hello" | hexdump [--length N]
6
+
7
+ Shows offset, hex bytes, and ASCII representation.
8
+ Zero-dependency (stdlib only).
9
+ """
10
+
11
+ import sys
12
+ import os
13
+
14
+
15
+ def hexdump(data, length=16):
16
+ result = []
17
+ for i in range(0, len(data), length):
18
+ chunk = data[i:i + length]
19
+ hex_part = ' '.join(f'{b:02x}' for b in chunk)
20
+ # Pad hex part if needed
21
+ hex_part = hex_part.ljust(length * 3 - 1)
22
+ ascii_part = ''.join(chr(b) if 32 <= b < 127 else '.' for b in chunk)
23
+ result.append(f'{i:08x} {hex_part} |{ascii_part}|')
24
+ return '\n'.join(result)
25
+
26
+
27
+ def main():
28
+ args = sys.argv[1:]
29
+ show_len = 16
30
+
31
+ for a in args[:]:
32
+ if a == '--length' and len(args) > args.index(a) + 1:
33
+ idx = args.index(a)
34
+ show_len = int(args[idx + 1])
35
+ args.remove(a)
36
+ args.pop(idx) # remove the value too... but index shifted
37
+ elif a.startswith('--length='):
38
+ show_len = int(a.split('=', 1)[1])
39
+ args.remove(a)
40
+ elif a in ('-h', '--help'):
41
+ print(__doc__)
42
+ return
43
+
44
+ # Re-parse length properly
45
+ args = sys.argv[1:]
46
+ filtered = []
47
+ i = 0
48
+ while i < len(args):
49
+ if args[i] == '--length' and i + 1 < len(args):
50
+ show_len = int(args[i + 1])
51
+ i += 2
52
+ elif args[i].startswith('--length='):
53
+ show_len = int(args[i].split('=', 1)[1])
54
+ i += 1
55
+ elif args[i] in ('-h', '--help'):
56
+ print(__doc__)
57
+ return
58
+ else:
59
+ filtered.append(args[i])
60
+ i += 1
61
+
62
+ if filtered:
63
+ path = filtered[0]
64
+ if not os.path.isfile(path):
65
+ print(f"Error: file not found: {path}", file=sys.stderr)
66
+ sys.exit(1)
67
+ with open(path, 'rb') as f:
68
+ data = f.read()
69
+ print(hexdump(data, show_len))
70
+ elif not sys.stdin.isatty():
71
+ data = sys.stdin.buffer.read()
72
+ print(hexdump(data, show_len))
73
+ else:
74
+ print("Usage: hexdump <file>")
75
+ print(" cat <file> | hexdump")
76
+ return
77
+
78
+
79
+ # === Auto-registration metadata ===
80
+ TOOL_META = {
81
+ "name": "hexdump",
82
+ "func": "main",
83
+ "desc": 'Hex dump with ASCII view (file or stdin)',
84
+ }
85
+
86
+ if __name__ == '__main__':
87
+ main()
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env python3
2
+ """nl — Number lines of files or stdin.
3
+
4
+ Usage: nl <file>
5
+ cat <file> | nl [-ba] # -a=number all, -b=number non-empty
6
+ nl -s '. ' input.txt # custom separator
7
+
8
+ Like standard Unix 'nl' command.
9
+ Zero-dependency (stdlib only).
10
+ """
11
+
12
+ import sys
13
+
14
+
15
+ def main():
16
+ args = sys.argv[1:]
17
+ style = 't' # t = non-empty only, a = all, n = none
18
+ separator = ' '
19
+ start_num = 1
20
+
21
+ filtered = []
22
+ i = 0
23
+ while i < len(args):
24
+ if args[i] == '-ba':
25
+ style = 'a'
26
+ i += 1
27
+ elif args[i] == '-bt':
28
+ style = 't'
29
+ i += 1
30
+ elif args[i] == '-bn':
31
+ style = 'n'
32
+ i += 1
33
+ elif args[i] == '-s' and i + 1 < len(args):
34
+ separator = args[i + 1]
35
+ i += 2
36
+ elif args[i].startswith('-s'):
37
+ separator = args[i][2:]
38
+ i += 1
39
+ elif args[i] == '-v' and i + 1 < len(args):
40
+ start_num = int(args[i + 1])
41
+ i += 2
42
+ elif args[i] in ('-h', '--help'):
43
+ print(__doc__)
44
+ return
45
+ else:
46
+ filtered.append(args[i])
47
+ i += 1
48
+
49
+ if filtered:
50
+ for path in filtered:
51
+ try:
52
+ with open(path) as f:
53
+ lines = f.readlines()
54
+ except FileNotFoundError:
55
+ print(f"Error: file not found: {path}", file=sys.stderr)
56
+ continue
57
+ lineno = start_num
58
+ for line in lines:
59
+ numbered = False
60
+ if style == 'a' or (style == 't' and line.strip()):
61
+ print(f'{lineno:>6}{separator}{line}', end='')
62
+ lineno += 1
63
+ numbered = True
64
+ if not numbered:
65
+ print(f' {separator}{line}', end='')
66
+ elif not sys.stdin.isatty():
67
+ lines = sys.stdin.readlines()
68
+ lineno = start_num
69
+ for line in lines:
70
+ numbered = False
71
+ if style == 'a' or (style == 't' and line.strip()):
72
+ print(f'{lineno:>6}{separator}{line}', end='')
73
+ lineno += 1
74
+ numbered = True
75
+ if not numbered:
76
+ print(f' {separator}{line}', end='')
77
+ else:
78
+ print("Usage: nl <file> or cat <file> | nl")
79
+ return
80
+
81
+
82
+ # === Auto-registration metadata ===
83
+ TOOL_META = {
84
+ "name": "nl",
85
+ "func": "main",
86
+ "desc": 'Number lines of files or stdin',
87
+ }
88
+
89
+ if __name__ == '__main__':
90
+ main()
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env python3
2
+ """rot13 — ROT13/ROT47 text cipher.
3
+
4
+ Usage: rot13 "Hello World"
5
+ echo "Hello" | rot13 [--rot47]
6
+ rot13 --rot47 "p6xx2F5H~"
7
+
8
+ Applies ROT13 (default) or ROT47 cipher.
9
+ Zero-dependency (stdlib only).
10
+ """
11
+
12
+ import sys
13
+
14
+ ROT13_TRANS = str.maketrans(
15
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
16
+ 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
17
+ )
18
+
19
+
20
+ def rot13(text):
21
+ return text.translate(ROT13_TRANS)
22
+
23
+
24
+ def rot47(text):
25
+ result = []
26
+ for c in text:
27
+ o = ord(c)
28
+ if 33 <= o <= 126:
29
+ result.append(chr(33 + ((o - 33 + 47) % 94)))
30
+ else:
31
+ result.append(c)
32
+ return ''.join(result)
33
+
34
+
35
+ def main():
36
+ args = sys.argv[1:]
37
+ use_rot47 = False
38
+
39
+ for a in args[:]:
40
+ if a in ('--rot47', '-7'):
41
+ use_rot47 = True
42
+ args.remove(a)
43
+ elif a in ('-h', '--help'):
44
+ print(__doc__)
45
+ return
46
+
47
+ text_args = [a for a in args if not a.startswith('-')]
48
+
49
+ if text_args:
50
+ text = ' '.join(text_args)
51
+ elif not sys.stdin.isatty():
52
+ text = sys.stdin.read().strip()
53
+ else:
54
+ print("Usage: rot13 <text> or echo <text> | rot13 [--rot47]")
55
+ return
56
+
57
+ if use_rot47:
58
+ print(rot47(text))
59
+ else:
60
+ print(rot13(text))
61
+
62
+
63
+ # === Auto-registration metadata ===
64
+ TOOL_META = {
65
+ "name": "rot13",
66
+ "func": "main",
67
+ "desc": 'ROT13/ROT47 text cipher (stdin or arg)',
68
+ }
69
+
70
+ if __name__ == '__main__':
71
+ main()