evolver-tools 34.0.0__tar.gz → 36.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-34.0.0/src/evolver_tools.egg-info → evolver_tools-36.0.0}/PKG-INFO +7 -6
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/README.md +6 -5
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/pyproject.toml +1 -1
- evolver_tools-36.0.0/src/evolver_tools/__init__.py +4 -0
- evolver_tools-36.0.0/src/evolver_tools/cli.py +191 -0
- evolver_tools-36.0.0/src/evolver_tools/license.py +359 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/agent_b_tool.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/b64/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +1 -1
- evolver_tools-36.0.0/src/evolver_tools/vendor/color_convert.py +138 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/colors/__init__.py +1 -1
- evolver_tools-36.0.0/src/evolver_tools/vendor/csv_concat.py +77 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/diff_csv.py +1 -1
- evolver_tools-36.0.0/src/evolver_tools/vendor/diff_lines.py +147 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/dt_convert.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/env_manager.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ff/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/find_dups/cli.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/fmt/__init__.py +1 -1
- evolver_tools-36.0.0/src/evolver_tools/vendor/git_ignore.py +217 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/http_live/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/license_cli/cli.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/log_analyzer.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +1 -1
- evolver_tools-36.0.0/src/evolver_tools/vendor/mime_type.py +138 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/nb/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/passgen/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ren/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/timer/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/treedir/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/treedir/__main__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/xml2json.py +1 -1
- {evolver_tools-34.0.0 → evolver_tools-36.0.0/src/evolver_tools.egg-info}/PKG-INFO +7 -6
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools.egg-info/SOURCES.txt +6 -5
- evolver_tools-34.0.0/src/evolver_tools/__init__.py +0 -4
- evolver_tools-34.0.0/src/evolver_tools/cli.py +0 -66
- evolver_tools-34.0.0/src/evolver_tools/vendor/ansi_to_txt.py +0 -89
- evolver_tools-34.0.0/src/evolver_tools/vendor/emoji_cli.py +0 -465
- evolver_tools-34.0.0/src/evolver_tools/vendor/html_strip.py +0 -143
- evolver_tools-34.0.0/src/evolver_tools/vendor/json_patch.py +0 -319
- evolver_tools-34.0.0/src/evolver_tools/vendor/markdown_format.py +0 -246
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/LICENSE +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/setup.cfg +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/autoreg.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ascii_banner.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/backup.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/base32.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/base58.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/case_convert.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/code_review.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cowsay.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/crc_check.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cron_check.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_dedup.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_filter.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_head.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_merge.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_pretty.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_slice.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_sort.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_to_table.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/csv_view.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/date_diff.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/dedup_files.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/diff_files.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/diff_yaml.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/env_sorter.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/env_template.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/epoch.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/factor.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/file_find.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/file_patch.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/file_type.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/find_empty.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/fold.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/gzip_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/hash_check.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/hexdec.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/hexdump.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/http_server.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/http_status.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/humanize.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ip_info.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/join.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/joke.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_diff.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_flatten.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_keys.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_merge.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_path.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_sort.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_to_table.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/json_to_yaml.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/jwt_decode.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/license.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/link_check.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/mac_address.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/markdown_lint.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/markdown_to_html.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/math_eval.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/morse.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/nl.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/pdf_info.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/pomodoro.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/port_scan.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/qc_calc.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/qc_report.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/qc_sample.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/qr_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/quote.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/random.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/random_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/random_string.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/restore.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/rot13.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/scan_open_ports.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/seq.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/slugify.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/split.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/subnet.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/template.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/text_dedent.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/text_wrap.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/time_duration.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/timeout.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/tr.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/tree.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/tsv2csv.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/url_parser.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/uuid_gen.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/watch.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/world_clock.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/xml_format.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools/vendor/yes.py +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
- {evolver_tools-34.0.0 → evolver_tools-36.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:
|
|
3
|
+
Version: 36.0.0
|
|
4
4
|
Summary: 244 CLI tools + 9 flagship projects — one pip install
|
|
5
5
|
Author: EVOLVER
|
|
6
6
|
License-Expression: MIT
|
|
@@ -24,15 +24,15 @@ Dynamic: license-file
|
|
|
24
24
|
|
|
25
25
|
**244 CLI tools + 9 flagship projects — one `pip install`.**
|
|
26
26
|
|
|
27
|
-
Zero-dependency
|
|
27
|
+
Zero-dependency, cross-platform, production-ready. Version **36.0.0**.
|
|
28
28
|
Systems ops, data processing, text manipulation, security, dev tooling, and creative utilities.
|
|
29
|
-
All in a single install — not
|
|
29
|
+
All in a single install — not 238 separate packages.
|
|
30
30
|
|
|
31
31
|
## Quick Start
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
34
|
pip install evolver-tools
|
|
35
|
-
evtool list # Show all
|
|
35
|
+
evtool list # Show all 233+ tools
|
|
36
36
|
evtool sysmon # Launch system monitor
|
|
37
37
|
evtool ff < data.txt # Fuzzy search through data
|
|
38
38
|
evtool csv-stats data.csv # Analyze CSV columns
|
|
@@ -281,7 +281,8 @@ Nine flagship projects ship as integrated CLI+TUI suites within evolver-tools:
|
|
|
281
281
|
## Requirements
|
|
282
282
|
|
|
283
283
|
- Python 3.8+
|
|
284
|
-
- No external dependencies for
|
|
284
|
+
- No external dependencies for 230 of 233 tools (stdlib only)
|
|
285
|
+
- A few tools (sysmon, sysmon-pro, etc.) optionally use psutil
|
|
285
286
|
- Network-dependent tools (ipinfo, weather, etc.) use public APIs
|
|
286
287
|
|
|
287
288
|
## Pricing
|
|
@@ -290,7 +291,7 @@ evolver-tools is **MIT open source** and free forever for all tools.
|
|
|
290
291
|
|
|
291
292
|
| Tier | Price | What you get |
|
|
292
293
|
|------|-------|-------------|
|
|
293
|
-
| **Free (MIT)** | ¥0 | All
|
|
294
|
+
| **Free (MIT)** | ¥0 | All 233+ tools, full source, forever |
|
|
294
295
|
| **Full Suite** | ¥79 one-time | All tools + priority support + early access + name in credits |
|
|
295
296
|
| **Sponsor** | ¥5/month | GitHub Sponsors badge + Discord + vote on priorities |
|
|
296
297
|
| **Enterprise Basic** | ¥500/year | Custom tool development |
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
**244 CLI tools + 9 flagship projects — one `pip install`.**
|
|
4
4
|
|
|
5
|
-
Zero-dependency
|
|
5
|
+
Zero-dependency, cross-platform, production-ready. Version **36.0.0**.
|
|
6
6
|
Systems ops, data processing, text manipulation, security, dev tooling, and creative utilities.
|
|
7
|
-
All in a single install — not
|
|
7
|
+
All in a single install — not 238 separate packages.
|
|
8
8
|
|
|
9
9
|
## Quick Start
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
pip install evolver-tools
|
|
13
|
-
evtool list # Show all
|
|
13
|
+
evtool list # Show all 233+ tools
|
|
14
14
|
evtool sysmon # Launch system monitor
|
|
15
15
|
evtool ff < data.txt # Fuzzy search through data
|
|
16
16
|
evtool csv-stats data.csv # Analyze CSV columns
|
|
@@ -259,7 +259,8 @@ Nine flagship projects ship as integrated CLI+TUI suites within evolver-tools:
|
|
|
259
259
|
## Requirements
|
|
260
260
|
|
|
261
261
|
- Python 3.8+
|
|
262
|
-
- No external dependencies for
|
|
262
|
+
- No external dependencies for 230 of 233 tools (stdlib only)
|
|
263
|
+
- A few tools (sysmon, sysmon-pro, etc.) optionally use psutil
|
|
263
264
|
- Network-dependent tools (ipinfo, weather, etc.) use public APIs
|
|
264
265
|
|
|
265
266
|
## Pricing
|
|
@@ -268,7 +269,7 @@ evolver-tools is **MIT open source** and free forever for all tools.
|
|
|
268
269
|
|
|
269
270
|
| Tier | Price | What you get |
|
|
270
271
|
|------|-------|-------------|
|
|
271
|
-
| **Free (MIT)** | ¥0 | All
|
|
272
|
+
| **Free (MIT)** | ¥0 | All 233+ tools, full source, forever |
|
|
272
273
|
| **Full Suite** | ¥79 one-time | All tools + priority support + early access + name in credits |
|
|
273
274
|
| **Sponsor** | ¥5/month | GitHub Sponsors badge + Discord + vote on priorities |
|
|
274
275
|
| **Enterprise Basic** | ¥500/year | Custom tool development |
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""evolver CLI - Unified interface for all EVOLVER tools.
|
|
3
|
+
|
|
4
|
+
Tools are auto-discovered via TOOL_META in each vendor module.
|
|
5
|
+
Free/PRO tier management via evolver_tools.license module.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
evolver list # List all tools (FREE/PRO tagged)
|
|
9
|
+
evolver <toolname> [args...] # Run a tool
|
|
10
|
+
evolver license <key> # Install a PRO license key
|
|
11
|
+
evolver status # Show licensing status
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import sys
|
|
15
|
+
import importlib
|
|
16
|
+
|
|
17
|
+
from evolver_tools.autoreg import auto_discover
|
|
18
|
+
|
|
19
|
+
# Try to import license module — degrade gracefully on failure
|
|
20
|
+
try:
|
|
21
|
+
from evolver_tools.license import (
|
|
22
|
+
tool_is_pro,
|
|
23
|
+
tool_is_free,
|
|
24
|
+
get_tier,
|
|
25
|
+
require_pro,
|
|
26
|
+
install_key,
|
|
27
|
+
status_text,
|
|
28
|
+
FREE_TOOLS,
|
|
29
|
+
PRO_TOOLS_CATEGORIES,
|
|
30
|
+
)
|
|
31
|
+
_LICENSE_AVAILABLE = True
|
|
32
|
+
except ImportError:
|
|
33
|
+
_LICENSE_AVAILABLE = False
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def list_tools():
|
|
37
|
+
"""Display all available tools with FREE/PRO tags."""
|
|
38
|
+
tools = auto_discover()
|
|
39
|
+
print('\x1b[1;36m===== EVOLVER Tools v31.0.0 =====\x1b[0m')
|
|
40
|
+
print()
|
|
41
|
+
|
|
42
|
+
free_count = 0
|
|
43
|
+
pro_count = 0
|
|
44
|
+
unknown_count = 0
|
|
45
|
+
|
|
46
|
+
for name, info in sorted(tools.items()):
|
|
47
|
+
if _LICENSE_AVAILABLE:
|
|
48
|
+
tier = get_tier(name)
|
|
49
|
+
if tier == "FREE":
|
|
50
|
+
tag = "\x1b[1;32mFREE\x1b[0m"
|
|
51
|
+
free_count += 1
|
|
52
|
+
elif tier == "PRO":
|
|
53
|
+
tag = "\x1b[1;33mPRO \x1b[0m"
|
|
54
|
+
pro_count += 1
|
|
55
|
+
else:
|
|
56
|
+
tag = " "
|
|
57
|
+
unknown_count += 1
|
|
58
|
+
else:
|
|
59
|
+
tag = " "
|
|
60
|
+
unknown_count += 1
|
|
61
|
+
|
|
62
|
+
print(f' {tag} \033[1;36m{name:<18}\033[0m {info["desc"]}')
|
|
63
|
+
|
|
64
|
+
print()
|
|
65
|
+
if _LICENSE_AVAILABLE:
|
|
66
|
+
print(f' Total: {len(tools)} tools | \x1b[1;32m{free_count} FREE\x1b[0m | '
|
|
67
|
+
f'\x1b[1;33m{pro_count} PRO\x1b[0m')
|
|
68
|
+
print()
|
|
69
|
+
print(' Usage: evolver <toolname> [args...]')
|
|
70
|
+
print(' evolver list')
|
|
71
|
+
print(' evolver license <key> (install PRO license)')
|
|
72
|
+
print(' evolver status')
|
|
73
|
+
else:
|
|
74
|
+
print(f' Total: {len(tools)} tools')
|
|
75
|
+
print()
|
|
76
|
+
print('Usage: evolver <toolname> [args...]')
|
|
77
|
+
print(' evolver list')
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def run_tool(tool_name, args):
|
|
81
|
+
"""Run a tool by name with args, checking license if applicable."""
|
|
82
|
+
tools = auto_discover()
|
|
83
|
+
|
|
84
|
+
if tool_name not in tools:
|
|
85
|
+
print(f'Unknown tool: {tool_name}')
|
|
86
|
+
sys.exit(1)
|
|
87
|
+
|
|
88
|
+
# License gate for PRO tools
|
|
89
|
+
if _LICENSE_AVAILABLE:
|
|
90
|
+
if not require_pro(tool_name):
|
|
91
|
+
sys.exit(1)
|
|
92
|
+
|
|
93
|
+
info = tools[tool_name]
|
|
94
|
+
mod_path = info["module"]
|
|
95
|
+
func_name = info["func"]
|
|
96
|
+
old_argv = sys.argv
|
|
97
|
+
sys.argv = [tool_name] + args
|
|
98
|
+
try:
|
|
99
|
+
mod = importlib.import_module(mod_path)
|
|
100
|
+
func = getattr(mod, func_name)
|
|
101
|
+
result = func()
|
|
102
|
+
if result is not None:
|
|
103
|
+
print(result)
|
|
104
|
+
except KeyboardInterrupt:
|
|
105
|
+
pass
|
|
106
|
+
except Exception as e:
|
|
107
|
+
print(f'Error running {tool_name}: {e}', file=sys.stderr)
|
|
108
|
+
sys.exit(1)
|
|
109
|
+
finally:
|
|
110
|
+
sys.argv = old_argv
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def cmd_install_license(args):
|
|
114
|
+
"""Install a PRO license key from argument or stdin."""
|
|
115
|
+
if args:
|
|
116
|
+
key = args[0]
|
|
117
|
+
else:
|
|
118
|
+
# Read from stdin (pipe)
|
|
119
|
+
key = sys.stdin.read().strip()
|
|
120
|
+
if not key:
|
|
121
|
+
print('Usage: evolver license <key>')
|
|
122
|
+
print(' or: echo "<key>" | evolver license')
|
|
123
|
+
sys.exit(1)
|
|
124
|
+
|
|
125
|
+
if not _LICENSE_AVAILABLE:
|
|
126
|
+
print('License module not available — cannot install key.')
|
|
127
|
+
sys.exit(1)
|
|
128
|
+
|
|
129
|
+
from evolver_tools.license import validate_key, install_key
|
|
130
|
+
|
|
131
|
+
# Validate first
|
|
132
|
+
if not validate_key(key):
|
|
133
|
+
print('\x1b[1;31m✗ Invalid license key.\x1b[0m')
|
|
134
|
+
print(' Get a valid key at https://evolver.dev/pro')
|
|
135
|
+
sys.exit(1)
|
|
136
|
+
|
|
137
|
+
# Install
|
|
138
|
+
if install_key(key):
|
|
139
|
+
print('\x1b[1;32m✓ License key installed successfully!\x1b[0m')
|
|
140
|
+
try:
|
|
141
|
+
import json
|
|
142
|
+
payload = json.loads(key)
|
|
143
|
+
print(f' Owner: {payload.get("owner", "unknown")}')
|
|
144
|
+
except Exception:
|
|
145
|
+
pass
|
|
146
|
+
else:
|
|
147
|
+
print('\x1b[1;31m✗ Failed to write license key.\x1b[0m')
|
|
148
|
+
sys.exit(1)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def cmd_status():
|
|
152
|
+
"""Show licensing status."""
|
|
153
|
+
if not _LICENSE_AVAILABLE:
|
|
154
|
+
print('\x1b[1;33m===== EVOLVER Tools Status =====\x1b[0m')
|
|
155
|
+
print()
|
|
156
|
+
print(' License module not available.')
|
|
157
|
+
print(' All tools available as FREE.')
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
print('\x1b[1;36m===== EVOLVER Tools Status =====\x1b[0m')
|
|
161
|
+
print()
|
|
162
|
+
print(status_text())
|
|
163
|
+
tools = auto_discover()
|
|
164
|
+
free_actual = sum(1 for n in tools if get_tier(n) == "FREE")
|
|
165
|
+
pro_actual = sum(1 for n in tools if get_tier(n) == "PRO")
|
|
166
|
+
print(f' FREE tools available: {free_actual}')
|
|
167
|
+
print(f' PRO tools available: {pro_actual}')
|
|
168
|
+
print()
|
|
169
|
+
print(f' Get PRO: https://evolver.dev/pro')
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def main():
|
|
173
|
+
if len(sys.argv) < 2 or sys.argv[1] in ("-h", "--help"):
|
|
174
|
+
list_tools()
|
|
175
|
+
return
|
|
176
|
+
|
|
177
|
+
cmd = sys.argv[1]
|
|
178
|
+
args = sys.argv[2:]
|
|
179
|
+
|
|
180
|
+
if cmd == "list":
|
|
181
|
+
list_tools()
|
|
182
|
+
elif cmd == "license":
|
|
183
|
+
cmd_install_license(args)
|
|
184
|
+
elif cmd == "status":
|
|
185
|
+
cmd_status()
|
|
186
|
+
else:
|
|
187
|
+
run_tool(cmd, args)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
if __name__ == "__main__":
|
|
191
|
+
main()
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""License verification module for EVOLVER Tools freemium split.
|
|
3
|
+
|
|
4
|
+
Provides HMAC-based offline license validation, tool classification
|
|
5
|
+
(FREE vs PRO), and admin key generation.
|
|
6
|
+
|
|
7
|
+
License key format: HMAC-SHA256(owner_name, secret_seed)
|
|
8
|
+
Stored at: ~/.evolver/license.key
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import hmac
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
|
|
17
|
+
# ---------------------------------------------------------------------------
|
|
18
|
+
# Secret seed — change this in production! Keep it safe.
|
|
19
|
+
# This is the "master secret" used both to generate and validate keys.
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
_SECRET_SEED = b"evolver-tools-2026-freemium-s3cr3t-s33d"
|
|
22
|
+
|
|
23
|
+
# ---------------------------------------------------------------------------
|
|
24
|
+
# FREE_TOOLS: 30 essential tools available without a license.
|
|
25
|
+
# These are carefully selected to give maximum utility while keeping
|
|
26
|
+
# advanced/specialized tools behind the PRO tier.
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
FREE_TOOLS = frozenset({
|
|
29
|
+
# -- Encoding / Decoding --
|
|
30
|
+
"b64", # Base64 encode/decode
|
|
31
|
+
"base32", # Base32 encode/decode
|
|
32
|
+
"base58", # Base58 encode/decode
|
|
33
|
+
"rot13", # ROT13 text transformation
|
|
34
|
+
"hexdec", # Hex ↔ decimal converter
|
|
35
|
+
"uri-encode", # URI percent-encoding
|
|
36
|
+
"url_parser", # URL parser / extractor
|
|
37
|
+
|
|
38
|
+
# -- Text Processing --
|
|
39
|
+
"case-convert", # Text case conversion (camel, snake, kebab, etc.)
|
|
40
|
+
"slugify", # URL-safe slug generation
|
|
41
|
+
"text-stats", # Character / word / line statistics
|
|
42
|
+
"text-wrap", # Word-wrap / fill text
|
|
43
|
+
"text-dedent", # Remove common leading whitespace
|
|
44
|
+
"tr", # Translate / replace characters
|
|
45
|
+
"nl", # Number lines
|
|
46
|
+
"join", # Join lines with separator
|
|
47
|
+
"shuffle", # Randomly shuffle lines
|
|
48
|
+
"yes", # Generate repeating output
|
|
49
|
+
"seq", # Generate number sequences
|
|
50
|
+
|
|
51
|
+
# -- Data Format Conversion --
|
|
52
|
+
"json-pretty", # Pretty-print JSON
|
|
53
|
+
"json-keys", # Extract keys from JSON docs
|
|
54
|
+
"json-to-table",# JSON → table display
|
|
55
|
+
"yaml-validate",# Validate YAML syntax
|
|
56
|
+
"yaml2json", # YAML → JSON
|
|
57
|
+
"toml2json", # TOML → JSON
|
|
58
|
+
|
|
59
|
+
# -- CSV --
|
|
60
|
+
"csv-pretty", # Pretty-print CSV tables
|
|
61
|
+
"csv-head", # View first N rows of a CSV
|
|
62
|
+
"csv-view", # Interactive CSV viewer
|
|
63
|
+
|
|
64
|
+
# -- Utility --
|
|
65
|
+
"humanize", # Human-readable filesizes, numbers, dates
|
|
66
|
+
"unit-convert", # Unit conversion (metric, imperial, etc.)
|
|
67
|
+
"epoch", # Unix timestamp ↔ human date
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
# ---------------------------------------------------------------------------
|
|
71
|
+
# PRO_TOOLS: everything else is PRO (requires license).
|
|
72
|
+
# Computed from auto_discover() at runtime.
|
|
73
|
+
# ---------------------------------------------------------------------------
|
|
74
|
+
PRO_TOOLS_CATEGORIES = {
|
|
75
|
+
"advanced-csv": {
|
|
76
|
+
"csv-sort", "csv-filter", "csv-slice",
|
|
77
|
+
"csv-dedup", "csv-validate", "csv-to-table", "csv2json",
|
|
78
|
+
"csv-stats", "diff-csv", "csv_merge",
|
|
79
|
+
},
|
|
80
|
+
"json-tools": {
|
|
81
|
+
"json-sort", "json-diff", "json_merge", "json_flatten",
|
|
82
|
+
"json-path", "json-schema-validate", "json2ini", "ini2json",
|
|
83
|
+
"json2csv", "jsonql", "jq-lite",
|
|
84
|
+
},
|
|
85
|
+
"data-conversion": {
|
|
86
|
+
"xml-format", "xml2json", "html2md", "html2markdown",
|
|
87
|
+
"tsv2csv", "sql2csv", "excel2csv", "yaml2toml",
|
|
88
|
+
"diff-yaml", "diff_files", "diff",
|
|
89
|
+
},
|
|
90
|
+
"file-operations": {
|
|
91
|
+
"file-type", "file_find", "file-watch", "file-encrypt",
|
|
92
|
+
"file-splitter", "file-joiner", "file-patch",
|
|
93
|
+
"find-empty", "dedup-files", "find-dups",
|
|
94
|
+
"checksum-dir", "disk-usage", "dirsize", "tree",
|
|
95
|
+
},
|
|
96
|
+
"network": {
|
|
97
|
+
"dns-lookup", "whois-lookup", "geo-ip", "ip_info",
|
|
98
|
+
"ip-location", "ipcalc", "ipinfo",
|
|
99
|
+
"http-headers", "http-status", "http_server",
|
|
100
|
+
"link-check", "ssl-check", "cert-check", "cert-info",
|
|
101
|
+
"net-speed", "route-trace", "subnet",
|
|
102
|
+
"scan-ports", "scan-open-ports", "port_scan",
|
|
103
|
+
"network-scan", "firewall-rule",
|
|
104
|
+
"web-download", "weather-cli",
|
|
105
|
+
"http-live", "siege-lite", "crypto-price",
|
|
106
|
+
},
|
|
107
|
+
"security": {
|
|
108
|
+
"hash-file", "hash_check", "hashsum", "crc_check",
|
|
109
|
+
"file-encrypt", "password-strength", "secret-scanner",
|
|
110
|
+
"ssh-key-gen", "otp-gen", "jwt-decode",
|
|
111
|
+
"crypto-box", "config-vault",
|
|
112
|
+
},
|
|
113
|
+
"development": {
|
|
114
|
+
"code-stats", "code-review", "code-auditor",
|
|
115
|
+
"dep-graph", "db-schema", "db-mate", "sqlite-cli",
|
|
116
|
+
"env-diff", "env-sorter", "env-manager", "env_template",
|
|
117
|
+
"envcheck", "config-validator",
|
|
118
|
+
"git-stats", "git-log-pretty", "git-branch-cleaner",
|
|
119
|
+
"pr-tool", "changelog-gen", "project-doctor",
|
|
120
|
+
"template", "search-files", "replace-text",
|
|
121
|
+
"json-schema-validate", "api-tester",
|
|
122
|
+
},
|
|
123
|
+
"monitoring": {
|
|
124
|
+
"sysmon", "sysmon-pro", "system-info", "disk-cleanup",
|
|
125
|
+
"process-kill", "service-check", "log-tail",
|
|
126
|
+
"log-analyzer", "log-hawk", "watch", "timeout",
|
|
127
|
+
"temp-cleaner", "dev-dashboard",
|
|
128
|
+
},
|
|
129
|
+
"productivity": {
|
|
130
|
+
"pomodoro", "timer", "timer-pro", "stopwatch",
|
|
131
|
+
"todo-cli", "note-taker", "reminder",
|
|
132
|
+
"bookmark", "calendar-cli", "cal",
|
|
133
|
+
"key-value-store", "backup", "restore", "ff",
|
|
134
|
+
},
|
|
135
|
+
"media": {
|
|
136
|
+
"qrcode", "qr_cli", "ascii-gen", "ascii-banner",
|
|
137
|
+
"banner-gen", "figlet", "figlet-cli",
|
|
138
|
+
"rainbow", "colorize", "ansi-strip",
|
|
139
|
+
"morse", "cowsay", "joke", "quote",
|
|
140
|
+
"spinner", "progress-bar", "pipe-viewer",
|
|
141
|
+
"image-meta", "screenshot-cli", "screen-recorder",
|
|
142
|
+
"markdown-preview", "markdown-lint", "markdown-toc",
|
|
143
|
+
"markdown-check",
|
|
144
|
+
"pdf-text", "pdf_info",
|
|
145
|
+
"media-studio", "net-analyzer",
|
|
146
|
+
},
|
|
147
|
+
"data-processing": {
|
|
148
|
+
"gzip-cli", "hexdump", "hex-tool",
|
|
149
|
+
"treedir", "fold", "split",
|
|
150
|
+
"sort", "uniq", "ren", "fmt",
|
|
151
|
+
"wordcount", "random", "random-string", "random-cli",
|
|
152
|
+
"dice-roll", "factor", "macrogen",
|
|
153
|
+
"clipboard", "colors", "nb",
|
|
154
|
+
"json-diff", "json-sort", "math_eval",
|
|
155
|
+
},
|
|
156
|
+
"datetime": {
|
|
157
|
+
"cron", "cron-check", "cron-pretty", "crontab-helper",
|
|
158
|
+
"date_diff", "dt", "time-duration",
|
|
159
|
+
"world-clock",
|
|
160
|
+
},
|
|
161
|
+
"agent-tools": {
|
|
162
|
+
"agent-b-tool", "search-history",
|
|
163
|
+
"audit-log", "web-summary",
|
|
164
|
+
},
|
|
165
|
+
"qc-tools": {
|
|
166
|
+
"qc-sample", "qc-report",
|
|
167
|
+
},
|
|
168
|
+
"config-serialization": {
|
|
169
|
+
"ini-parser",
|
|
170
|
+
},
|
|
171
|
+
"misc": {
|
|
172
|
+
"license", "license-cli", "urlparse",
|
|
173
|
+
"mac-address", "docker-helper",
|
|
174
|
+
"uuid_gen", "uuid",
|
|
175
|
+
"smellfinder", "chart-cli",
|
|
176
|
+
"passgen", "portcheck",
|
|
177
|
+
},
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
# Flatten PRO_TOOLS into a set for O(1) lookup
|
|
181
|
+
_PRO_TOOLS_SET = set()
|
|
182
|
+
for cat, tools in PRO_TOOLS_CATEGORIES.items():
|
|
183
|
+
_PRO_TOOLS_SET.update(tools)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def tool_is_pro(tool_name: str) -> bool:
|
|
187
|
+
"""Return True if *tool_name* is a PRO-tier tool."""
|
|
188
|
+
return tool_name in _PRO_TOOLS_SET
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def tool_is_free(tool_name: str) -> bool:
|
|
192
|
+
"""Return True if *tool_name* is a FREE-tier tool."""
|
|
193
|
+
return tool_name in FREE_TOOLS
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def get_tier(tool_name: str) -> str:
|
|
197
|
+
"""Return 'FREE', 'PRO', or 'UNKNOWN' for a given tool name."""
|
|
198
|
+
if tool_name in FREE_TOOLS:
|
|
199
|
+
return "FREE"
|
|
200
|
+
if tool_name in _PRO_TOOLS_SET:
|
|
201
|
+
return "PRO"
|
|
202
|
+
return "UNKNOWN"
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
# ---------------------------------------------------------------------------
|
|
206
|
+
# License key I/O
|
|
207
|
+
# ---------------------------------------------------------------------------
|
|
208
|
+
|
|
209
|
+
def _license_path():
|
|
210
|
+
return os.path.expanduser("~/.evolver/license.key")
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _ensure_dir():
|
|
214
|
+
path = _license_path()
|
|
215
|
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
216
|
+
return path
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _sign(owner_name: str) -> str:
|
|
220
|
+
"""Create an HMAC-SHA256 signature for *owner_name*."""
|
|
221
|
+
sig = hmac.new(_SECRET_SEED, owner_name.encode("utf-8"), hashlib.sha256).hexdigest()
|
|
222
|
+
return sig
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def generate_key(owner_name: str) -> str:
|
|
226
|
+
"""Generate a signed license key for *owner_name*.
|
|
227
|
+
|
|
228
|
+
This is an admin function — use it to generate keys you sell.
|
|
229
|
+
Key format: JSON blob with owner name + HMAC signature.
|
|
230
|
+
|
|
231
|
+
Returns the key string (suitable for writing to ~/.evolver/license.key).
|
|
232
|
+
"""
|
|
233
|
+
sig = _sign(owner_name)
|
|
234
|
+
payload = {
|
|
235
|
+
"owner": owner_name,
|
|
236
|
+
"sig": sig,
|
|
237
|
+
}
|
|
238
|
+
return json.dumps(payload)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def validate_key(key: str) -> bool:
|
|
242
|
+
"""Validate a license key string.
|
|
243
|
+
|
|
244
|
+
Returns True if the key is properly signed, False otherwise.
|
|
245
|
+
"""
|
|
246
|
+
try:
|
|
247
|
+
payload = json.loads(key)
|
|
248
|
+
owner = payload.get("owner", "")
|
|
249
|
+
sig = payload.get("sig", "")
|
|
250
|
+
expected = _sign(owner)
|
|
251
|
+
# Constant-time comparison
|
|
252
|
+
return hmac.compare_digest(sig, expected)
|
|
253
|
+
except (json.JSONDecodeError, KeyError, TypeError):
|
|
254
|
+
return False
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def install_key(key: str) -> bool:
|
|
258
|
+
"""Write *key* to ~/.evolver/license.key.
|
|
259
|
+
|
|
260
|
+
Returns True on success.
|
|
261
|
+
"""
|
|
262
|
+
path = _ensure_dir()
|
|
263
|
+
try:
|
|
264
|
+
with open(path, "w") as f:
|
|
265
|
+
f.write(key.strip() + "\n")
|
|
266
|
+
return True
|
|
267
|
+
except OSError:
|
|
268
|
+
return False
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def check_license() -> dict | None:
|
|
272
|
+
"""Read and validate the installed license key.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
dict with {"owner": str, "valid": bool} if a key exists,
|
|
276
|
+
None if no key is installed.
|
|
277
|
+
"""
|
|
278
|
+
path = _license_path()
|
|
279
|
+
if not os.path.isfile(path):
|
|
280
|
+
return None
|
|
281
|
+
try:
|
|
282
|
+
with open(path) as f:
|
|
283
|
+
key = f.read().strip()
|
|
284
|
+
except OSError:
|
|
285
|
+
return None
|
|
286
|
+
if not key:
|
|
287
|
+
return None
|
|
288
|
+
try:
|
|
289
|
+
payload = json.loads(key)
|
|
290
|
+
except json.JSONDecodeError:
|
|
291
|
+
return {"owner": "unknown", "valid": False}
|
|
292
|
+
|
|
293
|
+
valid = validate_key(key)
|
|
294
|
+
return {
|
|
295
|
+
"owner": payload.get("owner", "unknown"),
|
|
296
|
+
"valid": valid,
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def is_licensed() -> bool:
|
|
301
|
+
"""Quick check — is a valid license installed?"""
|
|
302
|
+
info = check_license()
|
|
303
|
+
return info is not None and info.get("valid", False)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def require_pro(tool_name: str) -> bool:
|
|
307
|
+
"""Check if *tool_name* can be used. Returns True if allowed.
|
|
308
|
+
|
|
309
|
+
- FREE tools → always allowed
|
|
310
|
+
- PRO tools → allowed only if license is valid
|
|
311
|
+
- Unknown tools → allowed (graceful degradation)
|
|
312
|
+
|
|
313
|
+
If a PRO tool is denied, prints an error message.
|
|
314
|
+
"""
|
|
315
|
+
tier = get_tier(tool_name)
|
|
316
|
+
if tier != "PRO":
|
|
317
|
+
return True
|
|
318
|
+
|
|
319
|
+
if is_licensed():
|
|
320
|
+
return True
|
|
321
|
+
|
|
322
|
+
print(
|
|
323
|
+
f"\n"
|
|
324
|
+
f" 🔒 *{tool_name}* is a **PRO tool**.\n"
|
|
325
|
+
f" Get a license at https://evolver.dev/pro\n"
|
|
326
|
+
f"\n"
|
|
327
|
+
f" Or try one of the 30 FREE tools: "
|
|
328
|
+
f"evolver list\n",
|
|
329
|
+
file=sys.stderr,
|
|
330
|
+
)
|
|
331
|
+
return False
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
# ---------------------------------------------------------------------------
|
|
335
|
+
# CLI helpers
|
|
336
|
+
# ---------------------------------------------------------------------------
|
|
337
|
+
|
|
338
|
+
def status_text() -> str:
|
|
339
|
+
"""Return a human-readable summary of licensing status."""
|
|
340
|
+
info = check_license()
|
|
341
|
+
pro_count = len(_PRO_TOOLS_SET)
|
|
342
|
+
|
|
343
|
+
if info is None:
|
|
344
|
+
return (
|
|
345
|
+
f" License: 🔴 Not installed\n"
|
|
346
|
+
f" Tier: FREE (30 tools)\n"
|
|
347
|
+
f" PRO: {pro_count} tools locked — get a license at https://evolver.dev/pro\n"
|
|
348
|
+
)
|
|
349
|
+
if info.get("valid"):
|
|
350
|
+
return (
|
|
351
|
+
f" License: 🟢 Valid\n"
|
|
352
|
+
f" Owner: {info['owner']}\n"
|
|
353
|
+
f" Tier: PRO (all {pro_count + len(FREE_TOOLS)} tools unlocked)\n"
|
|
354
|
+
)
|
|
355
|
+
return (
|
|
356
|
+
f" License: 🔴 Invalid key\n"
|
|
357
|
+
f" Owner: {info['owner']}\n"
|
|
358
|
+
f" Tier: FREE (30 tools) — re-install with 'evolver license <key>'\n"
|
|
359
|
+
)
|