{"id":13815261,"url":"https://github.com/kadimisetty/action-hero","last_synced_at":"2026-01-14T08:45:24.991Z","repository":{"id":56473341,"uuid":"198590698","full_name":"kadimisetty/action-hero","owner":"kadimisetty","description":"Write powerful CLIs with argparse actions that pack a punch! 👊","archived":false,"fork":false,"pushed_at":"2022-07-25T06:31:33.000Z","size":490,"stargazers_count":86,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-12-21T23:14:50.299Z","etag":null,"topics":["argparse","cli","command-line-interface","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kadimisetty.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-24T08:20:19.000Z","updated_at":"2025-10-21T22:49:04.000Z","dependencies_parsed_at":"2022-08-15T19:20:56.788Z","dependency_job_id":null,"html_url":"https://github.com/kadimisetty/action-hero","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/kadimisetty/action-hero","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kadimisetty%2Faction-hero","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kadimisetty%2Faction-hero/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kadimisetty%2Faction-hero/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kadimisetty%2Faction-hero/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kadimisetty","download_url":"https://codeload.github.com/kadimisetty/action-hero/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kadimisetty%2Faction-hero/sbom","scorecard":{"id":546951,"data":{"date":"2025-08-11","repo":{"name":"github.com/kadimisetty/action-hero","commit":"f203e2e130dce970db803d6447bf7518c5e54285"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T09:47:08.135Z","repository_id":56473341,"created_at":"2025-08-20T09:47:08.135Z","updated_at":"2025-08-20T09:47:08.135Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28414693,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["argparse","cli","command-line-interface","python"],"created_at":"2024-08-04T04:03:13.450Z","updated_at":"2026-01-14T08:45:24.970Z","avatar_url":"https://github.com/kadimisetty.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"[action_hero_logo]: ./art/logo.svg\n![Action Hero Logo][action_hero_logo]\n\n\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/action-hero?style=flat-square)](https://pypi.org/project/action-hero/)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![codecov](https://codecov.io/gh/kadimisetty/action-hero/branch/master/graph/badge.svg)](https://codecov.io/gh/kadimisetty/action-hero)\n[![Build Status](https://travis-ci.org/kadimisetty/action-hero.svg?branch=master)](https://travis-ci.org/kadimisetty/action-hero)\n[![PEP8](https://img.shields.io/badge/code%20style-pep8-green.svg)](https://www.python.org/dev/peps/pep-0008/)\n[![PyPI - License](https://img.shields.io/pypi/l/action-hero?style=flat-square)](https://github.com/kadimisetty/action-hero/blob/master/LICENSE)\n\n`action_hero` is a python package that helps you  \n__write powerful command line applications using the built-in `argparse` library__\n\n\n[Introduction](#introduction) · [Quick Usage](#quick-usage) · [Help \u0026 FAQ](#help-and-faq) · [Catalog](#catalog) · [Development](#development)\n\n## Introduction\n\n`argparse` is a python standard library module used to make command line\napplications. `argparse` provides `ArgumentParser` that parses user arguments\nand runs\n[`argparse.Action`](https://docs.python.org/3/library/argparse.html#action)s on\nthem.\n\n__`action_hero`__ augments `argparse` making it more capable by providing a\nlarge number of custom actions.  For example, the __`FileIsWritableAction`\nautomatically verifies that file path(s) accepted as arguments are writable,\neven informing the user if they aren't.__ This saves you the trouble of doing\nall that work yourself.  These actions can be\n[pipelined](#pipelining-multiple-actions) as well. Nice, no?  [Browse the\ncatalog](#catalog) for many such actions.\n\n\n## Quick Usage\n\n__1. Installation__:\n\n```python \npip install action_hero\n```\n\n__2. Quick Usage__: Import an action and specify it when adding an argument to your parser.\n\n```python \nfrom action_hero import FileIsReadableAction\n...\nparser.add_argument(\"--file\", action=FileIsReadableAction)\n...\n```\n\n__3. Full Example__: CLI program that counts number of lines of a file. \n\n```python\n# examples/line_counter.py\nimport argparse\n\nfrom action_hero import FileIsReadableAction\n\n\nif __name__ == \"__main__\":\n\n    # Create parser\n    parser = argparse.ArgumentParser()\n\n    # Add user argument \"--file\" and confirm that it will be readable\n    parser.add_argument(\"--file\", action=FileIsReadableAction)\n\n    # Parse user arguments\n    args = parser.parse_args()\n\n    if args.file:\n        # Print number of lines in file\n        with open(args.file) as f:\n            print(\"{} has {} lines\".format(args.file, len(f.readlines())))\n    else:\n        # Print usage if no arguments were given\n        parser.print_usage()\n```\n\nRun `line_counter.py` on the command line\n\n```bash\n$ ls\nline_counter.py mary.md\n\n$ python line_counter.py --file mary.md\nmary.md has 39 lines\n\n$ python line_counter.py\nusage: line_counter.py [-h] [--file FILE]\n\n$ python line_counter.py --file nofile.md\nusage: line_counter.py [-h] [--file FILE]\nline_counter.py: error: argument --file: File is not readable\n```\n\n**Note**: _Supported Python Versions \u003e= 3.5_\n\n## Help and FAQ\n\n### Accepting `action_values`\nThere are times your action requires an additional value. For instance, when your argument accepts only filenames with `md` or `markdown` extensions. You can use the `FileHasExtensionAction` action for this and pass in the extensions to check for via `action_values`, like so —\n\n```python\nparser.add_argument(\n    \"--file\", \n    action=FileHasExtensionAction,\n    action_values=[\"md\", \"markdown\"]\n)\n\n```\n\nUnless otherwise mentioned,  `action_values` should be provided as a non-empty\nlist of strings. e.g.\n`action_values = [\"md\", \"markdown\"]`.\n\n\n### Pipelining multiple actions\n\nThe `PipelineAction` allows you to run multiple actions as a pipeline. Pass in\nyour pipeline of actions as a list to `action_values`. If one of the actions\nyou're passing in has it's own `action_values`, put that one as a tuple, like\nsuch: `(FileHasExtensionAction, [\"md\", \"markdown\"])`. Here's an example of\npipelining actions for `--file` \n\n1. File has extensions `md` or `markdown`\n2. File exists\n\n```python\nparser.add_argument(\n    \"--file\", \n    action=PipelineAction, \n    action_values=[\n        (FileHasExtensionAction, [\"md\", \"markdown\"]),\n        FileExistsAction\n    ]\n)\n```\n\nAnother helpful feature, this action provides is the _order of error\nreporting_.  In the above example, if the supplied argument file did not have\nthe markdown extensions, the error message would reflect that and exit.  After\nthe user redoes the entry with a valid filename the next action in the pipeline\napplies `FileExistsAction` which checks for existence.  If the file does not\nexist, an error message about file not existing will be shown and exits\nallowing the user to try again.\n\nPipelining can save you a lot of manual condition checks. For example, here's\nhow to check for an _existing markdown file that is writable and empty_, -\n\n```python\nparser.add_argument(\n    \"--file\", \n    action=PipelineAction, \n    action_values=[\n        FileExistsAction, \n        (FileHasExtensionAction, [\"md\", \"markdown\"]),\n        FileIsWritableAction,\n        FileIsEmptyAction\n    ]\n```\n\n### Exceptions in this module\nYou'll come across two different exceptions in `action_hero`.\n\n1. __`ValueError`__: These are intended for you, the CLI developer. You'd want\n   to fix any underlying issue that causes them before releasing your CLI.\n   e.g. when `action_values` is an empty list.\n\n2. __`argparse.ArgumentError`__: These are intended for your CLI's users, so\n   they might use the messages as hints to provide corrent command line\n   options.\n\n### Not capturing user argument exceptions\n`argparse.ArgumentParser` has a slightly unconventional approach to handling\n`argparse.ArgumentError`s. Upon encountering one, it prints argument usage\ninformation, error and exits. I mention this, so you don't setup a `try/except`\naround `parser.parse_args()` to capture that exception. \n\nIn order to maintain consistency with the rest of your `argparse` code,\nexceptions in `action_hero` are also of type `argparse.ArgumentError` and\ncauses system exit as well. More information can be found in [PEP\n389](https://www.python.org/dev/peps/pep-0389/#id46). Since this is\nexpected behavior, I recommend you allow this exception and let it display usage\ninformation and exit.\n\n### Arguments accepting multiple values\nJust like any other `argparse.Action` each `action_hero.Action` handles\nmultiple values and provides relevant error messages.\n\n### FAQ\n\n#### What do I need to know to use `action_hero` in my command line application?\n\nVanilla `argparse` knowledge should do it.\n\n#### Where can I find information about `argparse`?\n\n`argparse` is part of the [Python standard library](https://docs.python.org/3.7/library/argparse.html#module-argparse).\n\n#### Is `action_hero` tied to the `argparse` module?\n\nYes _(but technically no — any project that can use an `argpoarse.Action` should work as long as it handles the `argparse.ArgumentError` exception)_\n\n#### What type are the user argument exceptions?\n\n`argparse.ArgumentError{\"helpful error message\"}`, just like any other `argparse.Action`.\n\n#### Why re-implement actions already provided by `argparse` like the `choices` action?\n\nIn order to include them in `PipelineAction`.\n\n#### There was no mention of humans! Does this work for humans?\n\nYes, it works for humans :)\n\n\n## Catalog\n\n\n1. __Special__ actions:\n\n| Action | Description | `action_values` |\n| --- | --- | --- |\n| __`PipelineAction`__ | Run multiple actions as a pipeline | Actions to run as a pipeline. e.g. `[FileExistsAction, FileIsWritableAction]`. ([Read more](#pipelining-multiple-actions)) |\n| __`DebugAction`__ | Print debug information. There can be multiple of these in a pipeline | |\n\n2. __Path, Directory and File__ related actions:\n\n| Action | Description | `action_values` |\n| --- | --- | --- |\n| __`DirectoryDoesNotExistAction`__ | Check if directory does not exist | |\n| __`DirectoryExistsAction`__ | Check if directory exists | |\n| __`DirectoryIsExecutableAction`__ | Check if directory is executable | |\n| __`DirectoryIsNotExecutableAction`__ | Check if directory is not executable | |\n| __`DirectoryIsNotReadableAction`__ | Check if directory is not readable | |\n| __`DirectoryIsNotWritableAction`__ | Check if directory is not writable | |\n| __`DirectoryIsReadableAction`__ | Check if directory is readable | |\n| __`DirectoryIsValidAction`__ | Check directory is valid | |\n| __`DirectoryIsWritableAction`__ | Check if directory is writable | |\n| __`EnsureDirectoryAction`__ [‡](#footnotes) | Ensure directory exists and create it if it doesnt | |\n| __`EnsureFileAction`__ [‡](#footnotes) | Ensure file exists and create it if it doesnt | |\n| __`FileDoesNotExistAction`__ | Check if file doesnt exist | |\n| __`FileExistsAction`__ | Check if file exists | |\n| __`FileIsEmptyAction`__ | Check if file is empty | |\n| __`FileIsExecutableAction`__ | Check if file is executable | |\n| __`FileIsNotEmptyAction`__ | Check if file is not empty | |\n| __`FileIsNotExecutableAction`__ | Check if file is not executable | |\n| __`FileIsNotReadableAction`__ | Check if file is not readable | |\n| __`FileIsNotWritableAction`__ | Check if file is not writable | |\n| __`FileIsReadableAction`__ | Check if file is readable | |\n| __`FileIsValidAction`__ | Check file is valid | |\n| __`FileIsWritableAction`__ | Check if file is writable | |\n| __`FileHasExtensionAction`__ | Check if file has specified extension | Extensions to check against. e.g. `[\"md\", \"markdown\"]` |\n| __`PathDoesNotExistsAction`__ | Check if path does not exist | |\n| __`PathExistsAction`__ | Check if path exists | |\n| __`PathIsExecutableAction`__ | Check if path is executable | |\n| __`PathIsNotExecutableAction`__ | Check if path is not executable | |\n| __`PathIsNotReadableAction`__ | Check if path is not writable | |\n| __`PathIsNotWritableAction`__ | Check if path is not writable | |\n| __`PathIsReadableAction`__ | Check if path is readable | |\n| __`PathIsValidAction`__ | Check if path is valid | |\n| __`PathIsWritableAction`__ | Check if path is writable | |\n| __`ResolvePathAction`__ [†](#footnotes) | Resolves path to canonical path removing symbolic links if present | |\n\n\n3. __Net \u0026 Email__ related actions:\n\n| Action | Description | `action_values` |\n| --- | --- | --- |\n| __`IPIsValidIPAddressAction`__ | Check if ip is valid ipv4 or ipv6 address | |\n| __`IPIsValidIPv4AddressAction`__ | Check if ip address is valid ipv4 address | |\n| __`IPIsValidIPv6AddressAction`__ | Check if ip address is valid ipv6 address | |\n| __`URLIsNotReachableAction`__ | Check if URL is not reachable | |\n| __`URLIsReachableAction`__ | Check if URL is reachable | |\n| __`URLWithHTTPResponseStatusCodeAction`__ | Check if upplied URL responds with expected HTTP response status code | [Status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) to check against. e.g. `[\"200\", \"201\", \"202\", \"204\"]`  |\n| __`EmailIsValidAction`__ | Checks if email address is valid | |\n\n\n4. __Type__ related actions:\n\n| Action | Description | `action_values` |\n| --- | --- | --- |\n| __`IsConvertibleToFloatAction`__ | Check if value is convertible to float | |\n| __`IsConvertibleToIntAction`__ | Check if value is convertible to int | |\n| __`IsConvertibleToUUIDAction`__ | Checks if value is convertible to UUID | |\n| __`IsFalsyAction`__ | Checks if value is falsy | |\n| __`IsTruthyAction`__ | Checks if value is truthy | |\n\n5. __Range__ related actions:\n\n| Action | Description | `action_values` |\n| --- | --- | --- |\n\n6. __Miscellaneous__ actions:\n\n| Action | Description | `action_values` |\n| --- | --- | --- |\n| __`ChoicesAction`__ | Argument can only have values from provided choice(s)  | Choices e.g. `[\"red\", \"blue\", \"green\"]` |\n| __`NotifyAndContinueAction`__ | Print provided notification message(s) | Message(s) e.g. `[\"This command will be deprecated in the next version.\"]` |\n| __`NotifyAndExitAction`__ | Print provided notification message(s) and Exit | Message(s) e.g. `[\"This command has been deprecated\", \"Try --new-command\"]` |\n| __`ConfirmAction`__ | Print provided message and proceed with user confirmation _yes or no_. | Message(s) e.g. `[\"Proceed to Installation? (Y/n)\"]` |\n| __`GetInputAction`__ [†](#footnotes) | Get user input and save to `self.dest`  | Message(s) e.g. `[\"Favorite color\"]` |\n| __`GetSecretInputAction`__ [†](#footnotes) | Get user input without displaying characters and save to the `self.dest`  | Message(s) e.g. `[\"Enter your Password\"]` |\n| __`LoadJSONFromFileAction`__ [†](#footnotes) | Return loaded JSON file(s) |  |\n| __`LoadYAMLFromFileAction`__ [†](#footnotes) | Return loaded YAML file(s) |  |\n| __`LoadPickleFromFileAction`__ [†](#footnotes) | Return unpickled file(s) |  |\n| __`CollectIntoDictAction`__ [†](#footnotes) | Collect values into a dict | Delimiter(s) to split value(s) into key:value pair(s) e.g. `[\":\", \"=\"]` (If multiple delimiters exist inside a value, only the first match is used) |\n| __`CollectIntoListAction`__ [†](#footnotes) | Collect values into a list |  |\n| __`CollectIntoTupleAction`__ [†](#footnotes) | Collect values into a tuple |  |\n\n\n#### Footnotes\n__†__ Actions that can make changes to `self.dest`    \n__‡__ Actions that can make changes to disk\n\n\n## Development\n\n- __Feedback__: Please use the github issue tracker to submit feedback and recommend ideas for new actions.\n- __Note__: Class inheritance here is dealt with slightly unusually in order to accomodate `argparse` manageably.\n- __Formatting__: PEP8 only. Please format with black using `blacklinelength=79`\n- __License__: The MIT License.\n- __Image Attributions__: Karate by Alex Auda Samora from the Noun Project\n\nThank you for using `action_hero` — [@kadimisetty](https://github.com/kadimisetty) ⭐️✨\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkadimisetty%2Faction-hero","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkadimisetty%2Faction-hero","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkadimisetty%2Faction-hero/lists"}