evolver-tools 23.0.0__tar.gz → 24.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 (273) hide show
  1. {evolver_tools-23.0.0/src/evolver_tools.egg-info → evolver_tools-24.0.0}/PKG-INFO +1 -1
  2. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/pyproject.toml +1 -1
  3. evolver_tools-24.0.0/src/evolver_tools/vendor/gzip_cli.py +81 -0
  4. evolver_tools-24.0.0/src/evolver_tools/vendor/json_diff.py +96 -0
  5. evolver_tools-24.0.0/src/evolver_tools/vendor/jwt_decode.py +81 -0
  6. evolver_tools-24.0.0/src/evolver_tools/vendor/markdown_lint.py +114 -0
  7. evolver_tools-24.0.0/src/evolver_tools/vendor/world_clock.py +80 -0
  8. {evolver_tools-23.0.0 → evolver_tools-24.0.0/src/evolver_tools.egg-info}/PKG-INFO +1 -1
  9. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools.egg-info/SOURCES.txt +5 -0
  10. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/LICENSE +0 -0
  11. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/README.md +0 -0
  12. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/setup.cfg +0 -0
  13. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/__init__.py +0 -0
  14. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/__main__.py +0 -0
  15. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/autoreg.py +0 -0
  16. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/cli.py +0 -0
  17. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
  18. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
  19. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
  20. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
  21. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
  22. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
  23. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
  24. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
  25. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/backup.py +0 -0
  26. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
  27. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
  28. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/banner.py +0 -0
  29. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/base32.py +0 -0
  30. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/base58.py +0 -0
  31. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
  32. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
  33. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
  34. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
  35. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
  36. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
  37. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
  38. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
  39. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
  40. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
  41. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
  42. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
  43. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
  44. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
  45. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
  46. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
  47. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
  48. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
  49. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
  50. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
  51. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
  52. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cowsay.py +0 -0
  53. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/crc_check.py +0 -0
  54. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
  55. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
  56. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
  57. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
  58. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
  59. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
  60. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
  61. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv_merge.py +0 -0
  62. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
  63. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
  64. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
  65. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
  66. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
  67. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/csv_view.py +0 -0
  68. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/date_diff.py +0 -0
  69. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
  70. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
  71. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
  72. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
  73. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
  74. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
  75. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/diff_files.py +0 -0
  76. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
  77. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
  78. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
  79. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
  80. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
  81. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
  82. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
  83. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
  84. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
  85. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
  86. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
  87. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/env_template.py +0 -0
  88. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
  89. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/epoch.py +0 -0
  90. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
  91. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/factor.py +0 -0
  92. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
  93. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
  94. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
  95. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
  96. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
  97. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/file_find.py +0 -0
  98. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
  99. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
  100. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
  101. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
  102. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
  103. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
  104. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
  105. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
  106. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/fold.py +0 -0
  107. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
  108. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
  109. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
  110. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
  111. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/hash_check.py +0 -0
  112. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
  113. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
  114. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
  115. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
  116. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/hexdump.py +0 -0
  117. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
  118. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
  119. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
  120. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
  121. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
  122. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/http_server.py +0 -0
  123. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
  124. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
  125. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
  126. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
  127. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ip_info.py +0 -0
  128. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
  129. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
  130. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
  131. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
  132. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
  133. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/join.py +0 -0
  134. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/joke.py +0 -0
  135. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
  136. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
  137. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
  138. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
  139. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
  140. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json_flatten.py +0 -0
  141. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json_merge.py +0 -0
  142. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
  143. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
  144. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
  145. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
  146. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
  147. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
  148. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/license.py +0 -0
  149. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
  150. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
  151. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
  152. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
  153. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
  154. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
  155. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
  156. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
  157. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
  158. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
  159. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/math_eval.py +0 -0
  160. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
  161. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/morse.py +0 -0
  162. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
  163. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
  164. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
  165. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
  166. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
  167. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/nl.py +0 -0
  168. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
  169. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
  170. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
  171. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
  172. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/pdf_info.py +0 -0
  173. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
  174. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
  175. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/pomodoro.py +0 -0
  176. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/port_scan.py +0 -0
  177. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
  178. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
  179. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
  180. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
  181. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
  182. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
  183. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
  184. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
  185. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/qc_calc.py +0 -0
  186. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/qc_report.py +0 -0
  187. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/qc_sample.py +0 -0
  188. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/qr_cli.py +0 -0
  189. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
  190. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/quote.py +0 -0
  191. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
  192. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
  193. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
  194. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/random.py +0 -0
  195. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
  196. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
  197. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
  198. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
  199. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/restore.py +0 -0
  200. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/rot13.py +0 -0
  201. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
  202. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
  203. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
  204. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
  205. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
  206. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
  207. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
  208. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/seq.py +0 -0
  209. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
  210. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
  211. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
  212. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
  213. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
  214. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
  215. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
  216. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
  217. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
  218. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/split.py +0 -0
  219. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
  220. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
  221. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
  222. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
  223. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
  224. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
  225. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
  226. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
  227. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/subnet.py +0 -0
  228. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
  229. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
  230. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
  231. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
  232. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
  233. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/template.py +0 -0
  234. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
  235. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/timeout.py +0 -0
  236. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
  237. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
  238. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
  239. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
  240. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
  241. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
  242. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/tr.py +0 -0
  243. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/tree.py +0 -0
  244. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
  245. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
  246. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/tsv2csv.py +0 -0
  247. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
  248. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
  249. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
  250. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
  251. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/url_parser.py +0 -0
  252. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
  253. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
  254. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/uuid_gen.py +0 -0
  255. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
  256. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
  257. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/watch.py +0 -0
  258. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
  259. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
  260. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
  261. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
  262. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
  263. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
  264. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
  265. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
  266. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
  267. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
  268. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
  269. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
  270. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools/vendor/yes.py +0 -0
  271. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
  272. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
  273. {evolver_tools-23.0.0 → evolver_tools-24.0.0}/src/evolver_tools.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolver-tools
3
- Version: 23.0.0
3
+ Version: 24.0.0
4
4
  Summary: 201 CLI tools + 9 flagship projects — one pip install
5
5
  Author: EVOLVER
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "evolver-tools"
7
- version = "23.0.0"
7
+ version = "24.0.0"
8
8
  description = "201 CLI tools + 9 flagship projects — one pip install"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env python3
2
+ """gzip-cli — Gzip/gunzip files from CLI.
3
+
4
+ Usage: gzip-cli <file> # Compress (creates .gz)
5
+ gzip-cli -d <file.gz> # Decompress
6
+ gzip-cli -l <file.gz> # List contents of archive
7
+ cat <file> | gzip-cli # Compress stdin to stdout
8
+
9
+ Zero-dependency (stdlib only — uses gzip).
10
+ """
11
+ import sys
12
+ import os
13
+ import gzip
14
+
15
+
16
+ def main():
17
+ args = sys.argv[1:]
18
+
19
+ if '-h' in args or '--help' in args:
20
+ print(__doc__)
21
+ return
22
+
23
+ decompress = '-d' in args
24
+ list_mode = '-l' in args
25
+ args = [a for a in args if not a.startswith('-') or a in (args and args[0] and args[0])]
26
+
27
+ # Actually re-parse properly
28
+ args = sys.argv[1:]
29
+ decompress = '-d' in args or '--decompress' in args
30
+ list_mode = '-l' in args or '--list' in args
31
+ args = [a for a in args if not a.startswith('-')]
32
+
33
+ # Stdin mode
34
+ if not args:
35
+ if decompress:
36
+ sys.stdout.buffer.write(gzip.decompress(sys.stdin.buffer.read()))
37
+ else:
38
+ sys.stdout.buffer.write(gzip.compress(sys.stdin.buffer.read()))
39
+ return
40
+
41
+ for filepath in args:
42
+ if not os.path.exists(filepath):
43
+ print(f'Error: File not found: {filepath}', file=sys.stderr)
44
+ continue
45
+
46
+ if list_mode:
47
+ with gzip.open(filepath, 'rb') as f:
48
+ content = f.read()
49
+ orig_name = os.path.basename(filepath)
50
+ if orig_name.endswith('.gz'):
51
+ orig_name = orig_name[:-3]
52
+ compressed_size = os.path.getsize(filepath)
53
+ print(f'{orig_name:20s} {len(content):>8} bytes → {compressed_size:>8} bytes (ratio: {compressed_size/len(content)*100:.1f}%)')
54
+ continue
55
+
56
+ if decompress:
57
+ if not filepath.endswith('.gz'):
58
+ print(f'Warning: {filepath} does not end in .gz, decompressing anyway', file=sys.stderr)
59
+ outpath = filepath[:-3] if filepath.endswith('.gz') else filepath + '.out'
60
+ with gzip.open(filepath, 'rb') as f_in:
61
+ content = f_in.read()
62
+ with open(outpath, 'wb') as f_out:
63
+ f_out.write(content)
64
+ print(f'{filepath} → {outpath} ({len(content)} bytes)')
65
+ else:
66
+ outpath = filepath + '.gz'
67
+ with open(filepath, 'rb') as f_in:
68
+ content = f_in.read()
69
+ with gzip.open(outpath, 'wb') as f_out:
70
+ f_out.write(content)
71
+ print(f'{filepath} → {outpath} ({os.path.getsize(outpath)} bytes, ratio: {os.path.getsize(outpath)/len(content)*100:.1f}%)')
72
+
73
+
74
+ TOOL_META = {
75
+ "name": "gzip-cli",
76
+ "func": "main",
77
+ "desc": "Gzip/gunzip files — compress, decompress, list archive contents",
78
+ }
79
+
80
+ if __name__ == '__main__':
81
+ main()
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env python3
2
+ """json-diff — Deep diff two JSON files, show paths that differ.
3
+
4
+ Usage: json-diff <file1> <file2>
5
+ json-diff -- <json1> <json2>
6
+
7
+ Zero-dependency (stdlib only).
8
+ """
9
+ import sys
10
+ import json
11
+
12
+
13
+ def deep_diff(a, b, path=''):
14
+ """Recursively compare two values and yield differing paths."""
15
+ if type(a) != type(b):
16
+ yield f'{path}: type mismatch ({type(a).__name__} vs {type(b).__name__})'
17
+ yield f' - {json.dumps(a, ensure_ascii=False)[:200]}'
18
+ yield f' + {json.dumps(b, ensure_ascii=False)[:200]}'
19
+ return
20
+
21
+ if isinstance(a, dict):
22
+ all_keys = set(a) | set(b)
23
+ for k in sorted(all_keys):
24
+ new_path = f'{path}.{k}' if path else k
25
+ if k not in a:
26
+ yield f'{new_path}: added'
27
+ yield f' + {json.dumps(b[k], ensure_ascii=False)[:200]}'
28
+ elif k not in b:
29
+ yield f'{new_path}: removed'
30
+ yield f' - {json.dumps(a[k], ensure_ascii=False)[:200]}'
31
+ else:
32
+ yield from deep_diff(a[k], b[k], new_path)
33
+ elif isinstance(a, list):
34
+ max_len = max(len(a), len(b))
35
+ for i in range(max_len):
36
+ new_path = f'{path}[{i}]'
37
+ if i >= len(a):
38
+ yield f'{new_path}: added'
39
+ yield f' + {json.dumps(b[i], ensure_ascii=False)[:200]}'
40
+ elif i >= len(b):
41
+ yield f'{new_path}: removed'
42
+ yield f' - {json.dumps(a[i], ensure_ascii=False)[:200]}'
43
+ else:
44
+ yield from deep_diff(a[i], b[i], new_path)
45
+ else:
46
+ if a != b:
47
+ yield f'{path}: changed'
48
+ yield f' - {json.dumps(a, ensure_ascii=False)[:200]}'
49
+ yield f' + {json.dumps(b, ensure_ascii=False)[:200]}'
50
+
51
+
52
+ def main():
53
+ args = sys.argv[1:]
54
+
55
+ if '-h' in args or '--help' in args or len(args) != 2:
56
+ print(__doc__)
57
+ return
58
+
59
+ try:
60
+ if args[0] == '--':
61
+ data1 = json.loads(args[1])
62
+ else:
63
+ with open(args[0]) as f:
64
+ data1 = json.load(f)
65
+ except Exception as e:
66
+ print(f'Error reading {args[0]}: {e}', file=sys.stderr)
67
+ sys.exit(1)
68
+
69
+ try:
70
+ if args[1] == '--':
71
+ data2 = json.loads(args[0])
72
+ else:
73
+ with open(args[1]) as f:
74
+ data2 = json.load(f)
75
+ except Exception as e:
76
+ print(f'Error reading {args[1]}: {e}', file=sys.stderr)
77
+ sys.exit(1)
78
+
79
+ diffs = list(deep_diff(data1, data2))
80
+ if diffs:
81
+ print(f'{len(diffs) // 2} difference(s) found:')
82
+ print()
83
+ for line in diffs:
84
+ print(line)
85
+ else:
86
+ print('No differences — files are identical.')
87
+
88
+
89
+ TOOL_META = {
90
+ "name": "json-diff",
91
+ "func": "main",
92
+ "desc": "Deep diff two JSON files, show paths that differ",
93
+ }
94
+
95
+ if __name__ == '__main__':
96
+ main()
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env python3
2
+ """jwt-decode — Decode JWT tokens (header + payload, no verification).
3
+
4
+ Usage: jwt-decode <token>
5
+ echo <token> | jwt-decode
6
+
7
+ Zero-dependency (stdlib only — uses base64 + json).
8
+ """
9
+ import sys
10
+ import base64
11
+ import json
12
+
13
+
14
+ def decode_part(data: str) -> str:
15
+ # Add padding
16
+ padding = 4 - len(data) % 4
17
+ if padding != 4:
18
+ data += '=' * padding
19
+ try:
20
+ decoded = base64.urlsafe_b64decode(data)
21
+ return decoded.decode('utf-8')
22
+ except Exception:
23
+ return f'[binary data: {len(data)} bytes]'
24
+
25
+
26
+ def main():
27
+ args = sys.argv[1:]
28
+
29
+ if '-h' in args or '--help' in args:
30
+ print(__doc__)
31
+ return
32
+
33
+ if args:
34
+ token = args[0]
35
+ else:
36
+ token = sys.stdin.read().strip()
37
+
38
+ if not token:
39
+ print('Error: No JWT token provided', file=sys.stderr)
40
+ sys.exit(1)
41
+
42
+ parts = token.split('.')
43
+ if len(parts) != 3:
44
+ print('Error: Invalid JWT — expected 3 dot-separated parts', file=sys.stderr)
45
+ sys.exit(1)
46
+
47
+ print('=== JWT Decode (no verification) ===')
48
+ print()
49
+
50
+ # Header
51
+ header_raw = decode_part(parts[0])
52
+ try:
53
+ header = json.loads(header_raw)
54
+ print(f'Header: {json.dumps(header, indent=2)}')
55
+ except json.JSONDecodeError:
56
+ print(f'Header (raw): {header_raw}')
57
+
58
+ print()
59
+
60
+ # Payload
61
+ payload_raw = decode_part(parts[1])
62
+ try:
63
+ payload = json.loads(payload_raw)
64
+ print(f'Payload: {json.dumps(payload, indent=2)}')
65
+ except json.JSONDecodeError:
66
+ print(f'Payload (raw): {payload_raw}')
67
+
68
+ print()
69
+ print(f'Signature: {parts[2][:40]}... ({len(parts[2])} chars)')
70
+ print()
71
+ print('WARNING: Decoded only — signature NOT verified.')
72
+
73
+
74
+ TOOL_META = {
75
+ "name": "jwt-decode",
76
+ "func": "main",
77
+ "desc": "Decode JWT tokens (header + payload, no verification)",
78
+ }
79
+
80
+ if __name__ == '__main__':
81
+ main()
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env python3
2
+ """markdown-lint — Basic Markdown linting / style checking.
3
+
4
+ Checks:
5
+ - Blank lines around headings
6
+ - Heading level increments (no skipping)
7
+ - Unclosed code fences
8
+ - Multiple consecutive blank lines
9
+ - Trailing whitespace
10
+ - Long lines (>80 chars in non-code blocks)
11
+
12
+ Usage: markdown-lint <file.md>
13
+ cat <file.md> | markdown-lint
14
+
15
+ Zero-dependency (stdlib only).
16
+ """
17
+ import sys
18
+ import re
19
+
20
+
21
+ def lint_markdown(text: str, filename: str = '<stdin>'):
22
+ lines = text.split('\n')
23
+ issues = []
24
+ in_code_block = False
25
+ prev_heading_level = 0
26
+ prev_blank = False
27
+ blank_count = 0
28
+
29
+ for i, line in enumerate(lines):
30
+ lineno = i + 1
31
+
32
+ # Code fence tracking
33
+ if line.strip().startswith('```') or line.strip().startswith('~~~'):
34
+ in_code_block = not in_code_block
35
+ prev_blank = False
36
+ continue
37
+
38
+ # Check trailing whitespace
39
+ if line != line.rstrip() and not in_code_block:
40
+ issues.append((lineno, 'trailing-whitespace', f'Line has trailing whitespace'))
41
+
42
+ # Check long lines (in non-code blocks)
43
+ if len(line) > 80 and not in_code_block:
44
+ issues.append((lineno, 'line-length', f'Line too long ({len(line)} chars, max 80)'))
45
+
46
+ # Check consecutive blank lines
47
+ if line.strip() == '':
48
+ blank_count += 1
49
+ if blank_count > 1 and not in_code_block:
50
+ issues.append((lineno, 'consecutive-blanks', 'Multiple consecutive blank lines'))
51
+ else:
52
+ blank_count = 0
53
+
54
+ # Heading checks
55
+ heading_match = re.match(r'^(#{1,6})\s', line)
56
+ if heading_match and not in_code_block:
57
+ level = len(heading_match.group(1))
58
+
59
+ # Check heading increment
60
+ if prev_heading_level and level > prev_heading_level + 1:
61
+ issues.append((lineno, 'heading-skip', f'Heading level skipped: h{prev_heading_level} → h{level}'))
62
+
63
+ prev_heading_level = level
64
+ prev_blank = False
65
+
66
+ prev_blank = (line.strip() == '')
67
+
68
+ # Check unclosed code fence
69
+ if in_code_block:
70
+ issues.append((len(lines), 'unclosed-fence', 'Unclosed code fence at end of file'))
71
+
72
+ return issues
73
+
74
+
75
+ def main():
76
+ args = sys.argv[1:]
77
+
78
+ if '-h' in args or '--help' in args:
79
+ print(__doc__)
80
+ return
81
+
82
+ if args:
83
+ filename = args[0]
84
+ try:
85
+ with open(filename) as f:
86
+ text = f.read()
87
+ except FileNotFoundError:
88
+ print(f'Error: File not found: {filename}', file=sys.stderr)
89
+ sys.exit(1)
90
+ else:
91
+ filename = '<stdin>'
92
+ text = sys.stdin.read()
93
+
94
+ issues = lint_markdown(text, filename)
95
+
96
+ if not issues:
97
+ print(f'{filename}: No issues found ✓')
98
+ return
99
+
100
+ # Group by severity
101
+ print(f'{filename}: {len(issues)} issue(s) found')
102
+ print()
103
+ for lineno, rule, msg in issues:
104
+ print(f' {lineno:>4} [{rule:<20}] {msg}')
105
+
106
+
107
+ TOOL_META = {
108
+ "name": "markdown-lint",
109
+ "func": "main",
110
+ "desc": "Basic Markdown linting — headings, fences, whitespace, line length",
111
+ }
112
+
113
+ if __name__ == '__main__':
114
+ main()
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env python3
2
+ """world-clock — Show current time in multiple timezones.
3
+
4
+ Usage: world-clock
5
+ world-clock Asia/Tokyo America/New_York
6
+ world-clock --list
7
+
8
+ Zero-dependency (stdlib only — uses datetime + zoneinfo).
9
+ Note: zoneinfo is available in Python 3.9+.
10
+ """
11
+ import sys
12
+ import datetime
13
+
14
+
15
+ def main():
16
+ args = sys.argv[1:]
17
+
18
+ if '-h' in args or '--help' in args:
19
+ print(__doc__)
20
+ return
21
+
22
+ # Try zoneinfo (Python 3.9+)
23
+ try:
24
+ import zoneinfo
25
+ except ImportError:
26
+ import pytz as _unused # fallback hint
27
+ print('Error: zoneinfo module required (Python 3.9+)', file=sys.stderr)
28
+ sys.exit(1)
29
+
30
+ if '--list' in args:
31
+ print('Available timezones (sample):')
32
+ znames = sorted(zoneinfo.available_timezones())
33
+ # Show common ones
34
+ common = [z for z in znames if '/' in z and not z.startswith('Etc/')]
35
+ for z in common[:40]:
36
+ print(f' {z}')
37
+ print(f' ... {len(common)} total available')
38
+ return
39
+
40
+ # Default zones if none specified
41
+ zones = args if args else [
42
+ 'UTC',
43
+ 'America/New_York',
44
+ 'America/Chicago',
45
+ 'America/Denver',
46
+ 'America/Los_Angeles',
47
+ 'Europe/London',
48
+ 'Europe/Berlin',
49
+ 'Europe/Moscow',
50
+ 'Asia/Shanghai',
51
+ 'Asia/Tokyo',
52
+ 'Asia/Kolkata',
53
+ 'Australia/Sydney',
54
+ 'Pacific/Auckland',
55
+ ]
56
+
57
+ now_utc = datetime.datetime.now(datetime.timezone.utc)
58
+ print(f'Reference: {now_utc.strftime("%Y-%m-%d %H:%M:%S")} UTC')
59
+ print()
60
+
61
+ width = max(len(z) for z in zones) + 2
62
+ for zone_name in zones:
63
+ try:
64
+ tz = zoneinfo.ZoneInfo(zone_name)
65
+ dt = now_utc.astimezone(tz)
66
+ offset = dt.strftime('%z')
67
+ formatted = dt.strftime('%Y-%m-%d %H:%M:%S')
68
+ print(f' {zone_name:<{width}} {formatted} (UTC{offset})')
69
+ except zoneinfo.ZoneInfoNotFoundError:
70
+ print(f' {zone_name:<{width}} [unknown timezone]')
71
+
72
+
73
+ TOOL_META = {
74
+ "name": "world-clock",
75
+ "func": "main",
76
+ "desc": "Show current time in multiple timezones",
77
+ }
78
+
79
+ if __name__ == '__main__':
80
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolver-tools
3
- Version: 23.0.0
3
+ Version: 24.0.0
4
4
  Summary: 201 CLI tools + 9 flagship projects — one pip install
5
5
  Author: EVOLVER
6
6
  License-Expression: MIT
@@ -72,6 +72,7 @@ src/evolver_tools/vendor/geo_ip.py
72
72
  src/evolver_tools/vendor/git_branch_cleaner.py
73
73
  src/evolver_tools/vendor/git_log_pretty.py
74
74
  src/evolver_tools/vendor/git_stats.py
75
+ src/evolver_tools/vendor/gzip_cli.py
75
76
  src/evolver_tools/vendor/hash_check.py
76
77
  src/evolver_tools/vendor/hash_file.py
77
78
  src/evolver_tools/vendor/hex_tool.py
@@ -87,15 +88,18 @@ src/evolver_tools/vendor/ip_location.py
87
88
  src/evolver_tools/vendor/join.py
88
89
  src/evolver_tools/vendor/joke.py
89
90
  src/evolver_tools/vendor/json2ini.py
91
+ src/evolver_tools/vendor/json_diff.py
90
92
  src/evolver_tools/vendor/json_flatten.py
91
93
  src/evolver_tools/vendor/json_merge.py
92
94
  src/evolver_tools/vendor/json_schema_validate.py
95
+ src/evolver_tools/vendor/jwt_decode.py
93
96
  src/evolver_tools/vendor/key_value_store.py
94
97
  src/evolver_tools/vendor/license.py
95
98
  src/evolver_tools/vendor/log_analyzer.py
96
99
  src/evolver_tools/vendor/log_hawk.py
97
100
  src/evolver_tools/vendor/log_tail.py
98
101
  src/evolver_tools/vendor/macrogen.py
102
+ src/evolver_tools/vendor/markdown_lint.py
99
103
  src/evolver_tools/vendor/markdown_preview.py
100
104
  src/evolver_tools/vendor/markdown_toc.py
101
105
  src/evolver_tools/vendor/math_eval.py
@@ -164,6 +168,7 @@ src/evolver_tools/vendor/watch.py
164
168
  src/evolver_tools/vendor/weather_cli.py
165
169
  src/evolver_tools/vendor/web_download.py
166
170
  src/evolver_tools/vendor/whois_lookup.py
171
+ src/evolver_tools/vendor/world_clock.py
167
172
  src/evolver_tools/vendor/xml2json.py
168
173
  src/evolver_tools/vendor/yaml2toml.py
169
174
  src/evolver_tools/vendor/yaml_validate.py
File without changes
File without changes
File without changes