evolver-tools 35.0.0__tar.gz → 37.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 (323) hide show
  1. {evolver_tools-35.0.0/src/evolver_tools.egg-info → evolver_tools-37.0.0}/PKG-INFO +2 -2
  2. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/pyproject.toml +2 -2
  3. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/cli.py +1 -1
  4. evolver_tools-37.0.0/src/evolver_tools/vendor/ansi_to_html.py +122 -0
  5. evolver_tools-37.0.0/src/evolver_tools/vendor/color_convert.py +135 -0
  6. evolver_tools-37.0.0/src/evolver_tools/vendor/csv_concat.py +57 -0
  7. evolver_tools-37.0.0/src/evolver_tools/vendor/git_ignore.py +207 -0
  8. evolver_tools-37.0.0/src/evolver_tools/vendor/mime_type.py +113 -0
  9. {evolver_tools-35.0.0 → evolver_tools-37.0.0/src/evolver_tools.egg-info}/PKG-INFO +2 -2
  10. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools.egg-info/SOURCES.txt +5 -0
  11. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/LICENSE +0 -0
  12. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/README.md +0 -0
  13. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/setup.cfg +0 -0
  14. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/__init__.py +0 -0
  15. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/__main__.py +0 -0
  16. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/autoreg.py +0 -0
  17. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
  18. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
  19. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
  20. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ansi_to_txt.py +0 -0
  21. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
  22. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ascii_banner.py +0 -0
  23. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
  24. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
  25. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
  26. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
  27. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/backup.py +0 -0
  28. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
  29. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
  30. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/base32.py +0 -0
  31. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/base58.py +0 -0
  32. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
  33. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
  34. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
  35. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
  36. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/case_convert.py +0 -0
  37. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
  38. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
  39. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
  40. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
  41. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
  42. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
  43. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
  44. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
  45. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/chrono.py +0 -0
  46. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
  47. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
  48. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
  49. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/code_review.py +0 -0
  50. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
  51. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
  52. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
  53. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
  54. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
  55. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
  56. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cowsay.py +0 -0
  57. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crc_check.py +0 -0
  58. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
  59. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
  60. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron_check.py +0 -0
  61. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
  62. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
  63. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
  64. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
  65. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
  66. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_dedup.py +0 -0
  67. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_filter.py +0 -0
  68. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_head.py +0 -0
  69. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_merge.py +0 -0
  70. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_pretty.py +0 -0
  71. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_schema.py +0 -0
  72. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_slice.py +0 -0
  73. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_sort.py +0 -0
  74. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
  75. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
  76. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
  77. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
  78. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_to_table.py +0 -0
  79. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
  80. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_view.py +0 -0
  81. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/date_diff.py +0 -0
  82. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
  83. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
  84. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dedup_files.py +0 -0
  85. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
  86. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
  87. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
  88. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
  89. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_files.py +0 -0
  90. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_lines.py +0 -0
  91. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
  92. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
  93. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_yaml.py +0 -0
  94. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
  95. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
  96. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
  97. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
  98. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
  99. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
  100. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
  101. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/emoji_cli.py +0 -0
  102. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
  103. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
  104. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_sorter.py +0 -0
  105. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_template.py +0 -0
  106. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
  107. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/epoch.py +0 -0
  108. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
  109. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/factor.py +0 -0
  110. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
  111. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
  112. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
  113. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
  114. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
  115. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_find.py +0 -0
  116. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
  117. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_patch.py +0 -0
  118. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
  119. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_type.py +0 -0
  120. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
  121. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
  122. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
  123. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/find_empty.py +0 -0
  124. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
  125. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
  126. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
  127. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/fold.py +0 -0
  128. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
  129. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
  130. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
  131. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
  132. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/gzip_cli.py +0 -0
  133. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hash_check.py +0 -0
  134. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
  135. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
  136. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
  137. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
  138. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hexdec.py +0 -0
  139. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hexdump.py +0 -0
  140. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
  141. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
  142. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/html_strip.py +0 -0
  143. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
  144. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
  145. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
  146. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_server.py +0 -0
  147. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_status.py +0 -0
  148. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/humanize.py +0 -0
  149. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
  150. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
  151. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
  152. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
  153. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ip_info.py +0 -0
  154. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
  155. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
  156. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
  157. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
  158. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
  159. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/join.py +0 -0
  160. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/joke.py +0 -0
  161. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
  162. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
  163. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
  164. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
  165. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
  166. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_diff.py +0 -0
  167. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_flatten.py +0 -0
  168. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_keys.py +0 -0
  169. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_merge.py +0 -0
  170. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_patch.py +0 -0
  171. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_path.py +0 -0
  172. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
  173. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
  174. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
  175. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_sort.py +0 -0
  176. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_to_table.py +0 -0
  177. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_to_yaml.py +0 -0
  178. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
  179. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
  180. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jwt_decode.py +0 -0
  181. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
  182. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license.py +0 -0
  183. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
  184. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
  185. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
  186. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/link_check.py +0 -0
  187. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
  188. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
  189. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
  190. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/mac_address.py +0 -0
  191. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
  192. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
  193. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_format.py +0 -0
  194. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_lint.py +0 -0
  195. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
  196. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_to_html.py +0 -0
  197. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
  198. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/math_eval.py +0 -0
  199. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
  200. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/merge_json.py +0 -0
  201. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/morse.py +0 -0
  202. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
  203. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
  204. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
  205. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
  206. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
  207. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/nl.py +0 -0
  208. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
  209. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
  210. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
  211. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
  212. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pdf_info.py +0 -0
  213. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
  214. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
  215. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pomodoro.py +0 -0
  216. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/port_scan.py +0 -0
  217. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
  218. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
  219. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
  220. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
  221. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
  222. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
  223. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
  224. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
  225. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qc_calc.py +0 -0
  226. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qc_report.py +0 -0
  227. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qc_sample.py +0 -0
  228. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qr_cli.py +0 -0
  229. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
  230. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/quote.py +0 -0
  231. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
  232. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
  233. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
  234. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/random.py +0 -0
  235. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/random_cli.py +0 -0
  236. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/random_string.py +0 -0
  237. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
  238. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
  239. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
  240. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
  241. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/restore.py +0 -0
  242. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/rot13.py +0 -0
  243. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
  244. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/scan_open_ports.py +0 -0
  245. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
  246. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
  247. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
  248. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
  249. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
  250. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
  251. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/seq.py +0 -0
  252. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
  253. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
  254. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
  255. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
  256. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/slugify.py +0 -0
  257. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
  258. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
  259. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
  260. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
  261. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
  262. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/split.py +0 -0
  263. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
  264. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
  265. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
  266. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
  267. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
  268. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
  269. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
  270. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
  271. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/subnet.py +0 -0
  272. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
  273. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
  274. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
  275. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
  276. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
  277. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/template.py +0 -0
  278. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/text_dedent.py +0 -0
  279. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
  280. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/text_wrap.py +0 -0
  281. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/time_duration.py +0 -0
  282. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timeout.py +0 -0
  283. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
  284. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
  285. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
  286. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
  287. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
  288. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
  289. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/tr.py +0 -0
  290. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/tree.py +0 -0
  291. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
  292. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
  293. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/tsv2csv.py +0 -0
  294. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
  295. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
  296. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
  297. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
  298. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/url_parser.py +0 -0
  299. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
  300. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
  301. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uuid_gen.py +0 -0
  302. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
  303. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
  304. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/validate.py +0 -0
  305. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/watch.py +0 -0
  306. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
  307. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
  308. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
  309. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
  310. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
  311. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
  312. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
  313. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/world_clock.py +0 -0
  314. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
  315. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/xml_format.py +0 -0
  316. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
  317. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
  318. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
  319. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
  320. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yes.py +0 -0
  321. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
  322. {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
  323. {evolver_tools-35.0.0 → evolver_tools-37.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: 35.0.0
4
- Summary: 244 CLI tools + 9 flagship projects — one pip install
3
+ Version: 37.0.0
4
+ Summary: 254 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 = "35.0.0"
8
- description = "244 CLI tools + 9 flagship projects — one pip install"
7
+ version = "37.0.0"
8
+ description = "254 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 v35.0.0 =====\x1b[0m')
17
+ print(f'\x1b[1;36m===== EVOLVER Tools v37.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,122 @@
1
+ #!/usr/bin/env python3
2
+ """ansi-to-html — Convert ANSI-colored terminal output to HTML."""
3
+ TOOL_META = {"name": "ansi-to-html", "func": "main", "desc": "Convert ANSI escape sequences to color HTML"}
4
+
5
+ import sys
6
+ import re
7
+
8
+ ANSI_COLORS = {
9
+ "0": (0, 0, 0),
10
+ "1": (128, 0, 0),
11
+ "2": (0, 128, 0),
12
+ "3": (128, 128, 0),
13
+ "4": (0, 0, 128),
14
+ "5": (128, 0, 128),
15
+ "6": (0, 128, 128),
16
+ "7": (192, 192, 192),
17
+ "8": (128, 128, 128),
18
+ "9": (255, 0, 0),
19
+ "10": (0, 255, 0),
20
+ "11": (255, 255, 0),
21
+ "12": (0, 0, 255),
22
+ "13": (255, 0, 255),
23
+ "14": (0, 255, 255),
24
+ "15": (255, 255, 255),
25
+ }
26
+
27
+ ANSI_STYLES = {
28
+ "1": "font-weight:bold",
29
+ "3": "font-style:italic",
30
+ "4": "text-decoration:underline",
31
+ "7": "background-color:#333;color:#fff",
32
+ "9": "text-decoration:line-through",
33
+ }
34
+
35
+ ANSI_RE = re.compile(r"\x1b\[([\d;]*)m")
36
+
37
+
38
+ def ansi_to_html(text, dark=True):
39
+ bg = "#1e1e1e" if dark else "#ffffff"
40
+ fg = "#d4d4d4" if dark else "#000000"
41
+ parts = ["<pre style='background:{};color:{};padding:8px;overflow:auto;font-family:monospace;line-height:1.4'>".format(bg, fg)]
42
+ styles = []
43
+ for segment in ANSI_RE.split(text):
44
+ if not segment:
45
+ continue
46
+ if segment == "0":
47
+ styles = []
48
+ parts.append("</span>")
49
+ continue
50
+ if segment.isdigit() or ";" in segment:
51
+ codes = segment.split(";")
52
+ fg_color = None
53
+ bg_color = None
54
+ new_styles = []
55
+ for c in codes:
56
+ if c in ANSI_STYLES:
57
+ new_styles.append(ANSI_STYLES[c])
58
+ elif c in ANSI_COLORS:
59
+ r, gg, b = ANSI_COLORS[c]
60
+ fg_color = f"rgb({r},{gg},{b})"
61
+ elif c == "38" or c == "48":
62
+ # 256-color or truecolor - skip for simplicity
63
+ pass
64
+ css = ";".join(new_styles)
65
+ if fg_color:
66
+ css = css + f";color:{fg_color}" if css else f"color:{fg_color}"
67
+ if css:
68
+ parts.append(f"<span style='{css}'>")
69
+ continue
70
+ # Escape HTML
71
+ segment = segment.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
72
+ parts.append(segment)
73
+
74
+ parts.append("</pre>")
75
+ return "".join(parts)
76
+
77
+
78
+ def main():
79
+ import sys, os
80
+
81
+ args = sys.argv[1:]
82
+ dark = True
83
+ output = None
84
+ files = []
85
+
86
+ i = 0
87
+ while i < len(args):
88
+ if args[i] in ("-h", "--help"):
89
+ print("Usage: ansi-to-html [options] [file...]")
90
+ print(" -l, --light Light background")
91
+ print(" -o, --output FILE Write to file (default: stdout)")
92
+ print(" If no file, reads from stdin")
93
+ return
94
+ elif args[i] in ("-l", "--light"):
95
+ dark = False
96
+ elif args[i] in ("-o", "--output"):
97
+ i += 1
98
+ output = args[i] if i < len(args) else None
99
+ else:
100
+ files.append(args[i])
101
+ i += 1
102
+
103
+ if files:
104
+ text = ""
105
+ for f in files:
106
+ with open(f) as fh:
107
+ text += fh.read()
108
+ else:
109
+ text = sys.stdin.read()
110
+
111
+ html = ansi_to_html(text, dark=dark)
112
+
113
+ if output:
114
+ with open(output, "w") as f:
115
+ f.write(html)
116
+ print(f"Written to {output}")
117
+ else:
118
+ sys.stdout.write(html)
119
+
120
+
121
+ if __name__ == "__main__":
122
+ main()
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env python3
2
+ """color-convert — Convert between color formats (hex, rgb, hsl, hsv, named)."""
3
+ TOOL_META = {"name": "color-convert", "func": "main", "desc": "Convert colors between hex/rgb/hsl/hsv/named formats"}
4
+
5
+ NAMED_COLORS = {
6
+ "red": (255, 0, 0), "green": (0, 128, 0), "blue": (0, 0, 255),
7
+ "white": (255, 255, 255), "black": (0, 0, 0), "gray": (128, 128, 128),
8
+ "grey": (128, 128, 128), "yellow": (255, 255, 0), "orange": (255, 165, 0),
9
+ "purple": (128, 0, 128), "pink": (255, 192, 203), "brown": (165, 42, 42),
10
+ "cyan": (0, 255, 255), "magenta": (255, 0, 255), "lime": (0, 255, 0),
11
+ "navy": (0, 0, 128), "teal": (0, 128, 128), "maroon": (128, 0, 0),
12
+ "olive": (128, 128, 0), "silver": (192, 192, 192),
13
+ "coral": (255, 127, 80), "tomato": (255, 99, 71), "gold": (255, 215, 0),
14
+ "indigo": (75, 0, 130), "violet": (238, 130, 238),
15
+ }
16
+
17
+
18
+ def parse_hex(s):
19
+ s = s.lstrip("#").strip()
20
+ if len(s) == 3:
21
+ s = "".join(c * 2 for c in s)
22
+ return tuple(int(s[i:i+2], 16) for i in (0, 2, 4))
23
+
24
+
25
+ def to_hex(r, g, b):
26
+ return f"#{r:02x}{g:02x}{b:02x}"
27
+
28
+
29
+ def to_rgb(r, g, b):
30
+ return f"rgb({r},{g},{b})"
31
+
32
+
33
+ def rgb_to_hsl(r, g, b):
34
+ r, g, b = r / 255, g / 255, b / 255
35
+ mx, mn = max(r, g, b), min(r, g, b)
36
+ l = (mx + mn) / 2
37
+ if mx == mn:
38
+ return (0, 0, round(l * 100))
39
+ d = mx - mn
40
+ s = d / (2 - mx - mn) if l > 0.5 else d / (mx + mn)
41
+ if mx == r:
42
+ h = (g - b) / d + (6 if g < b else 0)
43
+ elif mx == g:
44
+ h = (b - r) / d + 2
45
+ else:
46
+ h = (r - g) / d + 4
47
+ h /= 6
48
+ return (round(h * 360), round(s * 100), round(l * 100))
49
+
50
+
51
+ def hsl_to_rgb(h, s, l):
52
+ h, s, l = h / 360, s / 100, l / 100
53
+ def hue2rgb(p, q, t):
54
+ if t < 0: t += 1
55
+ if t > 1: t -= 1
56
+ if t < 1/6: return p + (q - p) * 6 * t
57
+ if t < 1/2: return q
58
+ if t < 2/3: return p + (q - p) * (2/3 - t) * 6
59
+ return p
60
+ if s == 0:
61
+ r = g = b = l
62
+ else:
63
+ q = l * (1 + s) if l < 0.5 else l + s - l * s
64
+ p = 2 * l - q
65
+ r = hue2rgb(p, q, h + 1/3)
66
+ g = hue2rgb(p, q, h)
67
+ b = hue2rgb(p, q, h - 1/3)
68
+ return (round(r * 255), round(g * 255), round(b * 255))
69
+
70
+
71
+ def format_all(r, g, b):
72
+ h, s, l = rgb_to_hsl(r, g, b)
73
+ lines = [
74
+ f"HEX: {to_hex(r, g, b)}",
75
+ f"RGB: {to_rgb(r, g, b)}",
76
+ f"HSL: hsl({h},{s}%,{l}%)",
77
+ ]
78
+ # Find named
79
+ for name, (nr, ng, nb) in NAMED_COLORS.items():
80
+ if (nr, ng, nb) == (r, g, b):
81
+ lines.append(f"Name: {name}")
82
+ break
83
+ return "\n".join(lines)
84
+
85
+
86
+ def main():
87
+ import sys
88
+ args = sys.argv[1:]
89
+ if not args or args[0] in ("-h", "--help"):
90
+ print("Usage: color-convert <color>")
91
+ print("Formats: #hex, rgb(r,g,b), hsl(h,s%,l%), or name")
92
+ print("Examples:")
93
+ print(' color-convert "#ff0000"')
94
+ print(" color-convert rgb(255,0,0)")
95
+ print(" color-convert red")
96
+ print(" color-convert hsl(0,100%,50%)")
97
+ return
98
+
99
+ color = " ".join(args)
100
+ r = g = b = None
101
+
102
+ # Try named
103
+ if color.lower() in NAMED_COLORS:
104
+ r, g, b = NAMED_COLORS[color.lower()]
105
+
106
+ # Try hex
107
+ elif color.startswith("#"):
108
+ try:
109
+ r, g, b = parse_hex(color)
110
+ except Exception:
111
+ pass
112
+
113
+ # Try rgb(r,g,b)
114
+ elif color.startswith("rgb"):
115
+ import re
116
+ m = re.search(r"rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)", color)
117
+ if m:
118
+ r, g, b = int(m.group(1)), int(m.group(2)), int(m.group(3))
119
+
120
+ # Try hsl(h,s,l)
121
+ elif color.startswith("hsl"):
122
+ import re
123
+ m = re.search(r"hsl\s*\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?", color)
124
+ if m:
125
+ r, g, b = hsl_to_rgb(float(m.group(1)), float(m.group(2)), float(m.group(3)))
126
+
127
+ if r is None:
128
+ print(f"Error: couldn't parse '{color}'", file=sys.stderr)
129
+ sys.exit(1)
130
+
131
+ print(format_all(r, g, b))
132
+
133
+
134
+ if __name__ == "__main__":
135
+ main()
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env python3
2
+ """csv-concat — Concatenate multiple CSV files, preserving headers."""
3
+ TOOL_META = {"name": "csv-concat", "func": "main", "desc": "Concatenate CSV files vertically (union mode)"}
4
+
5
+ import csv
6
+ import sys
7
+ import os
8
+
9
+
10
+ def main():
11
+ args = sys.argv[1:]
12
+
13
+ if not args or args[0] in ("-h", "--help"):
14
+ print("Usage: csv-concat <file.csv> [file.csv...]")
15
+ print("Concatenate CSV files with same headers.")
16
+ print(" csv-concat a.csv b.csv c.csv > combined.csv")
17
+ print(" csv-concat --skip-header a.csv b.csv (keep first header only)")
18
+ return
19
+
20
+ skip_header = False
21
+ if args[0] == "--skip-header":
22
+ skip_header = True
23
+ args = args[1:]
24
+
25
+ if not args:
26
+ print("No files specified", file=sys.stderr)
27
+ sys.exit(1)
28
+
29
+ for path in args:
30
+ if not os.path.exists(path):
31
+ print(f"Error: {path} not found", file=sys.stderr)
32
+ sys.exit(1)
33
+
34
+ writer = csv.writer(sys.stdout, lineterminator="\n")
35
+ header_written = False
36
+
37
+ for i, path in enumerate(args):
38
+ with open(path, "r", newline="") as f:
39
+ reader = csv.reader(f)
40
+ try:
41
+ header = next(reader)
42
+ except StopIteration:
43
+ continue # empty file
44
+
45
+ if not header_written:
46
+ writer.writerow(header)
47
+ header_written = True
48
+ elif i > 0 and skip_header:
49
+ # Already wrote header from first file
50
+ pass
51
+
52
+ for row in reader:
53
+ writer.writerow(row)
54
+
55
+
56
+ if __name__ == "__main__":
57
+ main()
@@ -0,0 +1,207 @@
1
+ #!/usr/bin/env python3
2
+ """git-ignore — .gitignore template generator."""
3
+ TOOL_META = {"name": "git-ignore", "func": "main", "desc": "Generate .gitignore templates for common languages/frameworks"}
4
+
5
+ TEMPLATES = {
6
+ "python": """# Python
7
+ __pycache__/
8
+ *.py[cod]
9
+ *.egg-info/
10
+ dist/
11
+ build/
12
+ .venv/
13
+ venv/
14
+ env/
15
+ *.egg
16
+ .Python
17
+ *.so
18
+ *.whl
19
+ *.egg-info/
20
+ .eggs/
21
+ .Pipenv.lock
22
+ .pytest_cache/
23
+ .mypy_cache/
24
+ .ruff_cache/
25
+ .tox/
26
+ .coverage
27
+ htmlcov/
28
+ *.db
29
+ *.sqlite
30
+ .DS_Store
31
+ *.swp
32
+ *.swo
33
+ *~
34
+ """,
35
+ "node": """# Node
36
+ node_modules/
37
+ npm-debug.log*
38
+ yarn-debug.log*
39
+ yarn-error.log*
40
+ .pnpm-store/
41
+ .next/
42
+ dist/
43
+ build/
44
+ .cache/
45
+ .env
46
+ .env.local
47
+ .env.*.local
48
+ *.tsbuildinfo
49
+ *.swp
50
+ *.swo
51
+ *~
52
+ .DS_Store
53
+ coverage/
54
+ .nyc_output/
55
+ """,
56
+ "go": """# Go
57
+ *.exe
58
+ *.exe~
59
+ *.dll
60
+ *.so
61
+ *.dylib
62
+ *.test
63
+ *.out
64
+ vendor/
65
+ .idea/
66
+ *.swp
67
+ *.swo
68
+ *~
69
+ .DS_Store
70
+ dist/
71
+ build/
72
+ coverage.txt
73
+ coverage.out
74
+ """,
75
+ "rust": """# Rust
76
+ target/
77
+ **/*.rs.bk
78
+ Cargo.lock
79
+ *.swp
80
+ *.swo
81
+ *~
82
+ .DS_Store
83
+ """,
84
+ "java": """# Java
85
+ *.class
86
+ *.jar
87
+ *.war
88
+ *.nar
89
+ *.ear
90
+ *.zip
91
+ *.tar.gz
92
+ *.rar
93
+ hs_err_pid*
94
+ replay_pid*
95
+ target/
96
+ !**/src/main/**/target/
97
+ !**/src/test/**/target/
98
+ .idea/
99
+ *.iml
100
+ *.ipr
101
+ *.iws
102
+ .settings/
103
+ .project
104
+ .classpath
105
+ bin/
106
+ build/
107
+ .gradle/
108
+ *.swp
109
+ *.swo
110
+ *~
111
+ .DS_Store
112
+ """,
113
+ "docker": """# Docker
114
+ .docker/
115
+ docker-compose.override.yml
116
+ *.swp
117
+ *.swo
118
+ *~
119
+ .DS_Store
120
+ """,
121
+ "vim": """# Vim
122
+ *.swp
123
+ *.swo
124
+ *~
125
+ [._]*.s[a-w][a-z]
126
+ [._]s[a-w][a-z]
127
+ *.un~
128
+ Session.vim
129
+ .netrwhist
130
+ """,
131
+ "macos": """# macOS
132
+ .DS_Store
133
+ .AppleDouble
134
+ .LSOverride
135
+ Icon
136
+ ._*
137
+ .DocumentRevisions-V100
138
+ .fseventsd
139
+ .Spotlight-V100
140
+ .TemporaryItems
141
+ .Trashes
142
+ .VolumeIcon.icns
143
+ .com.apple.timemachine.donotpresent
144
+ """,
145
+ "windows": """# Windows
146
+ Thumbs.db
147
+ Thumbs.db:encryptable
148
+ ehthumbs.db
149
+ ehthumbs_vista.db
150
+ *.stackdump
151
+ [Dd]esktop.ini
152
+ $RECYCLE.BIN/
153
+ *.lnk
154
+ """,
155
+ "latex": """# LaTeX
156
+ *.aux
157
+ *.bbl
158
+ *.blg
159
+ *.brf
160
+ *.fls
161
+ *.idx
162
+ *.ilg
163
+ *.ind
164
+ *.lof
165
+ *.log
166
+ *.lot
167
+ *.nav
168
+ *.out
169
+ *.run.xml
170
+ *.snm
171
+ *.synctex.gz
172
+ *.toc
173
+ *.vrb
174
+ *.xdv
175
+ _site/
176
+ """,
177
+ }
178
+
179
+ def main():
180
+ import sys
181
+ args = sys.argv[1:]
182
+ if not args or args[0] in ("-h", "--help", "help"):
183
+ print("Usage: git-ignore <template> [template...]")
184
+ print(f"Templates: {', '.join(sorted(TEMPLATES.keys()))}")
185
+ print(" git-ignore python → print Python .gitignore")
186
+ print(" git-ignore python node macos → combined")
187
+ return
188
+
189
+ combined = ""
190
+ seen = set()
191
+ for tpl in args:
192
+ tpl = tpl.lower().replace("-", "").replace("_", "")
193
+ found = None
194
+ for key in TEMPLATES:
195
+ if key.replace("-", "").replace("_", "") == tpl:
196
+ found = key
197
+ break
198
+ if found and found not in seen:
199
+ combined += f"### {found.title()} ###\n{TEMPLATES[found]}\n"
200
+ seen.add(found)
201
+ elif not found:
202
+ print(f"Warning: no template '{tpl}'", file=sys.stderr)
203
+ sys.stdout.write(combined)
204
+
205
+
206
+ if __name__ == "__main__":
207
+ main()
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python3
2
+ """mime-type — Detect file MIME types by extension and magic bytes."""
3
+ TOOL_META = {"name": "mime-type", "func": "main", "desc": "Detect MIME type of files by extension and magic bytes"}
4
+
5
+ MIME_DB = {
6
+ ".txt": "text/plain", ".html": "text/html", ".htm": "text/html",
7
+ ".css": "text/css", ".js": "text/javascript", ".mjs": "text/javascript",
8
+ ".json": "application/json", ".xml": "application/xml", ".yaml": "text/yaml",
9
+ ".yml": "text/yaml", ".toml": "text/x-toml", ".ini": "text/plain",
10
+ ".csv": "text/csv", ".tsv": "text/tab-separated-values",
11
+ ".md": "text/markdown", ".rst": "text/x-rst",
12
+ ".py": "text/x-python", ".pyw": "text/x-python",
13
+ ".java": "text/x-java", ".c": "text/x-c", ".cpp": "text/x-c++",
14
+ ".h": "text/x-c-header", ".hpp": "text/x-c++-header",
15
+ ".go": "text/x-go", ".rs": "text/x-rust", ".rb": "text/x-ruby",
16
+ ".php": "text/x-php", ".pl": "text/x-perl",
17
+ ".sh": "application/x-sh", ".bash": "application/x-sh",
18
+ ".bat": "application/x-bat", ".ps1": "text/x-powershell",
19
+ ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".png": "image/png",
20
+ ".gif": "image/gif", ".webp": "image/webp", ".svg": "image/svg+xml",
21
+ ".ico": "image/x-icon", ".bmp": "image/bmp", ".tiff": "image/tiff",
22
+ ".mp3": "audio/mpeg", ".wav": "audio/wav", ".ogg": "audio/ogg",
23
+ ".flac": "audio/flac", ".aac": "audio/aac", ".m4a": "audio/mp4",
24
+ ".mp4": "video/mp4", ".avi": "video/x-msvideo", ".mov": "video/quicktime",
25
+ ".mkv": "video/x-matroska", ".webm": "video/webm", ".flv": "video/x-flv",
26
+ ".pdf": "application/pdf", ".doc": "application/msword",
27
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
28
+ ".xls": "application/vnd.ms-excel",
29
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
30
+ ".ppt": "application/vnd.ms-powerpoint",
31
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
32
+ ".zip": "application/zip", ".tar": "application/x-tar",
33
+ ".gz": "application/gzip", ".bz2": "application/x-bzip2",
34
+ ".xz": "application/x-xz", ".7z": "application/x-7z-compressed",
35
+ ".rar": "application/vnd.rar",
36
+ ".exe": "application/x-msdownload", ".dll": "application/x-msdownload",
37
+ ".so": "application/x-sharedlib", ".dylib": "application/x-mach-binary",
38
+ ".deb": "application/vnd.debian.binary-package",
39
+ ".rpm": "application/x-rpm",
40
+ ".iso": "application/x-iso9660-image",
41
+ ".bin": "application/octet-stream",
42
+ ".woff": "font/woff", ".woff2": "font/woff2",
43
+ ".ttf": "font/ttf", ".otf": "font/otf",
44
+ ".eot": "application/vnd.ms-fontobject",
45
+ ".wasm": "application/wasm",
46
+ ".sql": "text/x-sql", ".db": "application/x-sqlite3",
47
+ ".log": "text/plain", ".env": "text/plain", ".cfg": "text/plain",
48
+ ".conf": "text/plain", ".lock": "text/plain",
49
+ }
50
+
51
+ MAGIC_BYTES = {
52
+ bytes([0xFF, 0xD8, 0xFF]): "image/jpeg",
53
+ bytes([0x89, 0x50, 0x4E, 0x47]): "image/png",
54
+ bytes([0x47, 0x49, 0x46, 0x38]): "image/gif",
55
+ bytes([0x52, 0x49, 0x46, 0x46]): "image/webp",
56
+ bytes([0x25, 0x50, 0x44, 0x46]): "application/pdf",
57
+ bytes([0x50, 0x4B, 0x03, 0x04]): "application/zip",
58
+ bytes([0x1F, 0x8B, 0x08]): "application/gzip",
59
+ bytes([0x42, 0x5A, 0x68]): "application/x-bzip2",
60
+ bytes([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00]): "application/x-xz",
61
+ bytes([0x7F, 0x45, 0x4C, 0x46]): "application/x-elf",
62
+ bytes([0xCA, 0xFE, 0xBA, 0xBE]): "application/java-vm",
63
+ bytes([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]): "video/mp4",
64
+ bytes([0x1A, 0x45, 0xDF, 0xA3]): "video/x-matroska",
65
+ bytes([0x4D, 0x5A]): "application/x-msdownload",
66
+ bytes([0x23, 0x21]): "text/x-script",
67
+ bytes([0xEF, 0xBB, 0xBF]): "text/plain; charset=utf-8-bom",
68
+ bytes([0xFF, 0xFE]): "text/plain; charset=utf-16le",
69
+ bytes([0xFE, 0xFF]): "text/plain; charset=utf-16be",
70
+ }
71
+
72
+
73
+ def detect_mime(path):
74
+ """Detect MIME type, preferring magic bytes over extension."""
75
+ try:
76
+ with open(path, "rb") as f:
77
+ head = f.read(16)
78
+ for magic, mime in MAGIC_BYTES.items():
79
+ if head[:len(magic)] == magic:
80
+ return mime, "magic"
81
+ except Exception:
82
+ pass
83
+
84
+ import os
85
+ _, ext = os.path.splitext(path)
86
+ ext = ext.lower()
87
+ if ext in MIME_DB:
88
+ return MIME_DB[ext], "extension"
89
+ return "application/octet-stream", "unknown"
90
+
91
+
92
+ def main():
93
+ import sys, os
94
+ args = sys.argv[1:]
95
+ if not args or args[0] in ("-h", "--help"):
96
+ print("Usage: mime-type <file> [file...]")
97
+ print("Detect MIME type of one or more files.")
98
+ print(" mime-type foo.pdf bar.png")
99
+ return
100
+
101
+ for path in args:
102
+ if not os.path.exists(path):
103
+ print(f"Error: {path} not found", file=sys.stderr)
104
+ continue
105
+ mime, source = detect_mime(path)
106
+ if len(args) > 1:
107
+ print(f"{path}: {mime} ({source})")
108
+ else:
109
+ print(mime)
110
+
111
+
112
+ if __name__ == "__main__":
113
+ main()
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolver-tools
3
- Version: 35.0.0
4
- Summary: 244 CLI tools + 9 flagship projects — one pip install
3
+ Version: 37.0.0
4
+ Summary: 254 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