evolver-tools 14.0.0__tar.gz → 18.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {evolver_tools-14.0.0/src/evolver_tools.egg-info → evolver_tools-18.0.0}/PKG-INFO +19 -2
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/README.md +17 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/pyproject.toml +2 -2
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/cli.py +1 -1
- evolver_tools-18.0.0/src/evolver_tools/vendor/base32.py +61 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/csv_view.py +157 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/epoch.py +93 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/hash_check.py +74 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/hexdump.py +87 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/license.py +158 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/port_scan.py +75 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/qc_calc.py +585 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/qc_report.py +181 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/qc_sample.py +239 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/qr_cli.py +88 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/quote.py +55 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/random.py +104 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/rot13.py +71 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/subnet.py +76 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/template.py +207 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/tree.py +106 -0
- evolver_tools-18.0.0/src/evolver_tools/vendor/url_parser.py +72 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0/src/evolver_tools.egg-info}/PKG-INFO +19 -2
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools.egg-info/SOURCES.txt +18 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/LICENSE +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/setup.cfg +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/autoreg.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/backup.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/banner.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/join.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/joke.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/morse.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/restore.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/split.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
- {evolver_tools-14.0.0 → evolver_tools-18.0.0}/src/evolver_tools.egg-info/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evolver-tools
|
|
3
|
-
Version:
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 18.0.0
|
|
4
|
+
Summary: 176 CLI tools + 9 flagship projects — one pip install
|
|
5
5
|
Author: EVOLVER
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://evolver-dev.github.io/evolver-tools
|
|
@@ -107,6 +107,23 @@ evtool sort -n data.txt # Numeric sort
|
|
|
107
107
|
- Python 3.8+
|
|
108
108
|
- No external dependencies (38 of 39 tools use stdlib only; ipinfo hits ip-api.com)
|
|
109
109
|
|
|
110
|
+
## Pricing
|
|
111
|
+
|
|
112
|
+
evolver-tools is **MIT open source** — free for everyone, forever.
|
|
113
|
+
|
|
114
|
+
| Tier | Price | What you get |
|
|
115
|
+
|------|-------|-------------|
|
|
116
|
+
| **Free (MIT)** | ¥0 | All 167 tools, full source, forever |
|
|
117
|
+
| **Full Suite** | ¥79 one-time | All tools + priority support + early access + name in credits |
|
|
118
|
+
| **Sponsor** | ¥5/month | GitHub Sponsors badge + Discord + vote on priorities |
|
|
119
|
+
| **Enterprise Basic** | ¥500/year | Custom tool development |
|
|
120
|
+
| **Enterprise Premium** | ¥2,000/year | Dedicated maintenance + 24h emergency fixes |
|
|
121
|
+
| **Enterprise Ultimate** | ¥5,000/year | Full source license + unlimited custom dev + white-label |
|
|
122
|
+
|
|
123
|
+
👉 **[View full pricing page](https://evolver-dev.github.io/evolver-tools/pricing/)** — includes feature comparison table, testimonials, and FAQ.
|
|
124
|
+
|
|
125
|
+
Support the project via one-time purchase (¥79) or monthly sponsorship on [GitHub Sponsors](https://github.com/sponsors/evolver-dev).
|
|
126
|
+
|
|
110
127
|
## License
|
|
111
128
|
|
|
112
129
|
MIT
|
|
@@ -85,6 +85,23 @@ evtool sort -n data.txt # Numeric sort
|
|
|
85
85
|
- Python 3.8+
|
|
86
86
|
- No external dependencies (38 of 39 tools use stdlib only; ipinfo hits ip-api.com)
|
|
87
87
|
|
|
88
|
+
## Pricing
|
|
89
|
+
|
|
90
|
+
evolver-tools is **MIT open source** — free for everyone, forever.
|
|
91
|
+
|
|
92
|
+
| Tier | Price | What you get |
|
|
93
|
+
|------|-------|-------------|
|
|
94
|
+
| **Free (MIT)** | ¥0 | All 167 tools, full source, forever |
|
|
95
|
+
| **Full Suite** | ¥79 one-time | All tools + priority support + early access + name in credits |
|
|
96
|
+
| **Sponsor** | ¥5/month | GitHub Sponsors badge + Discord + vote on priorities |
|
|
97
|
+
| **Enterprise Basic** | ¥500/year | Custom tool development |
|
|
98
|
+
| **Enterprise Premium** | ¥2,000/year | Dedicated maintenance + 24h emergency fixes |
|
|
99
|
+
| **Enterprise Ultimate** | ¥5,000/year | Full source license + unlimited custom dev + white-label |
|
|
100
|
+
|
|
101
|
+
👉 **[View full pricing page](https://evolver-dev.github.io/evolver-tools/pricing/)** — includes feature comparison table, testimonials, and FAQ.
|
|
102
|
+
|
|
103
|
+
Support the project via one-time purchase (¥79) or monthly sponsorship on [GitHub Sponsors](https://github.com/sponsors/evolver-dev).
|
|
104
|
+
|
|
88
105
|
## License
|
|
89
106
|
|
|
90
107
|
MIT
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "evolver-tools"
|
|
7
|
-
version = "
|
|
8
|
-
description = "
|
|
7
|
+
version = "18.0.0"
|
|
8
|
+
description = "176 CLI tools + 9 flagship projects — one pip install"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
11
11
|
requires-python = ">=3.8"
|
|
@@ -14,7 +14,7 @@ from evolver_tools.autoreg import auto_discover
|
|
|
14
14
|
def list_tools():
|
|
15
15
|
"""Display all available tools."""
|
|
16
16
|
tools = auto_discover()
|
|
17
|
-
print(f'\x1b[1;36m===== EVOLVER Tools
|
|
17
|
+
print(f'\x1b[1;36m===== EVOLVER Tools v18.0.0 =====\x1b[0m')
|
|
18
18
|
print()
|
|
19
19
|
for name, info in sorted(tools.items()):
|
|
20
20
|
print(f' \033[1;33m{name:<18}\033[0m {info["desc"]}')
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""base32 — Base32 encoding/decoding tool.
|
|
3
|
+
|
|
4
|
+
Usage: base32 encode "hello"
|
|
5
|
+
base32 decode "NBSWY3DP"
|
|
6
|
+
echo "hello" | base32 encode
|
|
7
|
+
|
|
8
|
+
Zero-dependency (stdlib only).
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import sys
|
|
12
|
+
import base64
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def main():
|
|
16
|
+
args = sys.argv[1:]
|
|
17
|
+
|
|
18
|
+
mode = 'encode'
|
|
19
|
+
for a in args[:]:
|
|
20
|
+
if a in ('encode', '--encode', '-e'):
|
|
21
|
+
mode = 'encode'
|
|
22
|
+
args.remove(a)
|
|
23
|
+
elif a in ('decode', '--decode', '-d'):
|
|
24
|
+
mode = 'decode'
|
|
25
|
+
args.remove(a)
|
|
26
|
+
elif a in ('-h', '--help'):
|
|
27
|
+
print(__doc__)
|
|
28
|
+
return
|
|
29
|
+
|
|
30
|
+
text_args = [a for a in args if not a.startswith('-')]
|
|
31
|
+
|
|
32
|
+
if text_args:
|
|
33
|
+
text = ' '.join(text_args)
|
|
34
|
+
elif not sys.stdin.isatty():
|
|
35
|
+
text = sys.stdin.read().strip()
|
|
36
|
+
else:
|
|
37
|
+
print("Usage: base32 (encode|decode) [text]")
|
|
38
|
+
print(" echo <text> | base32 encode")
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
if mode == 'encode':
|
|
42
|
+
encoded = base64.b32encode(text.encode()).decode()
|
|
43
|
+
print(encoded)
|
|
44
|
+
else:
|
|
45
|
+
try:
|
|
46
|
+
decoded = base64.b32decode(text.upper().encode()).decode()
|
|
47
|
+
print(decoded)
|
|
48
|
+
except Exception as e:
|
|
49
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
50
|
+
sys.exit(1)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# === Auto-registration metadata ===
|
|
54
|
+
TOOL_META = {
|
|
55
|
+
"name": "base32",
|
|
56
|
+
"func": "main",
|
|
57
|
+
"desc": 'Base32 encode/decode (stdin or arg)',
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if __name__ == '__main__':
|
|
61
|
+
main()
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""csv-view — CSV/TSV viewer that prints formatted tables with auto-delimiter detection."""
|
|
3
|
+
|
|
4
|
+
import csv
|
|
5
|
+
import io
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
TOOL_META = {
|
|
10
|
+
"name": "csv-view",
|
|
11
|
+
"func": "main",
|
|
12
|
+
"desc": "View CSV/TSV files as formatted tables. Usage: csv-view file.csv [--head N] [--tail N]",
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def detect_delimiter(first_line):
|
|
17
|
+
"""Auto-detect delimiter: tab, comma, semicolon, pipe."""
|
|
18
|
+
candidates = {"\t": 0, ",": 0, ";": 0, "|": 0}
|
|
19
|
+
for ch in candidates:
|
|
20
|
+
candidates[ch] = first_line.count(ch)
|
|
21
|
+
# Prefer tab if it appears, otherwise best comma/separator
|
|
22
|
+
if candidates["\t"] > 0:
|
|
23
|
+
return "\t"
|
|
24
|
+
# Find delimiter with highest count
|
|
25
|
+
best_delim = ","
|
|
26
|
+
best_count = 0
|
|
27
|
+
for d, count in candidates.items():
|
|
28
|
+
if count > best_count:
|
|
29
|
+
best_count = count
|
|
30
|
+
best_delim = d
|
|
31
|
+
if best_count == 0:
|
|
32
|
+
return "," # fallback
|
|
33
|
+
return best_delim
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def read_table(filepath, head=None, tail=None):
|
|
37
|
+
"""Read and parse CSV/TSV file, return (rows, delimiter, has_header)."""
|
|
38
|
+
if not os.path.isfile(filepath):
|
|
39
|
+
print(f"Error: file not found: {filepath}", file=sys.stderr)
|
|
40
|
+
sys.exit(1)
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
with open(filepath, "r", encoding="utf-8", errors="replace") as f:
|
|
44
|
+
content = f.read()
|
|
45
|
+
except Exception as e:
|
|
46
|
+
print(f"Error reading file: {e}", file=sys.stderr)
|
|
47
|
+
sys.exit(1)
|
|
48
|
+
|
|
49
|
+
if not content.strip():
|
|
50
|
+
print("(empty file)")
|
|
51
|
+
sys.exit(0)
|
|
52
|
+
|
|
53
|
+
# Detect delimiter from first line
|
|
54
|
+
first_line = content.split("\n", 1)[0]
|
|
55
|
+
delimiter = detect_delimiter(first_line)
|
|
56
|
+
|
|
57
|
+
reader = csv.reader(io.StringIO(content), delimiter=delimiter)
|
|
58
|
+
all_rows = [row for row in reader]
|
|
59
|
+
|
|
60
|
+
if not all_rows:
|
|
61
|
+
print("(no data)")
|
|
62
|
+
sys.exit(0)
|
|
63
|
+
|
|
64
|
+
if head is not None and tail is not None:
|
|
65
|
+
rows = all_rows[:head] + all_rows[-tail:]
|
|
66
|
+
elif head is not None:
|
|
67
|
+
rows = all_rows[:head]
|
|
68
|
+
elif tail is not None:
|
|
69
|
+
rows = all_rows[-tail:]
|
|
70
|
+
else:
|
|
71
|
+
rows = all_rows
|
|
72
|
+
|
|
73
|
+
return rows, delimiter
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def format_table(rows):
|
|
77
|
+
"""Return a formatted string with aligned columns."""
|
|
78
|
+
if not rows:
|
|
79
|
+
return "(no data)"
|
|
80
|
+
|
|
81
|
+
# Calculate column widths
|
|
82
|
+
num_cols = max(len(row) for row in rows) if rows else 0
|
|
83
|
+
if num_cols == 0:
|
|
84
|
+
return "(no columns)"
|
|
85
|
+
|
|
86
|
+
col_widths = [0] * num_cols
|
|
87
|
+
for row in rows:
|
|
88
|
+
for i, cell in enumerate(row):
|
|
89
|
+
if i < num_cols:
|
|
90
|
+
col_widths[i] = max(col_widths[i], len(cell))
|
|
91
|
+
|
|
92
|
+
# Cap width at 120 to prevent extreme wrapping
|
|
93
|
+
col_widths = [min(w, 120) for w in col_widths]
|
|
94
|
+
|
|
95
|
+
# Build separator line
|
|
96
|
+
sep = "─" * (sum(col_widths) + len(col_widths) * 3 + 1)
|
|
97
|
+
|
|
98
|
+
lines = [sep]
|
|
99
|
+
for row_idx, row in enumerate(rows):
|
|
100
|
+
parts = []
|
|
101
|
+
for i in range(num_cols):
|
|
102
|
+
val = row[i] if i < len(row) else ""
|
|
103
|
+
if len(val) > 120:
|
|
104
|
+
val = val[:117] + "..."
|
|
105
|
+
parts.append(val.ljust(col_widths[i]))
|
|
106
|
+
lines.append("│ " + " │ ".join(parts) + " │")
|
|
107
|
+
if row_idx == 0:
|
|
108
|
+
lines.append(sep) # after header
|
|
109
|
+
|
|
110
|
+
lines.append(sep)
|
|
111
|
+
return "\n".join(lines)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def main():
|
|
115
|
+
args = sys.argv[1:]
|
|
116
|
+
if not args or args[0] in ("-h", "--help"):
|
|
117
|
+
print("Usage: csv-view <file> [--head N] [--tail N]")
|
|
118
|
+
print()
|
|
119
|
+
print("Options:")
|
|
120
|
+
print(" --head N Show only first N rows")
|
|
121
|
+
print(" --tail N Show only last N rows")
|
|
122
|
+
print(" --head N --tail N Show first N and last N rows")
|
|
123
|
+
print()
|
|
124
|
+
print("Auto-detects delimiter (comma, tab, semicolon, pipe).")
|
|
125
|
+
return
|
|
126
|
+
|
|
127
|
+
filepath = args[0]
|
|
128
|
+
head = None
|
|
129
|
+
tail = None
|
|
130
|
+
|
|
131
|
+
i = 1
|
|
132
|
+
while i < len(args):
|
|
133
|
+
if args[i] == "--head" and i + 1 < len(args):
|
|
134
|
+
try:
|
|
135
|
+
head = int(args[i + 1])
|
|
136
|
+
except ValueError:
|
|
137
|
+
print("Error: --head requires an integer", file=sys.stderr)
|
|
138
|
+
sys.exit(1)
|
|
139
|
+
i += 2
|
|
140
|
+
elif args[i] == "--tail" and i + 1 < len(args):
|
|
141
|
+
try:
|
|
142
|
+
tail = int(args[i + 1])
|
|
143
|
+
except ValueError:
|
|
144
|
+
print("Error: --tail requires an integer", file=sys.stderr)
|
|
145
|
+
sys.exit(1)
|
|
146
|
+
i += 2
|
|
147
|
+
else:
|
|
148
|
+
i += 1
|
|
149
|
+
|
|
150
|
+
rows, delimiter = read_table(filepath, head, tail)
|
|
151
|
+
print(f"File: {filepath} (delimiter: {repr(delimiter)})")
|
|
152
|
+
print()
|
|
153
|
+
print(format_table(rows))
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
if __name__ == "__main__":
|
|
157
|
+
main()
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""epoch — Unix timestamp / human date converter.
|
|
3
|
+
|
|
4
|
+
Usage: epoch # -> current Unix time
|
|
5
|
+
epoch now # -> current date
|
|
6
|
+
epoch 1717171717 # -> human-readable
|
|
7
|
+
epoch "2026-06-01 12:00" # -> Unix timestamp
|
|
8
|
+
epoch --utc # UTC mode
|
|
9
|
+
|
|
10
|
+
Supports various input formats including ISO 8601.
|
|
11
|
+
Zero-dependency (stdlib only).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import sys
|
|
15
|
+
from datetime import datetime, timezone
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def parse_date(text):
|
|
19
|
+
"""Try to parse a date string, return datetime or None."""
|
|
20
|
+
formats = [
|
|
21
|
+
'%Y-%m-%d %H:%M:%S',
|
|
22
|
+
'%Y-%m-%d %H:%M',
|
|
23
|
+
'%Y-%m-%d',
|
|
24
|
+
'%Y/%m/%d %H:%M:%S',
|
|
25
|
+
'%Y/%m/%d %H:%M',
|
|
26
|
+
'%Y/%m/%d',
|
|
27
|
+
'%m/%d/%Y %H:%M:%S',
|
|
28
|
+
'%m/%d/%Y %H:%M',
|
|
29
|
+
'%m/%d/%Y',
|
|
30
|
+
]
|
|
31
|
+
for fmt in formats:
|
|
32
|
+
try:
|
|
33
|
+
return datetime.strptime(text, fmt)
|
|
34
|
+
except ValueError:
|
|
35
|
+
continue
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def main():
|
|
40
|
+
args = sys.argv[1:]
|
|
41
|
+
utc_mode = '-u' in args or '--utc' in args
|
|
42
|
+
args = [a for a in args if a not in ('-u', '--utc')]
|
|
43
|
+
|
|
44
|
+
if '-h' in args or '--help' in args:
|
|
45
|
+
print(__doc__)
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
if not args or args[0] == 'now':
|
|
49
|
+
now = datetime.now(timezone.utc if utc_mode else None)
|
|
50
|
+
ts = int(now.timestamp())
|
|
51
|
+
if not args:
|
|
52
|
+
print(ts)
|
|
53
|
+
else:
|
|
54
|
+
print(f"Unix: {ts}")
|
|
55
|
+
print(f"Local: {now.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
56
|
+
print(f"UTC: {datetime.fromtimestamp(ts, tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')}")
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
text = ' '.join(args)
|
|
60
|
+
|
|
61
|
+
# Try as Unix timestamp
|
|
62
|
+
try:
|
|
63
|
+
ts = int(text)
|
|
64
|
+
dt_local = datetime.fromtimestamp(ts)
|
|
65
|
+
dt_utc = datetime.fromtimestamp(ts, tz=timezone.utc)
|
|
66
|
+
print(f"Unix: {ts}")
|
|
67
|
+
print(f"Local: {dt_local.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
68
|
+
print(f"UTC: {dt_utc.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
69
|
+
return
|
|
70
|
+
except ValueError:
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
# Try as date string
|
|
74
|
+
dt = parse_date(text)
|
|
75
|
+
if dt:
|
|
76
|
+
ts = int(dt.replace(tzinfo=timezone.utc).timestamp())
|
|
77
|
+
print(f"Date: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
78
|
+
print(f"Unix: {ts}")
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
print(f"Error: cannot parse '{text}'", file=sys.stderr)
|
|
82
|
+
sys.exit(1)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# === Auto-registration metadata ===
|
|
86
|
+
TOOL_META = {
|
|
87
|
+
"name": "epoch",
|
|
88
|
+
"func": "main",
|
|
89
|
+
"desc": 'Unix timestamp / human date converter',
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if __name__ == '__main__':
|
|
93
|
+
main()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""hash_check — Compare file hashes against known values."""
|
|
3
|
+
|
|
4
|
+
import sys
|
|
5
|
+
import hashlib
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
TOOL_META = {
|
|
9
|
+
"name": "hash_check",
|
|
10
|
+
"func": "main",
|
|
11
|
+
"desc": "Compare file hashes against known SHA256/MD5 values",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def file_hash(path, algo="sha256"):
|
|
16
|
+
h = hashlib.new(algo)
|
|
17
|
+
with open(path, "rb") as f:
|
|
18
|
+
for chunk in iter(lambda: f.read(65536), b""):
|
|
19
|
+
h.update(chunk)
|
|
20
|
+
return h.hexdigest()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def main():
|
|
24
|
+
args = sys.argv[1:]
|
|
25
|
+
|
|
26
|
+
if not args or args[0] in ("-h", "--help"):
|
|
27
|
+
print("Usage: evolver hash_check <file> [expected_hash]")
|
|
28
|
+
print(" evolver hash_check --algo <algo> <file> [expected_hash]")
|
|
29
|
+
print()
|
|
30
|
+
print("Algorithms: md5, sha1, sha256 (default), sha512")
|
|
31
|
+
return
|
|
32
|
+
|
|
33
|
+
algo = "sha256"
|
|
34
|
+
files = []
|
|
35
|
+
for a in args:
|
|
36
|
+
if a.startswith("--algo="):
|
|
37
|
+
algo = a.split("=", 1)[1]
|
|
38
|
+
elif a in ("--algo", "-a"):
|
|
39
|
+
continue
|
|
40
|
+
elif algo in ("--algo", "-a"):
|
|
41
|
+
algo = a
|
|
42
|
+
else:
|
|
43
|
+
files.append(a)
|
|
44
|
+
|
|
45
|
+
expected = None
|
|
46
|
+
if len(files) > 1 and not files[1].startswith("--"):
|
|
47
|
+
expected = files[1]
|
|
48
|
+
files = [files[0]]
|
|
49
|
+
|
|
50
|
+
if not files:
|
|
51
|
+
print("Error: no file specified")
|
|
52
|
+
return 1
|
|
53
|
+
|
|
54
|
+
path = files[0]
|
|
55
|
+
if not os.path.exists(path):
|
|
56
|
+
print(f"Error: file not found: {path}")
|
|
57
|
+
return 1
|
|
58
|
+
|
|
59
|
+
actual = file_hash(path, algo)
|
|
60
|
+
|
|
61
|
+
if expected:
|
|
62
|
+
if actual == expected.lower():
|
|
63
|
+
print(f"\033[32m✓ MATCH\033[0m ({algo})")
|
|
64
|
+
else:
|
|
65
|
+
print(f"\033[31m✗ MISMATCH\033[0m ({algo})")
|
|
66
|
+
print(f" Expected: {expected}")
|
|
67
|
+
print(f" Actual: {actual}")
|
|
68
|
+
return 1
|
|
69
|
+
else:
|
|
70
|
+
print(f"{algo.upper()}: {actual} {os.path.basename(path)}")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
if __name__ == "__main__":
|
|
74
|
+
sys.exit(main() or 0)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""hexdump — Hex dump with ASCII view.
|
|
3
|
+
|
|
4
|
+
Usage: hexdump <file>
|
|
5
|
+
echo "hello" | hexdump [--length N]
|
|
6
|
+
|
|
7
|
+
Shows offset, hex bytes, and ASCII representation.
|
|
8
|
+
Zero-dependency (stdlib only).
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import sys
|
|
12
|
+
import os
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def hexdump(data, length=16):
|
|
16
|
+
result = []
|
|
17
|
+
for i in range(0, len(data), length):
|
|
18
|
+
chunk = data[i:i + length]
|
|
19
|
+
hex_part = ' '.join(f'{b:02x}' for b in chunk)
|
|
20
|
+
# Pad hex part if needed
|
|
21
|
+
hex_part = hex_part.ljust(length * 3 - 1)
|
|
22
|
+
ascii_part = ''.join(chr(b) if 32 <= b < 127 else '.' for b in chunk)
|
|
23
|
+
result.append(f'{i:08x} {hex_part} |{ascii_part}|')
|
|
24
|
+
return '\n'.join(result)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def main():
|
|
28
|
+
args = sys.argv[1:]
|
|
29
|
+
show_len = 16
|
|
30
|
+
|
|
31
|
+
for a in args[:]:
|
|
32
|
+
if a == '--length' and len(args) > args.index(a) + 1:
|
|
33
|
+
idx = args.index(a)
|
|
34
|
+
show_len = int(args[idx + 1])
|
|
35
|
+
args.remove(a)
|
|
36
|
+
args.pop(idx) # remove the value too... but index shifted
|
|
37
|
+
elif a.startswith('--length='):
|
|
38
|
+
show_len = int(a.split('=', 1)[1])
|
|
39
|
+
args.remove(a)
|
|
40
|
+
elif a in ('-h', '--help'):
|
|
41
|
+
print(__doc__)
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
# Re-parse length properly
|
|
45
|
+
args = sys.argv[1:]
|
|
46
|
+
filtered = []
|
|
47
|
+
i = 0
|
|
48
|
+
while i < len(args):
|
|
49
|
+
if args[i] == '--length' and i + 1 < len(args):
|
|
50
|
+
show_len = int(args[i + 1])
|
|
51
|
+
i += 2
|
|
52
|
+
elif args[i].startswith('--length='):
|
|
53
|
+
show_len = int(args[i].split('=', 1)[1])
|
|
54
|
+
i += 1
|
|
55
|
+
elif args[i] in ('-h', '--help'):
|
|
56
|
+
print(__doc__)
|
|
57
|
+
return
|
|
58
|
+
else:
|
|
59
|
+
filtered.append(args[i])
|
|
60
|
+
i += 1
|
|
61
|
+
|
|
62
|
+
if filtered:
|
|
63
|
+
path = filtered[0]
|
|
64
|
+
if not os.path.isfile(path):
|
|
65
|
+
print(f"Error: file not found: {path}", file=sys.stderr)
|
|
66
|
+
sys.exit(1)
|
|
67
|
+
with open(path, 'rb') as f:
|
|
68
|
+
data = f.read()
|
|
69
|
+
print(hexdump(data, show_len))
|
|
70
|
+
elif not sys.stdin.isatty():
|
|
71
|
+
data = sys.stdin.buffer.read()
|
|
72
|
+
print(hexdump(data, show_len))
|
|
73
|
+
else:
|
|
74
|
+
print("Usage: hexdump <file>")
|
|
75
|
+
print(" cat <file> | hexdump")
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# === Auto-registration metadata ===
|
|
80
|
+
TOOL_META = {
|
|
81
|
+
"name": "hexdump",
|
|
82
|
+
"func": "main",
|
|
83
|
+
"desc": 'Hex dump with ASCII view (file or stdin)',
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if __name__ == '__main__':
|
|
87
|
+
main()
|