evolver-tools 14.0.0__tar.gz → 18.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 (243) hide show
  1. {evolver_tools-14.0.0/src/evolver_tools.egg-info → evolver_tools-18.0.0}/PKG-INFO +19 -2
  2. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/README.md +17 -0
  3. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/pyproject.toml +2 -2
  4. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/cli.py +1 -1
  5. evolver_tools-18.0.0/src/evolver_tools/vendor/base32.py +61 -0
  6. evolver_tools-18.0.0/src/evolver_tools/vendor/csv_view.py +157 -0
  7. evolver_tools-18.0.0/src/evolver_tools/vendor/epoch.py +93 -0
  8. evolver_tools-18.0.0/src/evolver_tools/vendor/hash_check.py +74 -0
  9. evolver_tools-18.0.0/src/evolver_tools/vendor/hexdump.py +87 -0
  10. evolver_tools-18.0.0/src/evolver_tools/vendor/license.py +158 -0
  11. evolver_tools-18.0.0/src/evolver_tools/vendor/port_scan.py +75 -0
  12. evolver_tools-18.0.0/src/evolver_tools/vendor/qc_calc.py +585 -0
  13. evolver_tools-18.0.0/src/evolver_tools/vendor/qc_report.py +181 -0
  14. evolver_tools-18.0.0/src/evolver_tools/vendor/qc_sample.py +239 -0
  15. evolver_tools-18.0.0/src/evolver_tools/vendor/qr_cli.py +88 -0
  16. evolver_tools-18.0.0/src/evolver_tools/vendor/quote.py +55 -0
  17. evolver_tools-18.0.0/src/evolver_tools/vendor/random.py +104 -0
  18. evolver_tools-18.0.0/src/evolver_tools/vendor/rot13.py +71 -0
  19. evolver_tools-18.0.0/src/evolver_tools/vendor/subnet.py +76 -0
  20. evolver_tools-18.0.0/src/evolver_tools/vendor/template.py +207 -0
  21. evolver_tools-18.0.0/src/evolver_tools/vendor/tree.py +106 -0
  22. evolver_tools-18.0.0/src/evolver_tools/vendor/url_parser.py +72 -0
  23. {evolver_tools-14.0.0 → evolver_tools-18.0.0/src/evolver_tools.egg-info}/PKG-INFO +19 -2
  24. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools.egg-info/SOURCES.txt +18 -0
  25. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/LICENSE +0 -0
  26. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/setup.cfg +0 -0
  27. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/__init__.py +0 -0
  28. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/__main__.py +0 -0
  29. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/autoreg.py +0 -0
  30. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
  31. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
  32. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
  33. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
  34. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
  35. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
  36. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
  37. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
  38. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/backup.py +0 -0
  39. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
  40. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
  41. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/banner.py +0 -0
  42. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
  43. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
  44. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
  45. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
  46. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
  47. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
  48. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
  49. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
  50. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
  51. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
  52. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
  53. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
  54. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
  55. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
  56. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
  57. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
  58. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
  59. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
  60. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
  61. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
  62. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
  63. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
  64. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
  65. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
  66. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
  67. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
  68. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
  69. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
  70. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
  71. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
  72. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
  73. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
  74. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
  75. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
  76. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
  77. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
  78. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
  79. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
  80. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
  81. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
  82. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
  83. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
  84. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
  85. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
  86. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
  87. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
  88. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
  89. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
  90. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
  91. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
  92. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
  93. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
  94. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
  95. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
  96. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
  97. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
  98. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
  99. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
  100. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
  101. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
  102. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
  103. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
  104. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
  105. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
  106. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
  107. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
  108. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
  109. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
  110. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
  111. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
  112. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
  113. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
  114. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
  115. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
  116. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
  117. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
  118. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
  119. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
  120. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
  121. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
  122. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
  123. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
  124. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
  125. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
  126. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
  127. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
  128. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
  129. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/join.py +0 -0
  130. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/joke.py +0 -0
  131. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
  132. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
  133. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
  134. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
  135. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
  136. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
  137. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
  138. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
  139. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
  140. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
  141. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
  142. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
  143. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
  144. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
  145. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
  146. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
  147. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
  148. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
  149. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
  150. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
  151. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
  152. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
  153. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/morse.py +0 -0
  154. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
  155. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
  156. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
  157. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
  158. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
  159. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
  160. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
  161. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
  162. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
  163. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
  164. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
  165. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
  166. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
  167. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
  168. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
  169. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
  170. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
  171. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
  172. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
  173. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
  174. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
  175. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
  176. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
  177. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
  178. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
  179. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
  180. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
  181. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/restore.py +0 -0
  182. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
  183. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
  184. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
  185. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
  186. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
  187. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
  188. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
  189. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
  190. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
  191. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
  192. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
  193. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
  194. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
  195. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
  196. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
  197. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
  198. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/split.py +0 -0
  199. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
  200. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
  201. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
  202. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
  203. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
  204. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
  205. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
  206. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
  207. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
  208. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
  209. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
  210. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
  211. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
  212. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
  213. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
  214. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
  215. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
  216. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
  217. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
  218. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
  219. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
  220. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
  221. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
  222. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
  223. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
  224. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
  225. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
  226. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
  227. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
  228. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
  229. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
  230. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
  231. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
  232. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
  233. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
  234. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
  235. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
  236. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
  237. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
  238. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
  239. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
  240. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
  241. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
  242. {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
  243. {evolver_tools-14.0.0 → evolver_tools-18.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: 14.0.0
4
- Summary: 159 CLI tools + 9 flagship projects — one pip install
3
+ Version: 18.0.0
4
+ Summary: 176 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
@@ -107,6 +107,23 @@ evtool sort -n data.txt # Numeric sort
107
107
  - Python 3.8+
108
108
  - No external dependencies (38 of 39 tools use stdlib only; ipinfo hits ip-api.com)
109
109
 
110
+ ## Pricing
111
+
112
+ evolver-tools is **MIT open source** — free for everyone, forever.
113
+
114
+ | Tier | Price | What you get |
115
+ |------|-------|-------------|
116
+ | **Free (MIT)** | ¥0 | All 167 tools, full source, forever |
117
+ | **Full Suite** | ¥79 one-time | All tools + priority support + early access + name in credits |
118
+ | **Sponsor** | ¥5/month | GitHub Sponsors badge + Discord + vote on priorities |
119
+ | **Enterprise Basic** | ¥500/year | Custom tool development |
120
+ | **Enterprise Premium** | ¥2,000/year | Dedicated maintenance + 24h emergency fixes |
121
+ | **Enterprise Ultimate** | ¥5,000/year | Full source license + unlimited custom dev + white-label |
122
+
123
+ 👉 **[View full pricing page](https://evolver-dev.github.io/evolver-tools/pricing/)** — includes feature comparison table, testimonials, and FAQ.
124
+
125
+ Support the project via one-time purchase (¥79) or monthly sponsorship on [GitHub Sponsors](https://github.com/sponsors/evolver-dev).
126
+
110
127
  ## License
111
128
 
112
129
  MIT
@@ -85,6 +85,23 @@ evtool sort -n data.txt # Numeric sort
85
85
  - Python 3.8+
86
86
  - No external dependencies (38 of 39 tools use stdlib only; ipinfo hits ip-api.com)
87
87
 
88
+ ## Pricing
89
+
90
+ evolver-tools is **MIT open source** — free for everyone, forever.
91
+
92
+ | Tier | Price | What you get |
93
+ |------|-------|-------------|
94
+ | **Free (MIT)** | ¥0 | All 167 tools, full source, forever |
95
+ | **Full Suite** | ¥79 one-time | All tools + priority support + early access + name in credits |
96
+ | **Sponsor** | ¥5/month | GitHub Sponsors badge + Discord + vote on priorities |
97
+ | **Enterprise Basic** | ¥500/year | Custom tool development |
98
+ | **Enterprise Premium** | ¥2,000/year | Dedicated maintenance + 24h emergency fixes |
99
+ | **Enterprise Ultimate** | ¥5,000/year | Full source license + unlimited custom dev + white-label |
100
+
101
+ 👉 **[View full pricing page](https://evolver-dev.github.io/evolver-tools/pricing/)** — includes feature comparison table, testimonials, and FAQ.
102
+
103
+ Support the project via one-time purchase (¥79) or monthly sponsorship on [GitHub Sponsors](https://github.com/sponsors/evolver-dev).
104
+
88
105
  ## License
89
106
 
90
107
  MIT
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "evolver-tools"
7
- version = "14.0.0"
8
- description = "159 CLI tools + 9 flagship projects — one pip install"
7
+ version = "18.0.0"
8
+ description = "176 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 v14.0.0 =====\x1b[0m')
17
+ print(f'\x1b[1;36m===== EVOLVER Tools v18.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,157 @@
1
+ #!/usr/bin/env python3
2
+ """csv-view — CSV/TSV viewer that prints formatted tables with auto-delimiter detection."""
3
+
4
+ import csv
5
+ import io
6
+ import os
7
+ import sys
8
+
9
+ TOOL_META = {
10
+ "name": "csv-view",
11
+ "func": "main",
12
+ "desc": "View CSV/TSV files as formatted tables. Usage: csv-view file.csv [--head N] [--tail N]",
13
+ }
14
+
15
+
16
+ def detect_delimiter(first_line):
17
+ """Auto-detect delimiter: tab, comma, semicolon, pipe."""
18
+ candidates = {"\t": 0, ",": 0, ";": 0, "|": 0}
19
+ for ch in candidates:
20
+ candidates[ch] = first_line.count(ch)
21
+ # Prefer tab if it appears, otherwise best comma/separator
22
+ if candidates["\t"] > 0:
23
+ return "\t"
24
+ # Find delimiter with highest count
25
+ best_delim = ","
26
+ best_count = 0
27
+ for d, count in candidates.items():
28
+ if count > best_count:
29
+ best_count = count
30
+ best_delim = d
31
+ if best_count == 0:
32
+ return "," # fallback
33
+ return best_delim
34
+
35
+
36
+ def read_table(filepath, head=None, tail=None):
37
+ """Read and parse CSV/TSV file, return (rows, delimiter, has_header)."""
38
+ if not os.path.isfile(filepath):
39
+ print(f"Error: file not found: {filepath}", file=sys.stderr)
40
+ sys.exit(1)
41
+
42
+ try:
43
+ with open(filepath, "r", encoding="utf-8", errors="replace") as f:
44
+ content = f.read()
45
+ except Exception as e:
46
+ print(f"Error reading file: {e}", file=sys.stderr)
47
+ sys.exit(1)
48
+
49
+ if not content.strip():
50
+ print("(empty file)")
51
+ sys.exit(0)
52
+
53
+ # Detect delimiter from first line
54
+ first_line = content.split("\n", 1)[0]
55
+ delimiter = detect_delimiter(first_line)
56
+
57
+ reader = csv.reader(io.StringIO(content), delimiter=delimiter)
58
+ all_rows = [row for row in reader]
59
+
60
+ if not all_rows:
61
+ print("(no data)")
62
+ sys.exit(0)
63
+
64
+ if head is not None and tail is not None:
65
+ rows = all_rows[:head] + all_rows[-tail:]
66
+ elif head is not None:
67
+ rows = all_rows[:head]
68
+ elif tail is not None:
69
+ rows = all_rows[-tail:]
70
+ else:
71
+ rows = all_rows
72
+
73
+ return rows, delimiter
74
+
75
+
76
+ def format_table(rows):
77
+ """Return a formatted string with aligned columns."""
78
+ if not rows:
79
+ return "(no data)"
80
+
81
+ # Calculate column widths
82
+ num_cols = max(len(row) for row in rows) if rows else 0
83
+ if num_cols == 0:
84
+ return "(no columns)"
85
+
86
+ col_widths = [0] * num_cols
87
+ for row in rows:
88
+ for i, cell in enumerate(row):
89
+ if i < num_cols:
90
+ col_widths[i] = max(col_widths[i], len(cell))
91
+
92
+ # Cap width at 120 to prevent extreme wrapping
93
+ col_widths = [min(w, 120) for w in col_widths]
94
+
95
+ # Build separator line
96
+ sep = "─" * (sum(col_widths) + len(col_widths) * 3 + 1)
97
+
98
+ lines = [sep]
99
+ for row_idx, row in enumerate(rows):
100
+ parts = []
101
+ for i in range(num_cols):
102
+ val = row[i] if i < len(row) else ""
103
+ if len(val) > 120:
104
+ val = val[:117] + "..."
105
+ parts.append(val.ljust(col_widths[i]))
106
+ lines.append("│ " + " │ ".join(parts) + " │")
107
+ if row_idx == 0:
108
+ lines.append(sep) # after header
109
+
110
+ lines.append(sep)
111
+ return "\n".join(lines)
112
+
113
+
114
+ def main():
115
+ args = sys.argv[1:]
116
+ if not args or args[0] in ("-h", "--help"):
117
+ print("Usage: csv-view <file> [--head N] [--tail N]")
118
+ print()
119
+ print("Options:")
120
+ print(" --head N Show only first N rows")
121
+ print(" --tail N Show only last N rows")
122
+ print(" --head N --tail N Show first N and last N rows")
123
+ print()
124
+ print("Auto-detects delimiter (comma, tab, semicolon, pipe).")
125
+ return
126
+
127
+ filepath = args[0]
128
+ head = None
129
+ tail = None
130
+
131
+ i = 1
132
+ while i < len(args):
133
+ if args[i] == "--head" and i + 1 < len(args):
134
+ try:
135
+ head = int(args[i + 1])
136
+ except ValueError:
137
+ print("Error: --head requires an integer", file=sys.stderr)
138
+ sys.exit(1)
139
+ i += 2
140
+ elif args[i] == "--tail" and i + 1 < len(args):
141
+ try:
142
+ tail = int(args[i + 1])
143
+ except ValueError:
144
+ print("Error: --tail requires an integer", file=sys.stderr)
145
+ sys.exit(1)
146
+ i += 2
147
+ else:
148
+ i += 1
149
+
150
+ rows, delimiter = read_table(filepath, head, tail)
151
+ print(f"File: {filepath} (delimiter: {repr(delimiter)})")
152
+ print()
153
+ print(format_table(rows))
154
+
155
+
156
+ if __name__ == "__main__":
157
+ 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,74 @@
1
+ #!/usr/bin/env python3
2
+ """hash_check — Compare file hashes against known values."""
3
+
4
+ import sys
5
+ import hashlib
6
+ import os
7
+
8
+ TOOL_META = {
9
+ "name": "hash_check",
10
+ "func": "main",
11
+ "desc": "Compare file hashes against known SHA256/MD5 values",
12
+ }
13
+
14
+
15
+ def file_hash(path, algo="sha256"):
16
+ h = hashlib.new(algo)
17
+ with open(path, "rb") as f:
18
+ for chunk in iter(lambda: f.read(65536), b""):
19
+ h.update(chunk)
20
+ return h.hexdigest()
21
+
22
+
23
+ def main():
24
+ args = sys.argv[1:]
25
+
26
+ if not args or args[0] in ("-h", "--help"):
27
+ print("Usage: evolver hash_check <file> [expected_hash]")
28
+ print(" evolver hash_check --algo <algo> <file> [expected_hash]")
29
+ print()
30
+ print("Algorithms: md5, sha1, sha256 (default), sha512")
31
+ return
32
+
33
+ algo = "sha256"
34
+ files = []
35
+ for a in args:
36
+ if a.startswith("--algo="):
37
+ algo = a.split("=", 1)[1]
38
+ elif a in ("--algo", "-a"):
39
+ continue
40
+ elif algo in ("--algo", "-a"):
41
+ algo = a
42
+ else:
43
+ files.append(a)
44
+
45
+ expected = None
46
+ if len(files) > 1 and not files[1].startswith("--"):
47
+ expected = files[1]
48
+ files = [files[0]]
49
+
50
+ if not files:
51
+ print("Error: no file specified")
52
+ return 1
53
+
54
+ path = files[0]
55
+ if not os.path.exists(path):
56
+ print(f"Error: file not found: {path}")
57
+ return 1
58
+
59
+ actual = file_hash(path, algo)
60
+
61
+ if expected:
62
+ if actual == expected.lower():
63
+ print(f"\033[32m✓ MATCH\033[0m ({algo})")
64
+ else:
65
+ print(f"\033[31m✗ MISMATCH\033[0m ({algo})")
66
+ print(f" Expected: {expected}")
67
+ print(f" Actual: {actual}")
68
+ return 1
69
+ else:
70
+ print(f"{algo.upper()}: {actual} {os.path.basename(path)}")
71
+
72
+
73
+ if __name__ == "__main__":
74
+ sys.exit(main() or 0)
@@ -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()