evolver-tools 19.0.0__tar.gz → 20.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 (253) hide show
  1. {evolver_tools-19.0.0/src/evolver_tools.egg-info → evolver_tools-20.0.0}/PKG-INFO +2 -2
  2. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/pyproject.toml +2 -2
  3. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/cli.py +1 -1
  4. evolver_tools-20.0.0/src/evolver_tools/vendor/fold.py +85 -0
  5. evolver_tools-20.0.0/src/evolver_tools/vendor/pomodoro.py +90 -0
  6. evolver_tools-20.0.0/src/evolver_tools/vendor/seq.py +84 -0
  7. evolver_tools-20.0.0/src/evolver_tools/vendor/tr.py +101 -0
  8. evolver_tools-20.0.0/src/evolver_tools/vendor/watch.py +86 -0
  9. {evolver_tools-19.0.0 → evolver_tools-20.0.0/src/evolver_tools.egg-info}/PKG-INFO +2 -2
  10. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools.egg-info/SOURCES.txt +5 -0
  11. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/LICENSE +0 -0
  12. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/README.md +0 -0
  13. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/setup.cfg +0 -0
  14. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/__init__.py +0 -0
  15. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/__main__.py +0 -0
  16. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/autoreg.py +0 -0
  17. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
  18. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
  19. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
  20. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
  21. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
  22. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
  23. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
  24. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
  25. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/backup.py +0 -0
  26. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
  27. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
  28. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/banner.py +0 -0
  29. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/base32.py +0 -0
  30. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
  31. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
  32. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
  33. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
  34. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
  35. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
  36. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
  37. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
  38. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
  39. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
  40. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
  41. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
  42. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
  43. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
  44. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
  45. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
  46. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
  47. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
  48. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
  49. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
  50. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
  51. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cowsay.py +0 -0
  52. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
  53. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
  54. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
  55. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
  56. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
  57. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
  58. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
  59. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
  60. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
  61. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
  62. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
  63. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
  64. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/csv_view.py +0 -0
  65. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
  66. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
  67. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
  68. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
  69. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
  70. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
  71. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
  72. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
  73. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
  74. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
  75. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
  76. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
  77. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
  78. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
  79. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
  80. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
  81. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
  82. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
  83. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/epoch.py +0 -0
  84. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
  85. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/factor.py +0 -0
  86. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
  87. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
  88. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
  89. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
  90. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
  91. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
  92. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
  93. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
  94. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
  95. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
  96. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
  97. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
  98. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
  99. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
  100. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
  101. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
  102. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
  103. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/hash_check.py +0 -0
  104. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
  105. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
  106. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
  107. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
  108. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/hexdump.py +0 -0
  109. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
  110. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
  111. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
  112. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
  113. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
  114. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
  115. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
  116. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
  117. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
  118. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
  119. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
  120. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
  121. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
  122. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
  123. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/join.py +0 -0
  124. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/joke.py +0 -0
  125. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
  126. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
  127. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
  128. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
  129. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
  130. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
  131. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
  132. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
  133. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
  134. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
  135. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
  136. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/license.py +0 -0
  137. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
  138. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
  139. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
  140. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
  141. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
  142. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
  143. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
  144. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
  145. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
  146. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
  147. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
  148. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/morse.py +0 -0
  149. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
  150. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
  151. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
  152. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
  153. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
  154. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/nl.py +0 -0
  155. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
  156. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
  157. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
  158. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
  159. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
  160. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
  161. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/port_scan.py +0 -0
  162. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
  163. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
  164. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
  165. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
  166. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
  167. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
  168. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
  169. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
  170. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/qc_calc.py +0 -0
  171. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/qc_report.py +0 -0
  172. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/qc_sample.py +0 -0
  173. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/qr_cli.py +0 -0
  174. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
  175. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/quote.py +0 -0
  176. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
  177. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
  178. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
  179. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/random.py +0 -0
  180. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
  181. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
  182. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
  183. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
  184. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/restore.py +0 -0
  185. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/rot13.py +0 -0
  186. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
  187. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
  188. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
  189. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
  190. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
  191. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
  192. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
  193. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
  194. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
  195. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
  196. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
  197. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
  198. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
  199. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
  200. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
  201. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
  202. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/split.py +0 -0
  203. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
  204. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
  205. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
  206. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
  207. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
  208. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
  209. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
  210. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
  211. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/subnet.py +0 -0
  212. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
  213. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
  214. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
  215. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
  216. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
  217. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/template.py +0 -0
  218. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
  219. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/timeout.py +0 -0
  220. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
  221. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
  222. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
  223. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
  224. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
  225. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
  226. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/tree.py +0 -0
  227. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
  228. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
  229. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
  230. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
  231. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
  232. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
  233. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/url_parser.py +0 -0
  234. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
  235. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
  236. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
  237. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
  238. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
  239. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
  240. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
  241. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
  242. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
  243. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
  244. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
  245. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
  246. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
  247. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
  248. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
  249. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
  250. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools/vendor/yes.py +0 -0
  251. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
  252. {evolver_tools-19.0.0 → evolver_tools-20.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
  253. {evolver_tools-19.0.0 → evolver_tools-20.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: 19.0.0
4
- Summary: 181 CLI tools + 9 flagship projects — one pip install
3
+ Version: 20.0.0
4
+ Summary: 186 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 = "19.0.0"
8
- description = "181 CLI tools + 9 flagship projects — one pip install"
7
+ version = "20.0.0"
8
+ description = "186 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 v19.0.0 =====\x1b[0m')
17
+ print(f'\x1b[1;36m===== EVOLVER Tools v20.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,85 @@
1
+ #!/usr/bin/env python3
2
+ """fold — Wrap input lines to a specified width.
3
+
4
+ Usage: fold <file> # wrap at 80
5
+ fold -w 40 <file> # wrap at 40
6
+ echo "long text" | fold -w 20 -s # break at spaces
7
+
8
+ Like standard Unix 'fold' command.
9
+ Zero-dependency (stdlib only).
10
+ """
11
+
12
+ import sys
13
+
14
+
15
+ def fold_line(line, width, spaces=False):
16
+ """Fold a single line to given width."""
17
+ if len(line) <= width or (len(line) == width + 1 and line.endswith('\n')):
18
+ return line
19
+
20
+ result = []
21
+ while line:
22
+ if len(line) <= width:
23
+ result.append(line)
24
+ break
25
+
26
+ chunk = line[:width]
27
+ if spaces:
28
+ # Find last space in the chunk
29
+ last_space = chunk.rfind(' ')
30
+ if last_space > 0:
31
+ result.append(line[:last_space] + '\n')
32
+ line = line[last_space:].lstrip()
33
+ continue
34
+
35
+ result.append(chunk.rstrip('\n') + '\n')
36
+ line = line[width:]
37
+ return ''.join(result)
38
+
39
+
40
+ def main():
41
+ args = sys.argv[1:]
42
+ width = 80
43
+ spaces = False
44
+
45
+ filtered = []
46
+ i = 0
47
+ while i < len(args):
48
+ if args[i] == '-w' and i + 1 < len(args):
49
+ width = int(args[i + 1])
50
+ i += 2
51
+ elif args[i].startswith('-w'):
52
+ width = int(args[i][2:])
53
+ i += 1
54
+ elif args[i] == '-s':
55
+ spaces = True
56
+ i += 1
57
+ elif args[i] in ('-h', '--help'):
58
+ print(__doc__)
59
+ return
60
+ else:
61
+ filtered.append(args[i])
62
+ i += 1
63
+
64
+ if filtered:
65
+ for path in filtered:
66
+ with open(path) as f:
67
+ for line in f:
68
+ print(fold_line(line.rstrip('\n'), width, spaces))
69
+ elif not sys.stdin.isatty():
70
+ for line in sys.stdin:
71
+ print(fold_line(line.rstrip('\n'), width, spaces))
72
+ else:
73
+ print("Usage: fold [-w <width>] [-s] <file>")
74
+ print(" cat <file> | fold [-w 40]")
75
+
76
+
77
+ # === Auto-registration metadata ===
78
+ TOOL_META = {
79
+ "name": "fold",
80
+ "func": "main",
81
+ "desc": 'Wrap input lines to specified width',
82
+ }
83
+
84
+ if __name__ == '__main__':
85
+ main()
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env python3
2
+ """pomodoro — Pomodoro timer for productivity.
3
+
4
+ Usage: pomodoro # 25min work + 5min break
5
+ pomodoro -w 30 -b 10 # custom work/break
6
+ pomodoro -n 4 # 4 cycles
7
+
8
+ Uses terminal bell for alerts.
9
+ Zero-dependency (stdlib only).
10
+ """
11
+
12
+ import sys
13
+ import time
14
+
15
+
16
+ def timer(minutes, label, sound=True):
17
+ total = int(minutes * 60)
18
+ bar_width = 30
19
+ for remaining in range(total, 0, -1):
20
+ elapsed = total - remaining
21
+ progress = int(elapsed / total * bar_width) if total > 0 else 0
22
+ bar = '█' * progress + '░' * (bar_width - progress)
23
+ mins = remaining // 60
24
+ secs = remaining % 60
25
+ print(f'\r {label}: [{bar}] {mins:02d}:{secs:02d} ', end='', flush=True)
26
+ time.sleep(1)
27
+ print()
28
+ if sound:
29
+ for _ in range(3):
30
+ sys.stdout.write('\a')
31
+ sys.stdout.flush()
32
+ time.sleep(0.3)
33
+
34
+
35
+ def main():
36
+ args = sys.argv[1:]
37
+ work_min = 25
38
+ break_min = 5
39
+ cycles = 1
40
+ long_break = 15
41
+
42
+ i = 0
43
+ while i < len(args):
44
+ if args[i] == '-w' and i + 1 < len(args):
45
+ work_min = int(args[i + 1])
46
+ i += 2
47
+ elif args[i] == '-b' and i + 1 < len(args):
48
+ break_min = int(args[i + 1])
49
+ i += 2
50
+ elif args[i] == '-l' and i + 1 < len(args):
51
+ long_break = int(args[i + 1])
52
+ i += 2
53
+ elif args[i] == '-n' and i + 1 < len(args):
54
+ cycles = int(args[i + 1])
55
+ i += 2
56
+ elif args[i] in ('-h', '--help'):
57
+ print(__doc__)
58
+ return
59
+ else:
60
+ i += 1
61
+
62
+ print(f" Pomodoro: {cycles} cycles ({work_min}min work / {break_min}min break)")
63
+ print(f" {('=' * 40)}")
64
+
65
+ try:
66
+ for c in range(1, cycles + 1):
67
+ print(f"\n Cycle {c}/{cycles}")
68
+ timer(work_min, f'Work {c}/{cycles}')
69
+ if c < cycles:
70
+ is_long = (c % 4 == 0)
71
+ break_dur = long_break if is_long else break_min
72
+ label = f'Break {c}/{cycles}' + (' (long)' if is_long else '')
73
+ print(f" Rest time ({break_dur}min)...")
74
+ timer(break_dur, label)
75
+ else:
76
+ print(f"\n ✅ All {cycles} cycles complete!")
77
+ print(f" Total: {work_min * cycles}min work + {break_min * (cycles - 1)}min break")
78
+ except KeyboardInterrupt:
79
+ print(f"\n ⏹ Interrupted")
80
+
81
+
82
+ # === Auto-registration metadata ===
83
+ TOOL_META = {
84
+ "name": "pomodoro",
85
+ "func": "main",
86
+ "desc": 'Pomodoro timer (work/break cycles)',
87
+ }
88
+
89
+ if __name__ == '__main__':
90
+ main()
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env python3
2
+ """seq — Generate sequence of numbers.
3
+
4
+ Usage: seq 10 # 1 2 3 ... 10
5
+ seq 5 10 # 5 6 7 ... 10
6
+ seq 0 2 10 # 0 2 4 ... 10
7
+ seq -s ', ' 1 5 # 1, 2, 3, 4, 5
8
+
9
+ Like standard Unix 'seq' command.
10
+ Zero-dependency (stdlib only).
11
+ """
12
+
13
+ import sys
14
+
15
+
16
+ def main():
17
+ args = sys.argv[1:]
18
+ sep = '\n'
19
+
20
+ filtered = []
21
+ i = 0
22
+ while i < len(args):
23
+ if args[i] == '-s' and i + 1 < len(args):
24
+ sep = args[i + 1]
25
+ i += 2
26
+ elif args[i].startswith('-s'):
27
+ sep = args[i][2:]
28
+ i += 1
29
+ elif args[i] in ('-h', '--help'):
30
+ print(__doc__)
31
+ return
32
+ else:
33
+ filtered.append(args[i])
34
+ i += 1
35
+
36
+ if not filtered:
37
+ print("Usage: seq <last> or seq <first> <last> or seq <first> <step> <last>")
38
+ return
39
+
40
+ try:
41
+ nums = [float(a) for a in filtered]
42
+ except ValueError:
43
+ print("Error: arguments must be numbers", file=sys.stderr)
44
+ sys.exit(1)
45
+
46
+ if len(nums) == 1:
47
+ first, step, last = 1.0, 1.0, nums[0]
48
+ elif len(nums) == 2:
49
+ first, last = nums
50
+ step = 1.0 if first <= last else -1.0
51
+ elif len(nums) == 3:
52
+ first, step, last = nums
53
+ else:
54
+ print("Error: too many arguments", file=sys.stderr)
55
+ sys.exit(1)
56
+
57
+ if step == 0:
58
+ print("Error: step cannot be zero", file=sys.stderr)
59
+ sys.exit(1)
60
+
61
+ result = []
62
+ if step > 0:
63
+ val = first
64
+ while val <= last:
65
+ result.append(str(int(val) if val == int(val) else val))
66
+ val += step
67
+ else:
68
+ val = first
69
+ while val >= last:
70
+ result.append(str(int(val) if val == int(val) else val))
71
+ val += step
72
+
73
+ print(sep.join(result))
74
+
75
+
76
+ # === Auto-registration metadata ===
77
+ TOOL_META = {
78
+ "name": "seq",
79
+ "func": "main",
80
+ "desc": 'Generate sequence of numbers',
81
+ }
82
+
83
+ if __name__ == '__main__':
84
+ main()
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env python3
2
+ """tr — Translate or delete characters.
3
+
4
+ Usage: tr 'abc' 'xyz' # replace a->x, b->y, c->z
5
+ echo "hello" | tr 'a-z' 'A-Z' # uppercase
6
+ tr -d 'aeiou' # delete vowels
7
+ tr -s ' ' # squeeze spaces
8
+
9
+ Like standard Unix 'tr' command.
10
+ Zero-dependency (stdlib only).
11
+ """
12
+
13
+ import sys
14
+ import re
15
+
16
+
17
+ def expand_range(pattern):
18
+ """Expand a-z style ranges."""
19
+ result = ''
20
+ i = 0
21
+ while i < len(pattern):
22
+ if i + 2 < len(pattern) and pattern[i + 1] == '-':
23
+ start = ord(pattern[i])
24
+ end = ord(pattern[i + 2])
25
+ if start <= end:
26
+ result += ''.join(chr(c) for c in range(start, end + 1))
27
+ i += 3
28
+ continue
29
+ result += pattern[i]
30
+ i += 1
31
+ return result
32
+
33
+
34
+ def main():
35
+ args = sys.argv[1:]
36
+ delete = False
37
+ squeeze = False
38
+
39
+ filtered = []
40
+ for a in args:
41
+ if a == '-d':
42
+ delete = True
43
+ elif a == '-s':
44
+ squeeze = True
45
+ elif a in ('-h', '--help'):
46
+ print(__doc__)
47
+ return
48
+ else:
49
+ filtered.append(a)
50
+
51
+ if not sys.stdin.isatty():
52
+ text = sys.stdin.read()
53
+ else:
54
+ print("Usage: echo <text> | tr [options] <set1> [<set2>]")
55
+ print(" tr -d <set1>")
56
+ print(" tr -s <set1>")
57
+ return
58
+
59
+ if delete:
60
+ if not filtered:
61
+ return
62
+ set1 = expand_range(filtered[0])
63
+ trans = str.maketrans('', '', set1)
64
+ result = text.translate(trans)
65
+ print(result, end='')
66
+ return
67
+
68
+ if squeeze:
69
+ if not filtered:
70
+ return
71
+ set1 = expand_range(filtered[0])
72
+ pattern = '[' + re.escape(set1) + ']+'
73
+ result = re.sub(pattern, lambda m: m.group(0)[0], text)
74
+ print(result, end='')
75
+ return
76
+
77
+ if len(filtered) < 2:
78
+ print("Error: need two character sets", file=sys.stderr)
79
+ return
80
+
81
+ set1 = expand_range(filtered[0])
82
+ set2 = expand_range(filtered[1])
83
+
84
+ # Pad set2 if shorter
85
+ if len(set2) < len(set1):
86
+ set2 += set2[-1] * (len(set1) - len(set2))
87
+
88
+ trans = str.maketrans(set1, set2)
89
+ result = text.translate(trans)
90
+ print(result, end='')
91
+
92
+
93
+ # === Auto-registration metadata ===
94
+ TOOL_META = {
95
+ "name": "tr",
96
+ "func": "main",
97
+ "desc": 'Translate or delete characters (stdin)',
98
+ }
99
+
100
+ if __name__ == '__main__':
101
+ main()
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env python3
2
+ """watch — Run command periodically, showing output.
3
+
4
+ Usage: watch "ls -la" # every 2 seconds
5
+ watch -n 5 "date" # every 5 seconds
6
+ watch -d "ps aux" # highlight differences
7
+
8
+ Like standard Unix 'watch' command.
9
+ Zero-dependency (stdlib only).
10
+ """
11
+
12
+ import sys
13
+ import subprocess
14
+ import time
15
+ import os
16
+
17
+
18
+ def clear_screen():
19
+ os.system('clear' if os.name == 'posix' else 'cls')
20
+
21
+
22
+ def main():
23
+ args = sys.argv[1:]
24
+ interval = 2
25
+ highlight = False
26
+
27
+ filtered = []
28
+ i = 0
29
+ while i < len(args):
30
+ if args[i] == '-n' and i + 1 < len(args):
31
+ interval = float(args[i + 1])
32
+ i += 2
33
+ elif args[i] == '-d':
34
+ highlight = True
35
+ i += 1
36
+ elif args[i] in ('-h', '--help'):
37
+ print(__doc__)
38
+ return
39
+ else:
40
+ filtered.append(args[i])
41
+ i += 1
42
+
43
+ if not filtered:
44
+ print("Usage: watch [-n <seconds>] [-d] <command>")
45
+ return
46
+
47
+ cmd = ' '.join(filtered)
48
+ prev_output = ''
49
+
50
+ try:
51
+ while True:
52
+ clear_screen()
53
+ now = time.strftime('%Y-%m-%d %H:%M:%S')
54
+ print(f" Every {interval}s: {cmd}")
55
+ print(f" {now}")
56
+ print(f" {'─' * 50}")
57
+
58
+ result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
59
+ output = result.stdout + result.stderr
60
+
61
+ if highlight and prev_output:
62
+ output_lines = output.split('\n')
63
+ prev_lines = prev_output.split('\n')
64
+ for idx, line in enumerate(output_lines):
65
+ if idx < len(prev_lines) and line != prev_lines[idx]:
66
+ print(f"\033[7m{line}\033[0m") # inverted
67
+ else:
68
+ print(line)
69
+ else:
70
+ print(output)
71
+
72
+ prev_output = output
73
+ time.sleep(interval)
74
+ except KeyboardInterrupt:
75
+ pass
76
+
77
+
78
+ # === Auto-registration metadata ===
79
+ TOOL_META = {
80
+ "name": "watch",
81
+ "func": "main",
82
+ "desc": 'Run command periodically, showing output',
83
+ }
84
+
85
+ if __name__ == '__main__':
86
+ main()
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolver-tools
3
- Version: 19.0.0
4
- Summary: 181 CLI tools + 9 flagship projects — one pip install
3
+ Version: 20.0.0
4
+ Summary: 186 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
@@ -60,6 +60,7 @@ src/evolver_tools/vendor/file_joiner.py
60
60
  src/evolver_tools/vendor/file_splitter.py
61
61
  src/evolver_tools/vendor/file_watch.py
62
62
  src/evolver_tools/vendor/firewall_rule.py
63
+ src/evolver_tools/vendor/fold.py
63
64
  src/evolver_tools/vendor/geo_ip.py
64
65
  src/evolver_tools/vendor/git_branch_cleaner.py
65
66
  src/evolver_tools/vendor/git_log_pretty.py
@@ -97,6 +98,7 @@ src/evolver_tools/vendor/otp_gen.py
97
98
  src/evolver_tools/vendor/password_strength.py
98
99
  src/evolver_tools/vendor/pdf_text.py
99
100
  src/evolver_tools/vendor/pipe_viewer.py
101
+ src/evolver_tools/vendor/pomodoro.py
100
102
  src/evolver_tools/vendor/port_scan.py
101
103
  src/evolver_tools/vendor/process_kill.py
102
104
  src/evolver_tools/vendor/progress_bar.py
@@ -119,6 +121,7 @@ src/evolver_tools/vendor/screenshot_cli.py
119
121
  src/evolver_tools/vendor/search_files.py
120
122
  src/evolver_tools/vendor/search_history.py
121
123
  src/evolver_tools/vendor/secret_scanner.py
124
+ src/evolver_tools/vendor/seq.py
122
125
  src/evolver_tools/vendor/service_check.py
123
126
  src/evolver_tools/vendor/shuffle.py
124
127
  src/evolver_tools/vendor/spinner.py
@@ -137,10 +140,12 @@ src/evolver_tools/vendor/timeout.py
137
140
  src/evolver_tools/vendor/timer_pro.py
138
141
  src/evolver_tools/vendor/todo_cli.py
139
142
  src/evolver_tools/vendor/toml2json.py
143
+ src/evolver_tools/vendor/tr.py
140
144
  src/evolver_tools/vendor/tree.py
141
145
  src/evolver_tools/vendor/unit_convert.py
142
146
  src/evolver_tools/vendor/uri_encode.py
143
147
  src/evolver_tools/vendor/url_parser.py
148
+ src/evolver_tools/vendor/watch.py
144
149
  src/evolver_tools/vendor/weather_cli.py
145
150
  src/evolver_tools/vendor/web_download.py
146
151
  src/evolver_tools/vendor/whois_lookup.py
File without changes
File without changes
File without changes