{"id":339,"name":null,"description":"A beautiful and powerful interactive command line prompt","url":"https://github.com/piotrmurach/tty-prompt","last_synced_at":"2026-04-30T16:30:27.384Z","repository":{"id":43465320,"uuid":"45350538","full_name":"piotrmurach/tty-prompt","owner":"piotrmurach","description":"A beautiful and powerful interactive command line prompt","archived":false,"fork":false,"pushed_at":"2024-07-20T19:31:37.000Z","size":1746,"stargazers_count":1561,"open_issues_count":31,"forks_count":138,"subscribers_count":13,"default_branch":"master","last_synced_at":"2026-04-17T19:06:56.365Z","etag":null,"topics":["cli","menus","prompt","ruby-cli","ruby-gem","terminal","terminal-input","terminal-menu","tty","tty-components","user-interface"],"latest_commit_sha":null,"homepage":"https://ttytoolkit.org","language":"Ruby","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/piotrmurach.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"piotrmurach"}},"created_at":"2015-11-01T17:40:57.000Z","updated_at":"2026-03-01T19:08:46.000Z","dependencies_parsed_at":"2024-02-11T15:54:35.028Z","dependency_job_id":"f1e87765-f7b2-442e-be0a-db8ffe9b0574","html_url":"https://github.com/piotrmurach/tty-prompt","commit_stats":{"total_commits":1186,"total_committers":40,"mean_commits":29.65,"dds":0.05733558178752107,"last_synced_commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/piotrmurach/tty-prompt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/sbom","scorecard":{"id":734846,"data":{"date":"2025-08-11","repo":{"name":"github.com/piotrmurach/tty-prompt","commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"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":10,"reason":"no dangerous workflow patterns detected","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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}}]},"last_synced_at":"2025-08-22T15:28:37.259Z","repository_id":43465320,"created_at":"2025-08-22T15:28:37.259Z","updated_at":"2025-08-22T15:28:37.259Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32264431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: 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"}},"owner":{"login":"piotrmurach","name":"Piotr Murach","uuid":"444312","kind":"user","description":"Tender loving command line.","email":"","website":"https://piotrmurach.com","location":"Sheffield / Olsztyn","twitter":"piotr_murach","company":null,"icon_url":"https://avatars.githubusercontent.com/u/444312?v=4","repositories_count":89,"last_synced_at":"2025-11-23T03:03:05.684Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/piotrmurach","funding_links":["https://github.com/sponsors/piotrmurach"],"total_stars":12891,"followers":648,"following":42,"created_at":"2022-11-02T16:41:01.260Z","updated_at":"2025-11-23T03:03:05.684Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach/repositories"},"packages":[{"id":8614439,"name":"github.com/piotrmurach/tty-prompt","ecosystem":"go","description":null,"homepage":null,"licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/piotrmurach/tty-prompt","keywords_array":[],"namespace":null,"versions_count":32,"first_release_published_at":"2023-12-02T02:14:22.806Z","latest_release_published_at":"2021-04-17T17:55:50.000Z","latest_release_number":"v0.23.1","last_synced_at":"2026-04-23T13:56:43.093Z","created_at":"2023-12-02T02:14:18.688Z","updated_at":"2026-04-23T13:56:43.093Z","registry_url":"https://pkg.go.dev/github.com/piotrmurach/tty-prompt","install_command":"go get github.com/piotrmurach/tty-prompt","documentation_url":"https://pkg.go.dev/github.com/piotrmurach/tty-prompt#section-documentation","metadata":{},"repo_metadata":{"id":43465320,"uuid":"45350538","full_name":"piotrmurach/tty-prompt","owner":"piotrmurach","description":"A beautiful and powerful interactive command line prompt","archived":false,"fork":false,"pushed_at":"2024-07-20T19:31:37.000Z","size":1746,"stargazers_count":1505,"open_issues_count":31,"forks_count":140,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-10-27T22:04:17.928Z","etag":null,"topics":["cli","menus","prompt","ruby-cli","ruby-gem","terminal","terminal-input","terminal-menu","tty","tty-components","user-interface"],"latest_commit_sha":null,"homepage":"https://ttytoolkit.org","language":"Ruby","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/piotrmurach.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"piotrmurach"}},"created_at":"2015-11-01T17:40:57.000Z","updated_at":"2025-10-22T01:20:13.000Z","dependencies_parsed_at":"2024-02-11T15:54:35.028Z","dependency_job_id":"f1e87765-f7b2-442e-be0a-db8ffe9b0574","html_url":"https://github.com/piotrmurach/tty-prompt","commit_stats":{"total_commits":1186,"total_committers":40,"mean_commits":29.65,"dds":0.05733558178752107,"last_synced_commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/piotrmurach/tty-prompt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/sbom","scorecard":{"id":734846,"data":{"date":"2025-08-11","repo":{"name":"github.com/piotrmurach/tty-prompt","commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"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":10,"reason":"no dangerous workflow patterns detected","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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}}]},"last_synced_at":"2025-08-22T15:28:37.259Z","repository_id":43465320,"created_at":"2025-08-22T15:28:37.259Z","updated_at":"2025-08-22T15:28:37.259Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281372641,"owners_count":26489686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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"},"owner_record":{"login":"piotrmurach","name":"Piotr Murach","uuid":"444312","kind":"user","description":"Tender loving command line.","email":"","website":"https://piotrmurach.com","location":"Sheffield / Olsztyn","twitter":"piotr_murach","company":null,"icon_url":"https://avatars.githubusercontent.com/u/444312?v=4","repositories_count":89,"last_synced_at":"2025-10-06T13:49:12.738Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/piotrmurach","funding_links":["https://github.com/sponsors/piotrmurach"],"total_stars":12809,"followers":644,"following":42,"created_at":"2022-11-02T16:41:01.260Z","updated_at":"2025-10-06T13:49:12.741Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach/repositories"},"tags":[{"name":"v0.23.1","sha":"5152fb5abd4cb3a5aaefc31ec316618e1eb5787a","kind":"tag","published_at":"2021-04-17T18:14:16.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.23.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.23.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.23.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.1/manifests"},{"name":"v0.23.0","sha":"5ea146e2465075479cdc0c8a902c1c7d9fa40557","kind":"tag","published_at":"2020-12-14T18:05:52.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.23.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.23.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.23.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.0/manifests"},{"name":"v0.22.0","sha":"67df0b7385dd9cea2f5730778d3c7ba908a24ad7","kind":"tag","published_at":"2020-07-20T14:02:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.22.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.22.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.22.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.22.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.22.0/manifests"},{"name":"v0.21.0","sha":"7fec5d178971274577c61e59f92b9b3cafc5d5b1","kind":"tag","published_at":"2020-03-08T20:11:22.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.21.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.21.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.21.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.21.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.21.0/manifests"},{"name":"v0.20.0","sha":"4320568da9eeb66ee859825835ef0fd94d393b95","kind":"tag","published_at":"2019-11-24T19:11:58.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.20.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.20.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.20.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.20.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.20.0/manifests"},{"name":"v0.19.0","sha":"700fb96fc8f6c43b4e3ef2dc184ef72edb32b358","kind":"tag","published_at":"2019-05-27T19:11:30.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.19.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.19.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.19.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.19.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.19.0/manifests"},{"name":"v0.18.1","sha":"65abce6c6e60a2f7eb140113cb7e20499faee57d","kind":"tag","published_at":"2018-12-29T17:01:27.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.18.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.18.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.18.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.1/manifests"},{"name":"v0.18.0","sha":"1975ed555ce46796eb77ecfb563e463a670268bd","kind":"tag","published_at":"2018-11-24T19:05:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.18.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.18.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.18.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.0/manifests"},{"name":"v0.17.2","sha":"fe79358451c2563c1ec14fdaa20349b7938a9242","kind":"tag","published_at":"2018-11-01T21:53:25.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.17.2","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.17.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.17.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.2/manifests"},{"name":"v0.17.1","sha":"6288b13abf4f2156d74a1892fd94296406bc95ca","kind":"tag","published_at":"2018-10-03T18:44:43.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.17.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.17.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.17.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.1/manifests"},{"name":"v0.17.0","sha":"56a7786afad51db916d27731519b03a593b125d9","kind":"tag","published_at":"2018-08-05T12:55:45.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.17.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.17.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.17.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.0/manifests"},{"name":"v0.16.1","sha":"e3a0d7918b7f10ddba7549559af9c5b875a60eb4","kind":"tag","published_at":"2018-04-29T14:23:59.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.16.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.16.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.16.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.1/manifests"},{"name":"v0.16.0","sha":"e62385cd8ae0b7b67dd5db864cde08b8b5050061","kind":"tag","published_at":"2018-03-11T23:09:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.16.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.16.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.16.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.0/manifests"},{"name":"v0.15.0","sha":"170475bee42d68053d8f89647f8be969afb78371","kind":"tag","published_at":"2018-02-08T06:18:32.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.15.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.15.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.15.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.15.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.15.0/manifests"},{"name":"v0.14.0","sha":"045215f47e7bac4dc57ba134b6abaad14a248d97","kind":"tag","published_at":"2018-01-01T19:20:16.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.14.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.14.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.14.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.14.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.14.0/manifests"},{"name":"v0.13.2","sha":"edb075531277564d1ae9c4d08a974b189af6fd23","kind":"tag","published_at":"2017-08-30T20:06:19.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.13.2","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.13.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.13.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.2/manifests"},{"name":"v0.13.1","sha":"4eb072315f8872f3c58169fa663a5f5682414041","kind":"tag","published_at":"2017-08-15T22:15:06.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.13.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.13.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.13.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.1/manifests"},{"name":"v0.13.0","sha":"1abc2c16b40f758cb73f53f7f1b8202a1763015b","kind":"tag","published_at":"2017-08-10T23:22:39.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.13.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.13.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.13.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.0/manifests"},{"name":"v0.12.0","sha":"ba8eb783d0735d97f3190da3142f32ee2f93b028","kind":"tag","published_at":"2017-03-19T19:09:07.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.12.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.12.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.12.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.12.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.12.0/manifests"},{"name":"v0.11.0","sha":"3a15fb2536991590783b7d7cdddb2712af1d195f","kind":"tag","published_at":"2017-02-26T17:28:52.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.11.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.11.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.11.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.11.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.11.0/manifests"},{"name":"v0.10.1","sha":"fb956151b2f468ac93dbac239c9467ed6685f871","kind":"tag","published_at":"2017-02-06T18:43:02.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.10.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.10.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.10.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.1/manifests"},{"name":"v0.10.0","sha":"8893762ace517c136e1e2bd68c00263e6c73a00a","kind":"tag","published_at":"2017-01-01T18:56:54.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.10.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.10.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.10.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.0/manifests"},{"name":"v0.9.0","sha":"a312648e6039a20af8c11744143708b87d2ce809","kind":"tag","published_at":"2016-12-20T22:15:05.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.9.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.9.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.9.0/manifests"},{"name":"v0.8.0","sha":"4b02ad692881d7eb9598db92b4636cd65181d50d","kind":"tag","published_at":"2016-11-29T23:46:46.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.8.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.8.0/manifests"},{"name":"v0.7.1","sha":"7e897ffd4ace1b907528b9a12e589a9069cbce6b","kind":"tag","published_at":"2016-08-07T18:09:44.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.7.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.7.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.1/manifests"},{"name":"v0.7.0","sha":"40cbc5601cf185199cf6b7b77fdc4ca33d9e1159","kind":"tag","published_at":"2016-07-17T18:30:46.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.7.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.0/manifests"},{"name":"v0.6.0","sha":"9743d2ff23693f7d3b24204cfaa49889c5a333c7","kind":"tag","published_at":"2016-05-21T19:37:17.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.6.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.6.0/manifests"},{"name":"v0.5.0","sha":"4d3a09715a63ad86724d556005d473bb1147ee30","kind":"tag","published_at":"2016-03-28T22:01:46.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.5.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.5.0/manifests"},{"name":"v0.4.0","sha":"e1d029d6e08f93089336dab4aad5d3efc3983736","kind":"tag","published_at":"2016-02-08T22:22:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.4.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.4.0/manifests"},{"name":"v0.3.0","sha":"a63f287e766d257ed2ab60f2017b5d47c66bdbc9","kind":"tag","published_at":"2015-12-28T20:49:13.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.3.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.3.0/manifests"},{"name":"v0.2.0","sha":"5922bbff933808b0acb4d3dffff181bd97f38813","kind":"tag","published_at":"2015-11-23T23:19:56.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.2.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.2.0/manifests"},{"name":"v0.1.0","sha":"d1d359a1a241b20580bc5e17d1e465485ae0645b","kind":"tag","published_at":"2015-11-01T17:53:25.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.1.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.1.0/manifests"}]},"repo_metadata_updated_at":"2025-12-18T12:58:28.213Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":10.801592556016239,"dependent_packages_count":9.575730298247606,"stargazers_count":1.7674434452169696,"forks_count":2.352282133558878,"docker_downloads_count":null,"average":6.124262108259924},"purl":"pkg:golang/github.com/piotrmurach/tty-prompt","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/piotrmurach/tty-prompt","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/piotrmurach/tty-prompt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/piotrmurach/tty-prompt/dependencies","status":null,"funding_links":["https://github.com/sponsors/piotrmurach"],"critical":null,"issue_metadata":{"last_synced_at":"2025-10-25T18:23:16.661Z","issues_count":75,"pull_requests_count":46,"avg_time_to_close_issue":5261282.611111111,"avg_time_to_close_pull_request":2637362.088235294,"issues_closed_count":54,"pull_requests_closed_count":34,"pull_request_authors_count":29,"issue_authors_count":57,"avg_comments_per_issue":3.04,"avg_comments_per_pull_request":3.8478260869565215,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":188192.0,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.6666666666666666,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/issues","maintainers":[{"login":"piotrmurach","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/piotrmurach"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fpiotrmurach%2Ftty-prompt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fpiotrmurach%2Ftty-prompt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fpiotrmurach%2Ftty-prompt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fpiotrmurach%2Ftty-prompt/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fpiotrmurach%2Ftty-prompt/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2107155,"maintainers_count":0,"namespaces_count":782439,"keywords_count":112823,"github":"golang","metadata":{"funded_packages_count":53495},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-04-19T05:14:45.920Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}},{"id":5302842,"name":"rb-tty-prompt","ecosystem":"conda","description":null,"homepage":"https://rubygems.org/gems/tty-prompt","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/piotrmurach/tty-prompt","keywords_array":[],"namespace":null,"versions_count":3,"first_release_published_at":"2019-09-19T03:42:04.000Z","latest_release_published_at":"2020-04-07T13:07:13.000Z","latest_release_number":"0.21.0","last_synced_at":"2026-03-05T04:46:31.951Z","created_at":"2022-10-03T16:13:32.262Z","updated_at":"2026-03-05T04:46:31.951Z","registry_url":"https://anaconda.org/conda-forge/rb-tty-prompt","install_command":"conda install -c conda-forge rb-tty-prompt","documentation_url":null,"metadata":{},"repo_metadata":{"id":43465320,"uuid":"45350538","full_name":"piotrmurach/tty-prompt","owner":"piotrmurach","description":"A beautiful and powerful interactive command line prompt","archived":false,"fork":false,"pushed_at":"2024-07-20T19:31:37.000Z","size":1746,"stargazers_count":1503,"open_issues_count":30,"forks_count":139,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-10-13T14:54:02.244Z","etag":null,"topics":["cli","menus","prompt","ruby-cli","ruby-gem","terminal","terminal-input","terminal-menu","tty","tty-components","user-interface"],"latest_commit_sha":null,"homepage":"https://ttytoolkit.org","language":"Ruby","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/piotrmurach.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"piotrmurach"}},"created_at":"2015-11-01T17:40:57.000Z","updated_at":"2025-10-10T22:14:14.000Z","dependencies_parsed_at":"2024-02-11T15:54:35.028Z","dependency_job_id":"f1e87765-f7b2-442e-be0a-db8ffe9b0574","html_url":"https://github.com/piotrmurach/tty-prompt","commit_stats":{"total_commits":1186,"total_committers":40,"mean_commits":29.65,"dds":0.05733558178752107,"last_synced_commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/piotrmurach/tty-prompt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/sbom","scorecard":{"id":734846,"data":{"date":"2025-08-11","repo":{"name":"github.com/piotrmurach/tty-prompt","commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"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":10,"reason":"no dangerous workflow patterns detected","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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}}]},"last_synced_at":"2025-08-22T15:28:37.259Z","repository_id":43465320,"created_at":"2025-08-22T15:28:37.259Z","updated_at":"2025-08-22T15:28:37.259Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279085462,"owners_count":26100017,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-15T02:00:07.814Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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"},"owner_record":{"login":"piotrmurach","name":"Piotr Murach","uuid":"444312","kind":"user","description":"Tender loving command line.","email":"","website":"https://piotrmurach.com","location":"Sheffield / Olsztyn","twitter":"piotr_murach","company":null,"icon_url":"https://avatars.githubusercontent.com/u/444312?v=4","repositories_count":89,"last_synced_at":"2025-10-06T13:49:12.738Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/piotrmurach","funding_links":["https://github.com/sponsors/piotrmurach"],"total_stars":12809,"followers":644,"following":42,"created_at":"2022-11-02T16:41:01.260Z","updated_at":"2025-10-06T13:49:12.741Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach/repositories"},"tags":[{"name":"v0.23.1","sha":"5152fb5abd4cb3a5aaefc31ec316618e1eb5787a","kind":"tag","published_at":"2021-04-17T18:14:16.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.23.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.23.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.23.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.1/manifests"},{"name":"v0.23.0","sha":"5ea146e2465075479cdc0c8a902c1c7d9fa40557","kind":"tag","published_at":"2020-12-14T18:05:52.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.23.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.23.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.23.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.23.0/manifests"},{"name":"v0.22.0","sha":"67df0b7385dd9cea2f5730778d3c7ba908a24ad7","kind":"tag","published_at":"2020-07-20T14:02:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.22.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.22.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.22.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.22.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.22.0/manifests"},{"name":"v0.21.0","sha":"7fec5d178971274577c61e59f92b9b3cafc5d5b1","kind":"tag","published_at":"2020-03-08T20:11:22.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.21.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.21.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.21.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.21.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.21.0/manifests"},{"name":"v0.20.0","sha":"4320568da9eeb66ee859825835ef0fd94d393b95","kind":"tag","published_at":"2019-11-24T19:11:58.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.20.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.20.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.20.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.20.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.20.0/manifests"},{"name":"v0.19.0","sha":"700fb96fc8f6c43b4e3ef2dc184ef72edb32b358","kind":"tag","published_at":"2019-05-27T19:11:30.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.19.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.19.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.19.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.19.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.19.0/manifests"},{"name":"v0.18.1","sha":"65abce6c6e60a2f7eb140113cb7e20499faee57d","kind":"tag","published_at":"2018-12-29T17:01:27.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.18.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.18.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.18.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.1/manifests"},{"name":"v0.18.0","sha":"1975ed555ce46796eb77ecfb563e463a670268bd","kind":"tag","published_at":"2018-11-24T19:05:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.18.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.18.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.18.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.18.0/manifests"},{"name":"v0.17.2","sha":"fe79358451c2563c1ec14fdaa20349b7938a9242","kind":"tag","published_at":"2018-11-01T21:53:25.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.17.2","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.17.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.17.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.2/manifests"},{"name":"v0.17.1","sha":"6288b13abf4f2156d74a1892fd94296406bc95ca","kind":"tag","published_at":"2018-10-03T18:44:43.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.17.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.17.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.17.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.1/manifests"},{"name":"v0.17.0","sha":"56a7786afad51db916d27731519b03a593b125d9","kind":"tag","published_at":"2018-08-05T12:55:45.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.17.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.17.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.17.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.17.0/manifests"},{"name":"v0.16.1","sha":"e3a0d7918b7f10ddba7549559af9c5b875a60eb4","kind":"tag","published_at":"2018-04-29T14:23:59.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.16.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.16.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.16.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.1/manifests"},{"name":"v0.16.0","sha":"e62385cd8ae0b7b67dd5db864cde08b8b5050061","kind":"tag","published_at":"2018-03-11T23:09:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.16.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.16.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.16.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.16.0/manifests"},{"name":"v0.15.0","sha":"170475bee42d68053d8f89647f8be969afb78371","kind":"tag","published_at":"2018-02-08T06:18:32.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.15.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.15.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.15.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.15.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.15.0/manifests"},{"name":"v0.14.0","sha":"045215f47e7bac4dc57ba134b6abaad14a248d97","kind":"tag","published_at":"2018-01-01T19:20:16.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.14.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.14.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.14.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.14.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.14.0/manifests"},{"name":"v0.13.2","sha":"edb075531277564d1ae9c4d08a974b189af6fd23","kind":"tag","published_at":"2017-08-30T20:06:19.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.13.2","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.13.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.13.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.2/manifests"},{"name":"v0.13.1","sha":"4eb072315f8872f3c58169fa663a5f5682414041","kind":"tag","published_at":"2017-08-15T22:15:06.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.13.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.13.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.13.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.1/manifests"},{"name":"v0.13.0","sha":"1abc2c16b40f758cb73f53f7f1b8202a1763015b","kind":"tag","published_at":"2017-08-10T23:22:39.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.13.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.13.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.13.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.13.0/manifests"},{"name":"v0.12.0","sha":"ba8eb783d0735d97f3190da3142f32ee2f93b028","kind":"tag","published_at":"2017-03-19T19:09:07.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.12.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.12.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.12.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.12.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.12.0/manifests"},{"name":"v0.11.0","sha":"3a15fb2536991590783b7d7cdddb2712af1d195f","kind":"tag","published_at":"2017-02-26T17:28:52.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.11.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.11.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.11.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.11.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.11.0/manifests"},{"name":"v0.10.1","sha":"fb956151b2f468ac93dbac239c9467ed6685f871","kind":"tag","published_at":"2017-02-06T18:43:02.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.10.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.10.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.10.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.1/manifests"},{"name":"v0.10.0","sha":"8893762ace517c136e1e2bd68c00263e6c73a00a","kind":"tag","published_at":"2017-01-01T18:56:54.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.10.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.10.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.10.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.10.0/manifests"},{"name":"v0.9.0","sha":"a312648e6039a20af8c11744143708b87d2ce809","kind":"tag","published_at":"2016-12-20T22:15:05.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.9.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.9.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.9.0/manifests"},{"name":"v0.8.0","sha":"4b02ad692881d7eb9598db92b4636cd65181d50d","kind":"tag","published_at":"2016-11-29T23:46:46.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.8.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.8.0/manifests"},{"name":"v0.7.1","sha":"7e897ffd4ace1b907528b9a12e589a9069cbce6b","kind":"tag","published_at":"2016-08-07T18:09:44.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.7.1","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.7.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.1/manifests"},{"name":"v0.7.0","sha":"40cbc5601cf185199cf6b7b77fdc4ca33d9e1159","kind":"tag","published_at":"2016-07-17T18:30:46.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.7.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.7.0/manifests"},{"name":"v0.6.0","sha":"9743d2ff23693f7d3b24204cfaa49889c5a333c7","kind":"tag","published_at":"2016-05-21T19:37:17.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.6.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.6.0/manifests"},{"name":"v0.5.0","sha":"4d3a09715a63ad86724d556005d473bb1147ee30","kind":"tag","published_at":"2016-03-28T22:01:46.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.5.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.5.0/manifests"},{"name":"v0.4.0","sha":"e1d029d6e08f93089336dab4aad5d3efc3983736","kind":"tag","published_at":"2016-02-08T22:22:55.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.4.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.4.0/manifests"},{"name":"v0.3.0","sha":"a63f287e766d257ed2ab60f2017b5d47c66bdbc9","kind":"tag","published_at":"2015-12-28T20:49:13.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.3.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.3.0/manifests"},{"name":"v0.2.0","sha":"5922bbff933808b0acb4d3dffff181bd97f38813","kind":"tag","published_at":"2015-11-23T23:19:56.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.2.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.2.0/manifests"},{"name":"v0.1.0","sha":"d1d359a1a241b20580bc5e17d1e465485ae0645b","kind":"tag","published_at":"2015-11-01T17:53:25.000Z","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/v0.1.0","html_url":"https://github.com/piotrmurach/tty-prompt/releases/tag/v0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/piotrmurach/tty-prompt@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags/v0.1.0/manifests"}]},"repo_metadata_updated_at":"2025-12-18T12:58:28.447Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":34.025455452957324,"dependent_packages_count":51.17544297479411,"stargazers_count":9.902670326927876,"forks_count":14.309957574245072,"average":27.353381582231094},"purl":"pkg:conda/rb-tty-prompt?repository_url=https://conda-forge.org","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/conda/rb-tty-prompt","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/conda/rb-tty-prompt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/conda/rb-tty-prompt/dependencies","status":null,"funding_links":["https://github.com/sponsors/piotrmurach"],"critical":null,"issue_metadata":{"last_synced_at":"2025-10-25T18:23:16.661Z","issues_count":75,"pull_requests_count":46,"avg_time_to_close_issue":5261282.611111111,"avg_time_to_close_pull_request":2637362.088235294,"issues_closed_count":54,"pull_requests_closed_count":34,"pull_request_authors_count":29,"issue_authors_count":57,"avg_comments_per_issue":3.04,"avg_comments_per_pull_request":3.8478260869565215,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":188192.0,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.6666666666666666,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/issues","maintainers":[{"login":"piotrmurach","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/piotrmurach"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/rb-tty-prompt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/rb-tty-prompt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/rb-tty-prompt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/rb-tty-prompt/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages/rb-tty-prompt/codemeta","maintainers":[],"registry":{"name":"conda-forge.org","url":"https://conda-forge.org","ecosystem":"conda","default":false,"packages_count":20636,"maintainers_count":0,"namespaces_count":0,"keywords_count":0,"github":"conda-forge","metadata":{"kind":"conda-forge","key":"CondaForge","api":"https://conda.anaconda.org","funded_packages_count":2266},"icon_url":"https://github.com/conda-forge.png","created_at":"2022-10-03T15:37:08.743Z","updated_at":"2026-04-03T06:46:36.736Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/conda-forge.org/namespaces"}},{"id":320390,"name":"tty-prompt","ecosystem":"rubygems","description":"A beautiful and powerful interactive command line prompt with a robust API for getting and validating complex inputs.","homepage":"https://ttytoolkit.org","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/piotrmurach/tty-prompt","keywords_array":[],"namespace":null,"versions_count":32,"first_release_published_at":"2015-11-01T17:53:36.661Z","latest_release_published_at":"2021-04-17T18:18:07.361Z","latest_release_number":"0.23.1","last_synced_at":"2026-04-25T04:31:14.105Z","created_at":"2022-04-06T11:58:20.525Z","updated_at":"2026-04-25T04:31:23.314Z","registry_url":"https://rubygems.org/gems/tty-prompt","install_command":"gem install tty-prompt -s https://rubygems.org","documentation_url":"http://www.rubydoc.info/gems/tty-prompt/","metadata":{"funding":null},"repo_metadata":{"id":43465320,"uuid":"45350538","full_name":"piotrmurach/tty-prompt","owner":"piotrmurach","description":"A beautiful and powerful interactive command line prompt","archived":false,"fork":false,"pushed_at":"2024-07-20T19:31:37.000Z","size":1746,"stargazers_count":1561,"open_issues_count":31,"forks_count":138,"subscribers_count":13,"default_branch":"master","last_synced_at":"2026-04-01T02:23:42.312Z","etag":null,"topics":["cli","menus","prompt","ruby-cli","ruby-gem","terminal","terminal-input","terminal-menu","tty","tty-components","user-interface"],"latest_commit_sha":null,"homepage":"https://ttytoolkit.org","language":"Ruby","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/piotrmurach.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"piotrmurach"}},"created_at":"2015-11-01T17:40:57.000Z","updated_at":"2026-03-01T19:08:46.000Z","dependencies_parsed_at":"2024-02-11T15:54:35.028Z","dependency_job_id":"f1e87765-f7b2-442e-be0a-db8ffe9b0574","html_url":"https://github.com/piotrmurach/tty-prompt","commit_stats":{"total_commits":1186,"total_committers":40,"mean_commits":29.65,"dds":0.05733558178752107,"last_synced_commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/piotrmurach/tty-prompt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/sbom","scorecard":{"id":734846,"data":{"date":"2025-08-11","repo":{"name":"github.com/piotrmurach/tty-prompt","commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"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":10,"reason":"no dangerous workflow patterns detected","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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}}]},"last_synced_at":"2025-08-22T15:28:37.259Z","repository_id":43465320,"created_at":"2025-08-22T15:28:37.259Z","updated_at":"2025-08-22T15:28:37.259Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31500403,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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"},"owner_record":{"login":"piotrmurach","name":"Piotr Murach","uuid":"444312","kind":"user","description":"Tender loving command line.","email":"","website":"https://piotrmurach.com","location":"Sheffield / Olsztyn","twitter":"piotr_murach","company":null,"icon_url":"https://avatars.githubusercontent.com/u/444312?v=4","repositories_count":89,"last_synced_at":"2025-11-23T03:03:05.684Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/piotrmurach","funding_links":["https://github.com/sponsors/piotrmurach"],"total_stars":12891,"followers":648,"following":42,"created_at":"2022-11-02T16:41:01.260Z","updated_at":"2025-11-23T03:03:05.684Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach/repositories"},"tags":[]},"repo_metadata_updated_at":"2026-04-25T04:31:23.287Z","dependent_packages_count":396,"downloads":82218394,"downloads_period":"total","dependent_repos_count":3867,"rankings":{"downloads":0.5617158681929791,"dependent_repos_count":0.5101411577401307,"dependent_packages_count":0.11772488255541479,"stargazers_count":1.374017557825341,"forks_count":2.2429393100200694,"docker_downloads_count":0.2584341469430772,"average":0.844162153879502},"purl":"pkg:gem/tty-prompt","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/tty-prompt","docker_dependents_count":249,"docker_downloads_count":482641934,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/tty-prompt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/tty-prompt/dependencies","status":null,"funding_links":["https://github.com/sponsors/piotrmurach"],"critical":true,"issue_metadata":{"last_synced_at":"2026-04-04T21:02:54.015Z","issues_count":75,"pull_requests_count":46,"avg_time_to_close_issue":5261282.611111111,"avg_time_to_close_pull_request":2637362.088235294,"issues_closed_count":54,"pull_requests_closed_count":34,"pull_request_authors_count":29,"issue_authors_count":57,"avg_comments_per_issue":3.04,"avg_comments_per_pull_request":3.8478260869565215,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":188192.0,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.6666666666666666,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/issues","maintainers":[{"login":"piotrmurach","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/piotrmurach"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/tty-prompt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/tty-prompt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/tty-prompt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/tty-prompt/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/tty-prompt/codemeta","maintainers":[{"uuid":"54662","login":"piotrmurach","name":null,"email":null,"url":null,"packages_count":65,"html_url":"https://rubygems.org/profiles/piotrmurach","role":null,"created_at":"2022-11-09T09:54:54.901Z","updated_at":"2022-11-09T09:54:54.901Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/piotrmurach/packages"}],"registry":{"name":"rubygems.org","url":"https://rubygems.org","ecosystem":"rubygems","default":true,"packages_count":205414,"maintainers_count":68433,"namespaces_count":0,"keywords_count":0,"github":"rubygems","metadata":{"funded_packages_count":7260},"icon_url":"https://github.com/rubygems.png","created_at":"2022-04-04T15:19:23.446Z","updated_at":"2026-04-03T06:42:17.024Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/namespaces"}},{"id":12346181,"name":"tty-prompt","ecosystem":"rubygems","description":"A beautiful and powerful interactive command line prompt with a robust API for getting and validating complex inputs.","homepage":"https://ttytoolkit.org","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/piotrmurach/tty-prompt","keywords_array":[],"namespace":null,"versions_count":32,"first_release_published_at":"2015-11-01T17:53:36.661Z","latest_release_published_at":"2021-04-17T18:18:07.361Z","latest_release_number":"0.23.1","last_synced_at":"2026-04-25T08:45:21.227Z","created_at":"2025-10-07T06:37:56.778Z","updated_at":"2026-04-25T10:43:30.386Z","registry_url":"https://gem.coop/gems/tty-prompt","install_command":"gem install tty-prompt -s https://gem.coop","documentation_url":"http://www.rubydoc.info/gems/tty-prompt/","metadata":{"funding":null},"repo_metadata":{"id":43465320,"uuid":"45350538","full_name":"piotrmurach/tty-prompt","owner":"piotrmurach","description":"A beautiful and powerful interactive command line prompt","archived":false,"fork":false,"pushed_at":"2024-07-20T19:31:37.000Z","size":1746,"stargazers_count":1561,"open_issues_count":31,"forks_count":138,"subscribers_count":13,"default_branch":"master","last_synced_at":"2026-04-01T02:23:42.312Z","etag":null,"topics":["cli","menus","prompt","ruby-cli","ruby-gem","terminal","terminal-input","terminal-menu","tty","tty-components","user-interface"],"latest_commit_sha":null,"homepage":"https://ttytoolkit.org","language":"Ruby","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/piotrmurach.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"piotrmurach"}},"created_at":"2015-11-01T17:40:57.000Z","updated_at":"2026-03-01T19:08:46.000Z","dependencies_parsed_at":"2024-02-11T15:54:35.028Z","dependency_job_id":"f1e87765-f7b2-442e-be0a-db8ffe9b0574","html_url":"https://github.com/piotrmurach/tty-prompt","commit_stats":{"total_commits":1186,"total_committers":40,"mean_commits":29.65,"dds":0.05733558178752107,"last_synced_commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/piotrmurach/tty-prompt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","download_url":"https://codeload.github.com/piotrmurach/tty-prompt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/sbom","scorecard":{"id":734846,"data":{"date":"2025-08-11","repo":{"name":"github.com/piotrmurach/tty-prompt","commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"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":10,"reason":"no dangerous workflow patterns detected","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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/piotrmurach/tty-prompt/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}}]},"last_synced_at":"2025-08-22T15:28:37.259Z","repository_id":43465320,"created_at":"2025-08-22T15:28:37.259Z","updated_at":"2025-08-22T15:28:37.259Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31500403,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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"},"owner_record":{"login":"piotrmurach","name":"Piotr Murach","uuid":"444312","kind":"user","description":"Tender loving command line.","email":"","website":"https://piotrmurach.com","location":"Sheffield / Olsztyn","twitter":"piotr_murach","company":null,"icon_url":"https://avatars.githubusercontent.com/u/444312?v=4","repositories_count":89,"last_synced_at":"2025-11-23T03:03:05.684Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/piotrmurach","funding_links":["https://github.com/sponsors/piotrmurach"],"total_stars":12891,"followers":648,"following":42,"created_at":"2022-11-02T16:41:01.260Z","updated_at":"2025-11-23T03:03:05.684Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrmurach/repositories"},"tags":[]},"repo_metadata_updated_at":"2026-04-25T10:43:30.358Z","dependent_packages_count":0,"downloads":82220884,"downloads_period":"total","dependent_repos_count":0,"rankings":{"downloads":0.4027745489736007,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":0.13425818299120024},"purl":"pkg:gem/tty-prompt?repository_url=https://gem.coop","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/tty-prompt","docker_dependents_count":249,"docker_downloads_count":482641934,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/tty-prompt","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/tty-prompt/dependencies","status":null,"funding_links":["https://github.com/sponsors/piotrmurach"],"critical":null,"issue_metadata":{"last_synced_at":"2026-04-12T20:47:56.534Z","issues_count":75,"pull_requests_count":46,"avg_time_to_close_issue":5261282.611111111,"avg_time_to_close_pull_request":2637362.088235294,"issues_closed_count":54,"pull_requests_closed_count":34,"pull_request_authors_count":29,"issue_authors_count":57,"avg_comments_per_issue":3.04,"avg_comments_per_pull_request":3.8478260869565215,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":188192.0,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.6666666666666666,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/issues","maintainers":[{"login":"piotrmurach","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/piotrmurach"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/tty-prompt/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/tty-prompt/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/tty-prompt/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/tty-prompt/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/tty-prompt/codemeta","maintainers":[{"uuid":"54662","login":"piotrmurach","name":null,"email":null,"url":null,"packages_count":65,"html_url":"https://gem.coop/profiles/piotrmurach","role":null,"created_at":"2025-10-09T23:57:06.728Z","updated_at":"2025-10-09T23:57:06.728Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/piotrmurach/packages"}],"registry":{"name":"gem.coop","url":"https://gem.coop","ecosystem":"rubygems","default":false,"packages_count":190266,"maintainers_count":67442,"namespaces_count":0,"keywords_count":0,"github":"gem-coop","metadata":{"funded_packages_count":6507},"icon_url":"https://github.com/gem-coop.png","created_at":"2025-10-06T17:24:20.932Z","updated_at":"2026-04-03T06:45:05.763Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/namespaces"}}],"commits":{"id":3472,"full_name":"piotrmurach/tty-prompt","default_branch":"master","total_commits":1186,"total_committers":40,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":29.65,"dds":0.05733558178752107,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-04-23T13:02:17.554Z","last_synced_commit":"2c2c44e8b1d4affe9926bc87c3740000dcf7f2f7","created_at":"2023-03-07T09:17:52.395Z","updated_at":"2026-04-23T13:02:00.982Z","committers":[{"name":"Piotr Murach","email":"pmurach@gmail.com","login":"piotrmurach","count":1118},{"name":"Jonas Mueller","email":"jonas@muellers.one","login":null,"count":7},{"name":"Katelyn Schiesser","email":"katelyn.schiesser@gmail.com","login":"slowbro","count":6},{"name":"Rui Baltazar","email":"rui.p.baltazar@gmail.com","login":"rpbaltazar","count":4},{"name":"Sven Pachnit","email":"sven@bmonkeys.net","login":"2called-chaos","count":3},{"name":"Ondřej Moravčík","email":"moravcik.ondrej@gmail.com","login":"ondra-m","count":3},{"name":"Keith T. Garner","email":"kgarner@kgarner.com","login":"ktgeek","count":3},{"name":"Toshiro Sugii","email":"Tox@Tox.lan","login":null,"count":2},{"name":"Daniel Vartanov","email":"dan@vartanov.net","login":"DanielVartanov","count":2},{"name":"Danny Hadley","email":"dadleyy@gmail.com","login":"dadleyy","count":2},{"name":"Ewoudt Kellerman","email":"ewoudt.kellerman@gmail.com","login":"hellola","count":2},{"name":"Frank Schmitt","email":"frank@qwhon.de","login":"frankschmitt","count":2},{"name":"Kim Burge Strand","email":"kim@burgestrand.se","login":"Burgestrand","count":2},{"name":"Kimmo Lehto","email":"kimmo.lehto@kontena.io","login":"kke","count":2},{"name":"Robert Fletcher","email":"mockdeep","login":"mockdeep","count":2},{"name":"Saverio Miroddi","email":"saverio.pub2@gmail.com","login":"64kramsystem","count":2},{"name":"Toshiro Sugii","email":"Tox@Tox.local","login":null,"count":1},{"name":"Chris Hoffman","email":"choffman@optoro.com","login":null,"count":1},{"name":"Albert Salim","email":"caalberts","login":"caalberts","count":1},{"name":"Andy Brody","email":"brodygov","login":"brodygov","count":1},{"name":"robbystk","email":"robbystk@gmail.com","login":"robbystk","count":1},{"name":"mikoto2000","email":"mikoto2000@gmail.com","login":"mikoto2000","count":1},{"name":"keepcosmos","email":"keepcosmos@gmail.com","login":"keepcosmos","count":1},{"name":"cyclotron3k","email":"aidan.samuel@gmail.com","login":"cyclotron3k","count":1},{"name":"Yutaka HARA","email":"yutaka.hara+github@gmail.com","login":"yhara","count":1},{"name":"Taylor Daugherty","email":"mdaugherty6@gmail.com","login":"tylrd","count":1},{"name":"Stjepan Hadjic","email":"d4be4st@gmail.com","login":"d4be4st","count":1},{"name":"Samuel Williams","email":"samuel.williams@oriontransfer.co.nz","login":"ioquatix","count":1},{"name":"Rafael Valverde","email":"rafacvo@gmail.com","login":"rafacv","count":1},{"name":"Philippe Perret","email":"philippe.perret@yahoo.fr","login":"PhilippePerret","count":1},{"name":"Paul van Leeuwen","email":"908808+pjvleeuwen","login":"pjvleeuwen","count":1},{"name":"Kyle","email":"kylejking@gmail.com","login":"kylekyle","count":1},{"name":"Kenneth Vestergaard","email":"kvs@binarysolutions.dk","login":"kvs","count":1},{"name":"Javier Aranda","email":"javier.aranda.varo@gmail.com","login":"javierav","count":1},{"name":"Igor Zubkov","email":"igor.zubkov@gmail.com","login":"biow0lf","count":1},{"name":"Igor Rzegocki","email":"igor@rzegocki.pl","login":"ajgon","count":1},{"name":"Denis Defreyne","email":"denis.defreyne@stoneship.org","login":"denisdefreyne","count":1},{"name":"Carlos Fonseca","email":"carlosefonseca","login":"carlosefonseca","count":1},{"name":"Austin Blatt","email":"austinblatt@gmail.com","login":"austb","count":1},{"name":"Andy Brody","email":"git@abrody.com","login":"ab","count":1}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-25T00:00:08.654Z","repositories_count":6217713,"commits_count":899275546,"contributors_count":34884079,"owners_count":1145129,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"piotrmurach/tty-prompt","html_url":"https://github.com/piotrmurach/tty-prompt","last_synced_at":"2026-04-17T19:02:46.452Z","status":"error","issues_count":75,"pull_requests_count":46,"avg_time_to_close_issue":5261282.611111111,"avg_time_to_close_pull_request":2637362.088235294,"issues_closed_count":54,"pull_requests_closed_count":34,"pull_request_authors_count":29,"issue_authors_count":57,"avg_comments_per_issue":3.04,"avg_comments_per_pull_request":3.8478260869565215,"merged_pull_requests_count":23,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":188192.0,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.6666666666666666,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-05-10T21:58:42.700Z","updated_at":"2026-04-17T19:02:46.452Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrmurach%2Ftty-prompt/issues","issue_labels_count":{"enhancement":13,"bug":4,"help wanted":1},"pull_request_labels_count":{"enhancement":1},"issue_author_associations_count":{"NONE":57,"CONTRIBUTOR":16,"OWNER":2},"pull_request_author_associations_count":{"CONTRIBUTOR":29,"NONE":16,"OWNER":1},"issue_authors":{"DannyBen":6,"PhilippePerret":4,"lulalala":3,"vinnydiehl":2,"piotrmurach":2,"slowbro":2,"apainintheneck":2,"pjvleeuwen":2,"rpbaltazar":2,"ioquatix":2,"mslinn":2,"sled":1,"sveinn":1,"cswilliams":1,"varioustoxins":1,"ZASMan":1,"hellola":1,"long76":1,"jeffssh":1,"garymh":1,"64kramsystem":1,"joe-p":1,"rubyFeedback":1,"coezbek":1,"theramist":1,"niiccolas":1,"Anay-v2":1,"robbystk":1,"sascha-wolf":1,"Vento-Nuenenen":1,"guillaumebriday":1,"benjamin-hull":1,"steamwings":1,"AndyObtiva":1,"Nakilon":1,"caalberts":1,"woodruffw":1,"edjames":1,"technicalpickles":1,"fdiaz":1,"purplejacket":1,"orachux":1,"bbugh":1,"freestyl3r":1,"stamizharasu":1,"elad-maimon":1,"hatlord":1,"roscom":1,"ngan":1,"ttilberg":1,"dgmora":1,"lpender":1,"guilevi":1,"Rylon":1,"cnorman-enphase":1,"ghost":1,"hedselu":1},"pull_request_authors":{"slowbro":6,"DanielVartanov":5,"2called-chaos":3,"apainintheneck":2,"lucasmenezesds":2,"suruja":2,"mockdeep":2,"grcooper":2,"pjvleeuwen":2,"ruionwriting":1,"caalberts":1,"hellola":1,"hai14894":1,"kvs":1,"PhilippePerret":1,"etozzato":1,"sveinn":1,"rpbaltazar":1,"piotrmurach":1,"robbystk":1,"seawolf":1,"cyclotron3k":1,"mikoto2000":1,"biow0lf":1,"mxbees":1,"ondra-m":1,"ishigo974":1,"ioquatix":1,"Geekfish":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-19T00:00:13.985Z","repositories_count":14325257,"issues_count":34519107,"pull_requests_count":112900485,"authors_count":11238487,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":2},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{"edjames":1,"Rylon":1},"past_year_pull_request_authors":{},"maintainers":[{"login":"piotrmurach","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/piotrmurach"}],"active_maintainers":[]},"events":{"total":{"PullRequestEvent":1,"ForkEvent":4,"IssuesEvent":4,"WatchEvent":56,"IssueCommentEvent":10},"last_year":{"IssuesEvent":1,"WatchEvent":29,"IssueCommentEvent":2}},"keywords":["cli","menus","prompt","ruby-cli","ruby-gem","terminal","terminal-input","terminal-menu","tty","tty-components","user-interface"],"dependencies":[{"ecosystem":"rubygems","filepath":"Gemfile","sha":null,"kind":"manifest","created_at":"2022-08-12T10:41:37.889Z","updated_at":"2022-08-12T10:41:37.889Z","repository_link":"https://github.com/piotrmurach/tty-prompt/blob/master/Gemfile","dependencies":[{"id":1316151064,"package_name":"benchmark-ips","ecosystem":"rubygems","requirements":"~\u003e 2.7.2","direct":true,"kind":"development","optional":false},{"id":1316151065,"package_name":"coveralls_reborn","ecosystem":"rubygems","requirements":"~\u003e 0.21.0","direct":true,"kind":"development","optional":false},{"id":1316151066,"package_name":"simplecov","ecosystem":"rubygems","requirements":"~\u003e 0.21.0","direct":true,"kind":"development","optional":false}]},{"ecosystem":"rubygems","filepath":"tty-prompt.gemspec","sha":null,"kind":"manifest","created_at":"2022-08-12T10:41:37.899Z","updated_at":"2022-08-12T10:41:37.899Z","repository_link":"https://github.com/piotrmurach/tty-prompt/blob/master/tty-prompt.gemspec","dependencies":[{"id":1316151076,"package_name":"pastel","ecosystem":"rubygems","requirements":"~\u003e 0.8","direct":true,"kind":"runtime","optional":false},{"id":1316151077,"package_name":"tty-reader","ecosystem":"rubygems","requirements":"~\u003e 0.8","direct":true,"kind":"runtime","optional":false},{"id":1316151078,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":1316151079,"package_name":"rspec","ecosystem":"rubygems","requirements":"\u003e= 3.0","direct":true,"kind":"development","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ci.yml","sha":null,"kind":"manifest","created_at":"2024-02-11T15:54:34.846Z","updated_at":"2024-02-11T15:54:34.846Z","repository_link":"https://github.com/piotrmurach/tty-prompt/blob/master/.github/workflows/ci.yml","dependencies":[{"id":16168112934,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":16168112935,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]}],"score":31.90686847181398,"created_at":"2024-12-15T21:38:07.789Z","updated_at":"2026-04-30T16:30:27.386Z","avatar_url":"https://github.com/piotrmurach.png","language":"Ruby","monthly_downloads":0,"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://ttytoolkit.org\"\u003e\u003cimg width=\"130\" src=\"https://github.com/piotrmurach/tty/raw/master/images/tty.png\" alt=\"TTY Toolkit logo\" /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n# TTY::Prompt\n\n[![Gem Version](https://badge.fury.io/rb/tty-prompt.svg)][gem]\n[![Actions CI](https://github.com/piotrmurach/tty-prompt/actions/workflows/ci.yml/badge.svg)][gh_actions_ci]\n[![Build status](https://ci.appveyor.com/api/projects/status/4cguoiah5dprbq7n?svg=true)][appveyor]\n[![Code Climate](https://codeclimate.com/github/piotrmurach/tty-prompt/badges/gpa.svg)][codeclimate]\n[![Coverage Status](https://coveralls.io/repos/github/piotrmurach/tty-prompt/badge.svg)][coverage]\n\n[gem]: http://badge.fury.io/rb/tty-prompt\n[gh_actions_ci]: https://github.com/piotrmurach/tty-prompt/actions/workflows/ci.yml\n[travis]: http://travis-ci.org/piotrmurach/tty-prompt\n[appveyor]: https://ci.appveyor.com/project/piotrmurach/tty-prompt\n[codeclimate]: https://codeclimate.com/github/piotrmurach/tty-prompt\n[coverage]: https://coveralls.io/github/piotrmurach/tty-prompt\n\n\u003e A beautiful and powerful interactive command line prompt.\n\n**TTY::Prompt** provides independent prompt component for [TTY](https://github.com/piotrmurach/tty) toolkit.\n\n## Features\n\n* Number of prompt types for gathering user input\n* A robust API for validating complex inputs\n* User friendly error feedback\n* Intuitive DSL for creating complex menus\n* Ability to page long menus\n* Support for Linux, OS X, FreeBSD and Windows systems\n\n## Windows support\n\n`tty-prompt` works across all Unix and Windows systems in the \"best possible\" way. On Windows, it uses Win32 API in place of terminal device to provide matching functionality.\n\nSince Unix terminals provide richer set of features than Windows PowerShell consoles, expect to have a better experience on Unix-like platform.\n\nSome features like `select` or `multi_select` menus may not work on Windows when run from Git Bash. See GitHub suggested [fixes](https://github.com/git-for-windows/git/wiki/FAQ#some-native-console-programs-dont-work-when-run-from-git-bash-how-to-fix-it).\n\nFor Windows, consider installing [ConEmu](https://conemu.github.io/), [cmder](http://cmder.net/) or [PowerCmd](http://www.powercmd.com/).\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem \"tty-prompt\"\n```\n\nAnd then execute:\n\n    $ bundle\n\nOr install it yourself as:\n\n    $ gem install tty-prompt\n\n## Contents\n\n* [1. Usage](#1-usage)\n* [2. Interface](#2-interface)\n  * [2.1 ask](#21-ask)\n    * [2.1.1 :convert](#211-convert)\n    * [2.1.2 :default](#212-default)\n    * [2.1.3 :value](#213-value)\n    * [2.1.4 :echo](#214-echo)\n    * [2.1.5 error messages](#215-error-messages)\n    * [2.1.6 :in](#216-in)\n    * [2.1.7 :modify](#217-modify)\n    * [2.1.8 :required](#218-required)\n    * [2.1.9 :validate](#219-validate)\n  * [2.2 keypress](#22-keypress)\n    * [2.2.1 :timeout](#221-timeout)\n  * [2.3 multiline](#23-multiline)\n  * [2.4 mask](#24-mask)\n  * [2.5 yes?/no?](#25-yesno)\n  * [2.6 menu](#26-menu)\n    * [2.6.1 choices](#261-choices)\n    * [2.6.1.1 :disabled](#2611-disabled)\n    * [2.6.2 select](#262-select)\n      * [2.6.2.1 :cycle](#2621-cycle)\n      * [2.6.2.2 :enum](#2622-enum)\n      * [2.6.2.3 :help](#2623-help)\n      * [2.6.2.4 :marker](#2624-marker)\n      * [2.6.2.5 :per_page](#2625-per_page)\n      * [2.6.2.6 :disabled](#2626-disabled)\n      * [2.6.2.7 :filter](#2627-filter)\n    * [2.6.3 multi_select](#263-multi_select)\n      * [2.6.3.1 :cycle](#2631-cycle)\n      * [2.6.3.2 :enum](#2632-enum)\n      * [2.6.3.3 :help](#2633-help)\n      * [2.6.3.4 :per_page](#2634-per_page)\n      * [2.6.3.5 :disabled](#2635-disabled)\n      * [2.6.3.6 :echo](#2636-echo)\n      * [2.6.3.7 :filter](#2637-filter)\n      * [2.6.3.8 :min](#2638-min)\n      * [2.6.3.9 :max](#2639-max)\n    * [2.6.4 enum_select](#264-enum_select)\n      * [2.6.4.1 :per_page](#2641-per_page)\n      * [2.6.4.1 :disabled](#2641-disabled)\n  * [2.7 expand](#27-expand)\n    * [2.7.1 :auto_hint](#271-auto_hint)\n  * [2.8 collect](#28-collect)\n  * [2.9 suggest](#29-suggest)\n  * [2.10 slider](#210-slider)\n  * [2.11 say](#211-say)\n    * [2.11.1 ok](#2111-ok)\n    * [2.11.2 warn](#2112-warn)\n    * [2.11.3 error](#2113-error)\n  * [2.12 keyboard events](#212-keyboard-events)\n* [3. settings](#3-settings)\n  * [3.1 :symbols](#31-symbols)\n  * [3.2 :active_color](#32-active_color)\n  * [3.3 :enable_color](#33-enable_color)\n  * [3.4 :help_color](#34-help_color)\n  * [3.5 :interrupt](#35-interrupt)\n  * [3.6 :prefix](#36-prefix)\n  * [3.7 :quiet](#37-quiet)\n  * [3.8 :track_history](#38-track_history)\n\n## 1. Usage\n\nIn order to start asking questions on the command line, create prompt:\n\n```ruby\nrequire \"tty-prompt\"\n\nprompt = TTY::Prompt.new\n```\n\nAnd then call `ask` with the question for simple input:\n\n```ruby\nprompt.ask(\"What is your name?\", default: ENV[\"USER\"])\n# =\u003e What is your name? (piotr)\n```\n\nTo confirm input use `yes?`:\n\n```ruby\nprompt.yes?(\"Do you like Ruby?\")\n# =\u003e Do you like Ruby? (Y/n)\n```\n\nIf you want to input password or secret information use `mask`:\n\n```ruby\nprompt.mask(\"What is your secret?\")\n# =\u003e What is your secret? ••••\n```\n\nAsking question with list of options couldn't be easier using `select` like so:\n\n```ruby\nprompt.select(\"Choose your destiny?\", %w(Scorpion Kano Jax))\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select)\n# ‣ Scorpion\n#   Kano\n#   Jax\n```\n\nAlso, asking multiple choice questions is a breeze with `multi_select`:\n\n```ruby\nchoices = %w(vodka beer wine whisky bourbon)\nprompt.multi_select(\"Select drinks?\", choices)\n# =\u003e\n#\n# Select drinks? (Use ↑/↓ arrow keys, press Space to select and Enter to finish)\"\n# ‣ ⬡ vodka\n#   ⬡ beer\n#   ⬡ wine\n#   ⬡ whisky\n#   ⬡ bourbon\n```\n\nTo ask for a selection from enumerated list you can use `enum_select`:\n\n```ruby\nchoices = %w(emacs nano vim)\nprompt.enum_select(\"Select an editor?\", choices)\n# =\u003e\n#\n# Select an editor?\n#   1) emacs\n#   2) nano\n#   3) vim\n#   Choose 1-3 [1]:\n```\n\nHowever, if you have a lot of options to choose from you may want to use `expand`:\n\n```ruby\nchoices = [\n  { key: \"y\", name: \"overwrite this file\", value: :yes },\n  { key: \"n\", name: \"do not overwrite this file\", value: :no },\n  { key: \"a\", name: \"overwrite this file and all later files\", value: :all },\n  { key: \"d\", name: \"show diff\", value: :diff },\n  { key: \"q\", name: \"quit; do not overwrite this file \", value: :quit }\n]\nprompt.expand(\"Overwrite Gemfile?\", choices)\n# =\u003e\n# Overwrite Gemfile? (enter \"h\" for help) [y,n,a,d,q,h]\n```\n\nIf you wish to collect more than one answer use `collect`:\n\n```ruby\nresult = prompt.collect do\n  key(:name).ask(\"Name?\")\n\n  key(:age).ask(\"Age?\", convert: :int)\n\n  key(:address) do\n    key(:street).ask(\"Street?\", required: true)\n    key(:city).ask(\"City?\")\n    key(:zip).ask(\"Zip?\", validate: /\\A\\d{3}\\Z/)\n  end\nend\n# =\u003e\n# {:name =\u003e \"Piotr\", :age =\u003e 30, :address =\u003e {:street =\u003e \"Street\", :city =\u003e \"City\", :zip =\u003e \"123\"}}\n```\n\n## 2. Interface\n\n### 2.1 ask\n\nIn order to ask a basic question do:\n\n```ruby\nprompt.ask(\"What is your name?\")\n```\n\nHowever, to prompt for more complex input you can use robust API by passing hash of properties or using a block like so:\n\n```ruby\nprompt.ask(\"What is your name?\") do |q|\n  q.required true\n  q.validate /\\A\\w+\\Z/\n  q.modify   :capitalize\nend\n```\n\n#### 2.1.1 `:convert`\n\nThe `convert` property is used to convert input to a required type.\n\nBy default no conversion of input is performed. To change this use one of the following conversions:\n\n* `:boolean`|`:bool` - e.g. 'yes/1/y/t/' becomes `true`, 'no/0/n/f' becomes `false`\n* `:date` - parses dates formats \"28/03/2020\", \"March 28th 2020\"\n* `:time` - parses time formats \"11:20:03\"\n* `:float` - e.g. `-1` becomes `-1.0`\n* `:int`|`:integer` - e.g. `+1` becomes `1`\n* `:sym`|`:symbol` - e.g. \"foo\" becomes `:foo`\n* `:filepath` - converts to file path\n* `:path`|`:pathname` - converts to `Pathname` object\n* `:range` - e.g. '1-10' becomes `1..10` range object\n* `:regexp` - e.g. \"foo|bar\" becomes `/foo|bar/`\n* `:uri` - converts to `URI` object\n* `:list`|`:array` - e.g. 'a,b,c' becomes `[\"a\", \"b\", \"c\"]`\n* `:map`|`:hash` - e.g. 'a:1 b:2 c:3' becomes `{a: \"1\", b: \"2\", c: \"3\"}`\n\nIn addition you can specify a plural or append `list` or `array` to any base type:\n\n* `:ints` or `:int_list` - will convert to a list of integers\n* `:floats` or `:float_list` - will convert to a list of floats\n* `:bools` or `:bool_list` - will convert to a list of booleans, e.g. `t,f,t` becomes `[true, false, true]`\n\nSimilarly, you can append `map` or `hash` to any base type:\n\n* `:int_map`|`:integer_map`|`:int_hash` - will convert to a hash of integers, e.g `a:1 b:2 c:3` becomes `{a: 1, b: 2, c: 3}`\n* `:bool_map` | `:boolean_map`|`:bool_hash` - will convert to a hash of booleans, e.g `a:t b:f c:t` becomes `{a: true, b: false, c: true}`\n\nBy default, `map` converts keys to symbols, if you wish to use strings instead specify key type like so:\n\n* `:str_int_map` - will convert to a hash of string keys and integer values\n* `:string_integer_hash` - will convert to a hash of string keys and integer values\n\nFor example, if you are interested in range type as answer do the following:\n\n```ruby\nprompt.ask(\"Provide range of numbers?\", convert: :range)\n# Provide range of numbers? 1-10\n# =\u003e 1..10\n```\n\nIf, on the other hand, you wish to convert input to a hash of integer values do:\n\n```ruby\nprompt.ask(\"Provide keys and values:\", convert: :int_map)\n# Provide keys and values: a=1 b=2 c=3\n# =\u003e {a: 1, b: 2, c: 3}\n```\n\nIf a user provides a wrong type for conversion an error message will be printed in the console:\n\n```ruby\nprompt.ask(\"Provide digit:\", convert: :float)\n# Provide digit: x\n# \u003e\u003e Cannot convert `x` into 'float' type\n```\n\nYou can further customize error message:\n\n```ruby\nprompt.ask(\"Provide digit:\", convert: :float) do |q|\n  q.convert(:float, \"Wrong value of %{value} for %{type} conversion\")\n  # or\n  q.convert :float\n  q.messages[:convert?] = \"Wrong value of %{value} for %{type} conversion\"\nend\n```\n\nYou can also provide a custom conversion like so:\n\n```ruby\nprompt.ask(\"Ingredients? (comma sep list)\") do |q|\n  q.convert -\u003e (input) { input.split(/,\\s*/) }\nend\n# Ingredients? (comma sep list) milk, eggs, flour\n# =\u003e [\"milk\", \"eggs\", \"flour\"]\n```\n\n#### 2.1.2 `:default`\n\nThe `:default` option is used if the user presses return key:\n\n```ruby\nprompt.ask(\"What is your name?\", default: \"Anonymous\")\n# =\u003e\n# What is your name? (Anonymous)\n```\n\n#### 2.1.3 `:value`\n\nTo pre-populate the input line for editing use `:value` option:\n\n```ruby\nprompt.ask(\"What is your name?\", value: \"Piotr\")\n# =\u003e\n# What is your name? Piotr\n```\n\n#### 2.1.4 `:echo`\n\nTo control whether the input is shown back in terminal or not use `:echo` option like so:\n\n```ruby\nprompt.ask(\"password:\", echo: false)\n```\n\n#### 2.1.5 error messages\n\nBy default `tty-prompt` comes with predefined error messages for `convert`, `required`, `in`, `validate` options.\n\nYou can change these and configure to your liking either by passing message as second argument with the option:\n\n```ruby\nprompt.ask(\"What is your email?\") do |q|\n  q.validate(/\\A\\w+@\\w+\\.\\w+\\Z/, \"Invalid email address\")\nend\n```\n\nOr change the `messages` key entry out of `:convert?`, `:range?`, `:required?` and `:valid?`:\n\n```ruby\nprompt.ask(\"What is your email?\") do |q|\n  q.validate(/\\A\\w+@\\w+\\.\\w+\\Z/)\n  q.messages[:valid?] = \"Invalid email address\"\nend\n```\n\nTo change default range validation error message do:\n\n```ruby\nprompt.ask(\"How spicy on scale (1-5)? \") do |q|\n  q.in \"1-5\"\n  q.messages[:range?] = \"%{value} out of expected range %{in}\"\nend\n```\n\n#### 2.1.6 `:in`\n\nIn order to check that provided input falls inside a range of inputs use the `in` option. For example, if we wanted to ask a user for a single digit in given range we may do following:\n\n```ruby\nprompt.ask(\"Provide number in range: 0-9?\") { |q| q.in(\"0-9\") }\n```\n\n#### 2.1.7 `:modify`\n\nSet the `:modify` option if you want to handle whitespace or letter capitalization.\n\n```ruby\nprompt.ask(\"Enter text:\") do |q|\n  q.modify :strip, :collapse\nend\n```\n\nAvailable letter casing settings are:\n```ruby\n:up         # change to upper case\n:down       # change to small case\n:capitalize # capitalize each word\n```\n\nAvailable whitespace settings are:\n\n```ruby\n:trim     # remove whitespace from both ends of the input\n:strip    # same as :trim\n:chomp    # remove whitespace at the end of input\n:collapse # reduce all whitespace to single character\n:remove   # remove all whitespace\n```\n\n#### 2.1.8 `:required`\n\nTo ensure that input is provided use `:required` option:\n\n```ruby\nprompt.ask(\"What's your phone number?\", required: true)\n# What's your phone number?\n# \u003e\u003e Value must be provided\n```\n\n#### 2.1.9 `:validate`\n\nIn order to validate that input matches a given pattern you can pass the `validate` option/method.\n\nValidate accepts `Regex`, `Proc` or `Symbol`.\n\n```ruby\nprompt.ask(\"What is your username?\") do |q|\n  q.validate(/\\A[^.]+\\.[^.]+\\Z/)\nend\n```\n\nThe above can also be expressed as a `Proc`:\n\n```ruby\nprompt.ask(\"What is your username?\") do |q|\n  q.validate -\u003e(input) { input =~ /\\A[^.]+\\.[^.]+\\Z/ }\nend\n```\n\nThere is a built-in validation for `:email` and you can use it directly like so:\n\n```ruby\nprompt.ask(\"What is your email?\") { |q| q.validate :email }\n```\n\nThe default validation message is `\"Your answer is invalid (must match %{valid})\"` and you can customise it by passing in a second argument:\n\n```ruby\nprompt.ask(\"What is your username?\") do |q|\n  q.validate(/\\A[^.]+\\.[^.]+\\Z/, \"Invalid username: %{value}, must match %{valid}\")\nend\n```\n\nThe default message can also be set using `messages` and the `:valid?` key:\n\n```ruby\nprompt.ask(\"What is your username?\") do |q|\n  q.validate(/\\A[^.]+\\.[^.]+\\Z/)\n  q.messages[:valid?] = \"Invalid username: %{value}, must match %{valid}\")\nend\n```\n\n### 2.2. keypress\n\nIn order to ask question that awaits a single character answer use `keypress` prompt like so:\n\n```ruby\nprompt.keypress(\"Press key ?\")\n# Press key?\n# =\u003e a\n```\n\nBy default any key is accepted but you can limit keys by using `:keys` option. Any key event names such as `:space` or `:ctrl_k` are valid:\n\n```ruby\nprompt.keypress(\"Press space or enter to continue\", keys: [:space, :return])\n```\n\n#### 2.2.1 timeout\n\nTimeout can be set using `:timeout` option to expire prompt and allow the script to continue automatically:\n\n```ruby\nprompt.keypress(\"Press any key to continue, resumes automatically in 3 seconds ...\", timeout: 3)\n```\n\nIn addition the `keypress` recognises `:countdown` token when inserted inside the question. It will automatically countdown the time in seconds:\n\n```ruby\nprompt.keypress(\"Press any key to continue, resumes automatically in :countdown ...\", timeout: 3)\n```\n\n### 2.3 multiline\n\nAsking for multiline input can be done with `multiline` method. The reading of input will terminate when `Ctrl+d` or `Ctrl+z` is pressed. Empty lines will not be included in the returned array.\n\n```ruby\nprompt.multiline(\"Description?\")\n# Description? (Press CTRL-D or CTRL-Z to finish)\n# I know not all that may be coming,\n# but be it what it will,\n# I'll go to it laughing.\n# =\u003e\n# [\"I know not all that may be coming,\\n\", \"but be it what it will,\\n\", \"I'll go to it laughing.\\n\"]\n```\n\nThe `multiline` uses similar options to those supported by `ask` prompt. For example, to provide default description:\n\n```ruby\nprompt.multiline(\"Description?\", default: \"A super sweet prompt.\")\n```\n\nOr using DSL:\n\n```ruby\nprompt.multiline(\"Description?\") do |q|\n  q.default \"A super sweet prompt.\"\n  q.help \"Press thy ctrl+d to end\"\nend\n```\n\n### 2.4 mask\n\nIf you require input of confidential information use `mask` method. By default each character that is printed is replaced by `•` symbol. All configuration options applicable to `ask` method can be used with `mask` as well.\n\n```ruby\nprompt.mask(\"What is your secret?\")\n# =\u003e What is your secret? ••••\n```\n\nThe masking character can be changed by passing the `:mask` key:\n\n```ruby\nheart = prompt.decorate(prompt.symbols[:heart] + \" \", :magenta)\nprompt.mask(\"What is your secret?\", mask: heart)\n# =\u003e What is your secret? ❤  ❤  ❤  ❤  ❤\n```\n\nIf you don't wish to show any output use `:echo` option like so:\n\n```ruby\nprompt.mask(\"What is your secret?\", echo: false)\n```\n\nYou can also provide validation for your mask to enforce for instance strong passwords:\n\n```ruby\nprompt.mask(\"What is your secret?\", mask: heart) do |q|\n  q.validate(/[a-z\\ ]{5,15}/)\nend\n```\n\n### 2.5 yes?/no?\n\nIn order to display a query asking for boolean input from user use `yes?` like so:\n\n```ruby\nprompt.yes?(\"Do you like Ruby?\")\n# =\u003e\n# Do you like Ruby? (Y/n)\n```\n\nYou can further customize question by passing `suffix`, `positive`, `negative` and `convert` options. The `suffix` changes text of available options, the `positive` specifies display string for successful answer and `negative` changes display string for negative answer. The final value is a boolean provided the `convert` option evaluates to boolean.\n\nIt's enough to provide the `suffix` option for the prompt to accept matching answers with correct labels:\n\n```ruby\nprompt.yes?(\"Are you a human?\") do |q|\n  q.suffix \"Yup/nope\"\nend\n# =\u003e\n# Are you a human? (Yup/nope)\n```\n\nAlternatively, instead of `suffix` option provide the `positive` and `negative` labels:\n\n```ruby\nprompt.yes?(\"Are you a human?\") do |q|\n  q.default false\n  q.positive \"Yup\"\n  q.negative \"Nope\"\nend\n# =\u003e\n# Are you a human? (yup/Nope)\n```\n\nFinally, providing all available options you can ask fully customized question:\n\n```ruby\nprompt.yes?(\"Are you a human?\") do |q|\n  q.suffix \"Agree/Disagree\"\n  q.positive \"Agree\"\n  q.negative \"Disagree\"\n  q.convert -\u003e (input) { !input.match(/^agree$/i).nil? }\nend\n# =\u003e\n# Are you a human? (Agree/Disagree)\n```\n\nThere is also the opposite for asking confirmation of negative question:\n\n```ruby\nprompt.no?(\"Do you hate Ruby?\")\n# =\u003e\n# Do you hate Ruby? (y/N)\n```\n\nSimilarly to `yes?` method, you can supply the same options to customize the question.\n\n### 2.6 menu\n\n### 2.6.1 choices\n\nThere are many ways in which you can add menu choices. The simplest way is to create an array of values:\n\n```ruby\nchoices = %w(small medium large)\n```\n\nBy default the choice name is also the value the prompt will return when selected. To provide custom values, you can provide a hash with keys as choice names and their respective values:\n\n```ruby\nchoices = {small: 1, medium: 2, large: 3}\nprompt.select(\"What size?\", choices)\n# =\u003e\n# What size? (Press ↑/↓ arrow to move and Enter to select)\n# ‣ small\n#   medium\n#   large\n```\n\nFinally, you can define an array of choices where each choice is a hash value with `:name` \u0026 `:value` keys which can include other options for customising individual choices:\n\n```ruby\nchoices = [\n  {name: \"small\", value: 1},\n  {name: \"medium\", value: 2, disabled: \"(out of stock)\"},\n  {name: \"large\", value: 3}\n]\n```\n\nYou can specify `:key` as an additional option which will be used as short name for selecting the choice via keyboard key press.\n\nAnother way to create menu with choices is using the DSL and the `choice` method. For example, the previous array of choices with hash values can be translated as:\n\n```ruby\nprompt.select(\"What size?\") do |menu|\n  menu.choice name: \"small\",  value: 1\n  menu.choice name: \"medium\", value: 2, disabled: \"(out of stock)\"\n  menu.choice name: \"large\",  value: 3\nend\n# =\u003e\n# What size? (Press ↑/↓ arrow to move and Enter to select)\n# ‣ small\n# ✘ medium (out of stock)\n#   large\n```\n\nor in a more compact way:\n\n```ruby\nprompt.select(\"What size?\") do |menu|\n  menu.choice \"small\", 1\n  menu.choice \"medium\", 2, disabled: \"(out of stock)\"\n  menu.choice \"large\", 3\nend\n```\n\n#### 2.6.1.1 `:disabled`\n\nThe `:disabled` key indicates to display a choice as currently unavailable to select. Disabled choices are displayed with a cross `✘` character next to them. If the choice is disabled, it cannot be selected. The value for the `:disabled` is used next to the choice to provide reason for excluding it from the selection menu. For example:\n\n```ruby\nchoices = [\n  {name: \"small\", value: 1},\n  {name: \"medium\", value: 2, disabled: \"(out of stock)\"},\n  {name: \"large\", value: 3}\n]\n```\n\n### 2.6.2 select\n\nFor asking questions involving list of options use `select` method by passing the question and possible choices:\n\n```ruby\nprompt.select(\"Choose your destiny?\", %w(Scorpion Kano Jax))\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select)\n# ‣ Scorpion\n#   Kano\n#   Jax\n```\n\nYou can also provide options through DSL using the `choice` method for single entry and/or `choices` for more than one choice:\n\n```ruby\nprompt.select(\"Choose your destiny?\") do |menu|\n  menu.choice \"Scorpion\"\n  menu.choice \"Kano\"\n  menu.choice \"Jax\"\nend\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select)\n# ‣ Scorpion\n#   Kano\n#   Jax\n```\n\nBy default the choice name is used as return value, but you can provide your custom values including a `Proc` object:\n\n```ruby\nprompt.select(\"Choose your destiny?\") do |menu|\n  menu.choice \"Scorpion\", 1\n  menu.choice \"Kano\", 2\n  menu.choice \"Jax\", -\u003e { \"Nice choice captain!\" }\nend\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select)\n# ‣ Scorpion\n#   Kano\n#   Jax\n```\n\nIf you wish you can also provide a simple hash to denote choice name and its value like so:\n\n```ruby\nchoices = {\"Scorpion\" =\u003e 1, \"Kano\" =\u003e 2, \"Jax\" =\u003e 3}\nprompt.select(\"Choose your destiny?\", choices)\n```\n\nTo mark particular answer as selected use `default` with either an index of the choice starting from `1` or a choice's name:\n\n```ruby\nprompt.select(\"Choose your destiny?\") do |menu|\n  menu.default 3\n  # or menu.default \"Jax\"\n\n  menu.choice \"Scorpion\", 1\n  menu.choice \"Kano\", 2\n  menu.choice \"Jax\", 3\nend\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select)\n#   Scorpion\n#   Kano\n# ‣ Jax\n```\n\n#### 2.6.2.1 `:cycle`\n\nYou can navigate the choices using the arrow keys or define your own key mappings (see [keyboard events](#212-keyboard-events). When reaching the top/bottom of the list, the selection does not cycle around by default. If you wish to enable cycling, you can pass `cycle: true` to `select` and `multi_select`:\n\n```ruby\nprompt.select(\"Choose your destiny?\", %w(Scorpion Kano Jax), cycle: true)\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select)\n# ‣ Scorpion\n#   Kano\n#   Jax\n```\n\n#### 2.6.2.2 `:enum`\n\nFor ordered choices set `enum` to any delimiter String. In that way, you can use arrows keys and numbers (0-9) to select the item.\n\n```ruby\nprompt.select(\"Choose your destiny?\") do |menu|\n  menu.enum \".\"\n\n  menu.choice \"Scorpion\", 1\n  menu.choice \"Kano\", 2\n  menu.choice \"Jax\", 3\nend\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow or number (0-9) keys, press Enter to select)\n#   1. Scorpion\n#   2. Kano\n# ‣ 3. Jax\n```\n\n#### 2.6.2.3 `:help`\n\nYou can configure help message with `:help` and when to display it with `:show_help` options. The help can be displayed on `start`, `never` or `always`:\n\n```ruby\nchoices = %w(Scorpion Kano Jax)\nprompt.select(\"Choose your destiny?\", choices, help: \"(Bash keyboard keys)\", show_help: :always)\n# =\u003e\n# Choose your destiny? (Bash keyboard keys)\n# \u003e Scorpion\n#   Kano\n#   Jax\n```\n\n#### 2.6.2.4 `:marker`\n\nYou can configure active marker like so:\n\n```ruby\nchoices = %w(Scorpion Kano Jax)\nprompt.select(\"Choose your destiny?\", choices, symbols: { marker: \"\u003e\" })\n# =\u003e\n# Choose your destiny? (Use ↑/↓ and ←/→ arrow keys, press Enter to select)\n# \u003e Scorpion\n#   Kano\n#   Jax\n```\n\n#### 2.6.2.5 `:per_page`\n\nBy default the menu is paginated if selection grows beyond `6` items. To change this setting use `:per_page` configuration.\n\n```ruby\nletters = (\"A\"..\"Z\").to_a\nprompt.select(\"Choose your letter?\", letters, per_page: 4)\n# =\u003e\n# Which letter? (Use ↑/↓ and ←/→ arrow keys, press Enter to select)\n# ‣ A\n#   B\n#   C\n#   D\n```\n\nYou can also customise page navigation text using `:help` option:\n```ruby\nletters = (\"A\"..\"Z\").to_a\nprompt.select(\"Choose your letter?\") do |menu|\n  menu.per_page 4\n  menu.help \"(Wiggle thy finger up/down and left/right to see more)\"\n  menu.choices letters\nend\n# =\u003e\n# Which letter? (Wiggle thy finger up/down and left/right to see more)\n# ‣ A\n#   B\n#   C\n#   D\n```\n\n#### 2.6.2.6 `:disabled`\n\nTo disable menu choice, use the `:disabled` key with a value that explains the reason for the choice being unavailable. For example, out of all warriors, the Goro is currently injured:\n\n```ruby\nwarriors = [\n  \"Scorpion\",\n  \"Kano\",\n  { name: \"Goro\", disabled: \"(injury)\" },\n  \"Jax\",\n  \"Kitana\",\n  \"Raiden\"\n]\n```\n\nThe disabled choice will be displayed with a cross `✘` character next to it and followed by an explanation:\n\n```ruby\nprompt.select(\"Choose your destiny?\", warriors)\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select)\n# ‣ Scorpion\n#   Kano\n# ✘ Goro (injury)\n#   Jax\n#   Kitana\n#   Raiden\n```\n\n#### 2.6.2.7 `:filter`\n\nTo activate dynamic list searching on letter/number key presses use `:filter` option:\n\n```ruby\nwarriors = %w(Scorpion Kano Jax Kitana Raiden)\nprompt.select(\"Choose your destiny?\", warriors, filter: true)\n# =\u003e\n# Choose your destiny? (Use ↑/↓ arrow keys, press Enter to select, and letter keys to filter)\n# ‣ Scorpion\n#   Kano\n#   Jax\n#   Kitana\n#   Raiden\n```\n\nAfter the user presses \"k\":\n\n```ruby\n# =\u003e\n# Choose your destiny? (Filter: \"k\")\n# ‣ Kano\n#   Kitana\n```\n\nAfter the user presses \"ka\":\n\n```ruby\n# =\u003e\n# Choose your destiny? (Filter: \"ka\")\n# ‣ Kano\n```\n\nFilter characters can be deleted partially or entirely via, respectively, Backspace and Canc.\n\nIf the user changes or deletes a filter, the choices previously selected remain selected.\n\n### 2.6.3 multi_select\n\nFor asking questions involving multiple selection list use `multi_select` method by passing the question and possible choices:\n\n```ruby\nchoices = %w(vodka beer wine whisky bourbon)\nprompt.multi_select(\"Select drinks?\", choices)\n# =\u003e\n#\n# Select drinks? (Use ↑/↓ arrow keys, press Space to select and Enter to finish)\"\n# ‣ ⬡ vodka\n#   ⬡ beer\n#   ⬡ wine\n#   ⬡ whisky\n#   ⬡ bourbon\n```\n\nAs a return value, the `multi_select` will always return an array by default populated with the names of the choices. If you wish to return custom values for the available choices do:\n\n```ruby\nchoices = {vodka: 1, beer: 2, wine: 3, whisky: 4, bourbon: 5}\nprompt.multi_select(\"Select drinks?\", choices)\n\n# Provided that vodka and beer have been selected, the function will return\n# =\u003e [1, 2]\n```\n\nSimilar to `select` method, you can also provide options through DSL using the `choice` method for single entry and/or `choices` call for more than one choice:\n\n```ruby\nprompt.multi_select(\"Select drinks?\") do |menu|\n  menu.choice :vodka, {score: 1}\n  menu.choice :beer, 2\n  menu.choice :wine, 3\n  menu.choices whisky: 4, bourbon: 5\nend\n```\n\nTo mark choice(s) as selected use the `default` option with either index(s) of the choice(s) starting from `1` or choice name(s):\n\n```ruby\nprompt.multi_select(\"Select drinks?\") do |menu|\n  menu.default 2, 5\n  # or menu.default :beer, :whisky\n\n  menu.choice :vodka,   {score: 10}\n  menu.choice :beer,    {score: 20}\n  menu.choice :wine,    {score: 30}\n  menu.choice :whisky,  {score: 40}\n  menu.choice :bourbon, {score: 50}\nend\n# =\u003e\n# Select drinks? beer, bourbon\n#   ⬡ vodka\n#   ⬢ beer\n#   ⬡ wine\n#   ⬡ whisky\n# ‣ ⬢ bourbon\n```\n\n#### 2.6.3.1 `:cycle`\n\nAlso like, `select`, the method takes an option `cycle` (which defaults to `false`), which lets you configure whether the selection should cycle around when reaching the top/bottom of the list when navigating:\n\n```ruby\nprompt.multi_select(\"Select drinks?\", %w(vodka beer wine), cycle: true)\n```\n\n#### 2.6.3.2 `:enum`\n\nLike `select`, for ordered choices set `enum` to any delimiter String. In that way, you can use arrows keys and numbers (0-9) to select the item.\n\n```ruby\nprompt.multi_select(\"Select drinks?\") do |menu|\n  menu.enum \")\"\n\n  menu.choice :vodka,   {score: 10}\n  menu.choice :beer,    {score: 20}\n  menu.choice :wine,    {score: 30}\n  menu.choice :whisky,  {score: 40}\n  menu.choice :bourbon, {score: 50}\nend\n# =\u003e\n# Select drinks? beer, bourbon\n#   ⬡ 1) vodka\n#   ⬢ 2) beer\n#   ⬡ 3) wine\n#   ⬡ 4) whisky\n# ‣ ⬢ 5) bourbon\n```\n\nAnd when you press enter you will see the following selected:\n\n```ruby\n# Select drinks? beer, bourbon\n# =\u003e [{score: 20}, {score: 50}]\n```\n\n#### 2.6.3.3 `:help`\n\nYou can configure help message with `:help` and when to display it with `:show_help` options. The help can be displayed on `start`, `never` or `always`:\n\n```ruby\nchoices = {vodka: 1, beer: 2, wine: 3, whisky: 4, bourbon: 5}\nprompt.multi_select(\"Select drinks?\", choices, help: \"Press beer can against keyboard\", show_help: :always)\n# =\u003e\n# Select drinks? (Press beer can against keyboard)\"\n# ‣ ⬡ vodka\n#   ⬡ beer\n#   ⬡ wine\n#   ⬡ whisky\n#   ⬡ bourbon\n```\n\n#### 2.6.3.4 `:per_page`\n\nBy default the menu is paginated if selection grows beyond `6` items. To change this setting use `:per_page` configuration.\n\n```ruby\nletters = (\"A\"..\"Z\").to_a\nprompt.multi_select(\"Choose your letter?\", letters, per_page: 4)\n# =\u003e\n# Which letter? (Use ↑/↓ and ←/→ arrow keys, press Space to select and Enter to finish)\n# ‣ ⬡ A\n#   ⬡ B\n#   ⬡ C\n#   ⬡ D\n```\n\n#### 2.6.3.5 `:disabled`\n\nTo disable menu choice, use the `:disabled` key with a value that explains the reason for the choice being unavailable. For example, out of all drinks, the sake and beer are currently out of stock:\n\n```ruby\ndrinks = [\n  \"bourbon\",\n  {name: \"sake\", disabled: \"(out of stock)\"},\n  \"vodka\",\n  {name: \"beer\", disabled: \"(out of stock)\"},\n  \"wine\",\n  \"whisky\"\n]\n```\n\nThe disabled choice will be displayed with a cross `✘` character next to it and followed by an explanation:\n\n```ruby\nprompt.multi_select(\"Choose your favourite drink?\", drinks)\n# =\u003e\n# Choose your favourite drink? (Use ↑/↓ arrow keys, press Space to select and Enter to finish)\n# ‣ ⬡ bourbon\n#   ✘ sake (out of stock)\n#   ⬡ vodka\n#   ✘ beer (out of stock)\n#   ⬡ wine\n#   ⬡ whisky\n```\n\n#### 2.6.3.6 `:echo`\n\nTo control whether the selected items are shown on the question\nheader use the :echo option:\n\n```ruby\nchoices = %w(vodka beer wine whisky bourbon)\nprompt.multi_select(\"Select drinks?\", choices, echo: false)\n# =\u003e\n# Select drinks?\n#   ⬡ vodka\n#   ⬢ 2) beer\n#   ⬡ 3) wine\n#   ⬡ 4) whisky\n# ‣ ⬢ 5) bourbon\n```\n\n#### 2.6.3.7 `:filter`\n\nTo activate dynamic list filtering on letter/number typing, use the :filter option:\n\n```ruby\nchoices = %w(vodka beer wine whisky bourbon)\nprompt.multi_select(\"Select drinks?\", choices, filter: true)\n# =\u003e\n# Select drinks? (Use ↑/↓ arrow keys, press Space to select and Enter to finish, and letter keys to filter)\n# ‣ ⬡ vodka\n#   ⬡ beer\n#   ⬡ wine\n#   ⬡ whisky\n#   ⬡ bourbon\n```\n\nAfter the user presses \"w\":\n\n```ruby\n# Select drinks? (Filter: \"w\")\n# ‣ ⬡ wine\n#   ⬡ whisky\n```\n\nFilter characters can be deleted partially or entirely via, respectively, Backspace and Canc.\n\nIf the user changes or deletes a filter, the choices previously selected remain selected.\n\nThe `filter` option is not compatible with `enum`.\n\n#### 2.6.3.8 `:min`\n\nTo force the minimum number of choices an user must select, use the `:min` option:\n\n```ruby\nchoices = %w(vodka beer wine whisky bourbon)\nprompt.multi_select(\"Select drinks?\", choices, min: 3)\n# =\u003e\n# Select drinks? (min. 3) vodka, beer\n#   ⬢ vodka\n#   ⬢ beer\n#   ⬡ wine\n#   ⬡ wiskey\n# ‣ ⬡ bourbon\n```\n\n#### 2.6.3.9 `:max`\n\nTo limit the number of choices an user can select, use the `:max` option:\n\n```ruby\nchoices = %w(vodka beer wine whisky bourbon)\nprompt.multi_select(\"Select drinks?\", choices, max: 3)\n# =\u003e\n# Select drinks? (max. 3) vodka, beer, whisky\n#   ⬢ vodka\n#   ⬢ beer\n#   ⬡ wine\n#   ⬢ whisky\n# ‣ ⬡ bourbon\n```\n\n### 2.6.4 enum_select\n\nIn order to ask for standard selection from indexed list you can use `enum_select` and pass question together with possible choices:\n\n```ruby\nchoices = %w(emacs nano vim)\nprompt.enum_select(\"Select an editor?\", choices)\n# =\u003e\n#\n# Select an editor?\n#   1) nano\n#   2) vim\n#   3) emacs\n#   Choose 1-3 [1]:\n```\n\nSimilar to `select` and `multi_select`, you can provide question options through DSL using `choice` method and/or `choices` like so:\n\n```ruby\nchoices = %w(nano vim emacs)\nprompt.enum_select(\"Select an editor?\") do |menu|\n  menu.choice :nano,  \"/bin/nano\"\n  menu.choice :vim,   \"/usr/bin/vim\"\n  menu.choice :emacs, \"/usr/bin/emacs\"\nend\n# =\u003e\n#\n# Select an editor?\n#   1) nano\n#   2) vim\n#   3) emacs\n#   Choose 1-3 [1]:\n#\n# Select an editor? /bin/nano\n```\n\nYou can change the indexed numbers formatting by passing `enum` option. The `default` option lets you specify which choice to mark as selected by default. It accepts an index of the choice starting from `1` or a choice name:\n\n```ruby\nchoices = %w(nano vim emacs)\nprompt.enum_select(\"Select an editor?\") do |menu|\n  menu.default 2\n  # or menu.defualt \"/usr/bin/vim\"\n  menu.enum \".\"\n\n  menu.choice :nano,  \"/bin/nano\"\n  menu.choice :vim,   \"/usr/bin/vim\"\n  menu.choice :emacs, \"/usr/bin/emacs\"\nend\n# =\u003e\n#\n# Select an editor?\n#   1. nano\n#   2. vim\n#   3. emacs\n#   Choose 1-3 [2]:\n#\n# Select an editor? /usr/bin/vim\n```\n\n#### 2.6.4.1 `:per_page`\n\nBy default the menu is paginated if selection grows beyond `6` items. To change this setting use `:per_page` configuration.\n\n```ruby\nletters = (\"A\"..\"Z\").to_a\nprompt.enum_select(\"Choose your letter?\", letters, per_page: 4)\n# =\u003e\n# Which letter?\n#   1) A\n#   2) B\n#   3) C\n#   4) D\n#   Choose 1-26 [1]:\n# (Press tab/right or left to reveal more choices)\n```\n\n#### 2.6.4.2 `:disabled`\n\nTo make a choice unavailable use the `:disabled` option and, if you wish, as value provide a reason:\n\n```ruby\nchoices = [\n  {name: \"Emacs\", disabled: \"(not installed)\"},\n  \"Atom\",\n  \"GNU nano\",\n  {name: \"Notepad++\", disabled: \"(not installed)\"},\n  \"Sublime\",\n  \"Vim\"\n]\n```\n\nThe disabled choice will be displayed with a cross ✘ character next to it and followed by an explanation:\n\n\n```ruby\nprompt.enum_select(\"Select an editor\", choices)\n# =\u003e\n# Select an editor\n# ✘ 1) Emacs (not installed)\n#   2) Atom\n#   3) GNU nano\n# ✘ 4) Notepad++ (not installed)\n#   5) Sublime\n#   6) Vim\n#   Choose 1-6 [2]:\n```\n\n### 2.7 expand\n\nThe `expand` provides a compact way to ask a question with many options.\n\nAs first argument `expand` takes the message to display and as a second an array of choices. Compared to the `select`, `multi_select` and `enum_select`, the choices need to be objects that include `:key`, `:name` and `:value` keys. The `:key` must be a single character. The help choice is added automatically as the last option under the key `h`.\n\n```ruby\nchoices = [\n  {\n    key: \"y\",\n    name: \"overwrite this file\",\n    value: :yes\n  }, {\n    key: \"n\",\n    name: \"do not overwrite this file\",\n    value: :no\n  }, {\n    key: \"q\",\n    name: \"quit; do not overwrite this file \",\n    value: :quit\n  }\n]\n```\n\nThe choices can also be provided through DSL using the `choice` method. The `:value` can be a primitive value or `Proc` instance that gets executed and whose value is used as returned type. For example:\n\n```ruby\nprompt.expand(\"Overwrite Gemfile?\") do |q|\n  q.choice key: \"y\", name: \"Overwrite\"      do :ok end\n  q.choice key: \"n\", name: \"Skip\",          value: :no\n  q.choice key: \"a\", name: \"Overwrite all\", value: :all\n  q.choice key: \"d\", name: \"Show diff\",     value: :diff\n  q.choice key: \"q\", name: \"Quit\",          value: :quit\nend\n```\n\nThe first element in the array of choices or provided via `choice` DSL will be the default choice, you can change that by passing `default` option.\n\n```ruby\nprompt.expand(\"Overwrite Gemfile?\", choices)\n# =\u003e\n# Overwrite Gemfile? (enter \"h\" for help) [y,n,q,h]\n```\n\nEach time user types an option a hint will be displayed:\n\n```ruby\n# Overwrite Gemfile? (enter \"h\" for help) [y,n,a,d,q,h] y\n# \u003e\u003e overwrite this file\n```\n\nIf user types `h` and presses enter, an expanded view will be shown which further allows to refine the choice:\n\n```ruby\n# Overwrite Gemfile?\n#   y - overwrite this file\n#   n - do not overwrite this file\n#   q - quit; do not overwrite this file\n#   h - print help\n#   Choice [y]:\n```\n\nRun `examples/expand.rb` to see the prompt in action.\n\n#### 2.7.1 `:auto_hint`\n\nTo show hint by default use `:auto_hint` option:\n\n```ruby\nprompt.expand(\"Overwrite Gemfile?\", choices, auto_hint: true)\n# =\u003e\n# Overwrite Gemfile? (enter \"h\" for help) [y,n,q,h]\n# \u003e\u003e overwrite this file\n```\n\n### 2.8 collect\n\nIn order to collect more than one answer use `collect` method. Using the `key` you can describe the answers key name. All the methods for asking user input such as `ask`, `mask`, `select` can be directly invoked on the key. The key composition is very flexible by allowing nested keys. If you want the value to be automatically converted to required type use [convert](#221-convert).\n\nFor example to gather some contact information do:\n\n```ruby\nprompt.collect do\n  key(:name).ask(\"Name?\")\n\n  key(:age).ask(\"Age?\", convert: :int)\n\n  key(:address) do\n    key(:street).ask(\"Street?\", required: true)\n    key(:city).ask(\"City?\")\n    key(:zip).ask(\"Zip?\", validate: /\\A\\d{3}\\Z/)\n  end\nend\n# =\u003e\n# {:name =\u003e \"Piotr\", :age =\u003e 30, :address =\u003e {:street =\u003e \"Street\", :city =\u003e \"City\", :zip =\u003e \"123\"}}\n```\n\nIn order to collect _mutliple values_ for a given key in a loop, chain `values` onto the `key` desired:\n\n```ruby\nresult = prompt.collect do\n  key(:name).ask(\"Name?\")\n\n  key(:age).ask(\"Age?\", convert: :int)\n\n  while prompt.yes?(\"continue?\")\n    key(:addresses).values do\n      key(:street).ask(\"Street?\", required: true)\n      key(:city).ask(\"City?\")\n      key(:zip).ask(\"Zip?\", validate: /\\A\\d{3}\\Z/)\n    end\n  end\nend\n# =\u003e\n# {\n#   :name =\u003e \"Piotr\",\n#   :age =\u003e 30,\n#   :addresses =\u003e [\n#     {:street =\u003e \"Street\", :city =\u003e \"City\", :zip =\u003e \"123\"},\n#     {:street =\u003e \"Street\", :city =\u003e \"City\", :zip =\u003e \"234\"}\n#   ]\n# }\n```\n\n### 2.9 suggest\n\nTo suggest possible matches for the user input use `suggest` method like so:\n\n```ruby\nprompt.suggest(\"sta\", [\"stage\", \"stash\", \"commit\", \"branch\"])\n# =\u003e\n# Did you mean one of these?\n#         stage\n#         stash\n```\n\nTo customize query text presented pass `:single_text` and `:plural_text` options to respectively change the message when one match is found or many.\n\n```ruby\npossible = %w(status stage stash commit branch blame)\nprompt.suggest(\"b\", possible, indent: 4, single_text: \"Perhaps you meant?\")\n# =\u003e\n# Perhaps you meant?\n#     blame\n```\n\n### 2.10 slider\n\nIf you'd rather not display all possible values in a vertical list, you may consider using `slider`. The slider provides easy visual way of picking a value marked by `●` symbol.\n\nFor integers, you can set `:min`(defaults to 0), `:max` and `:step`(defaults to 1) options to configure slider range:\n\n```ruby\nprompt.slider(\"Volume\", min: 0, max: 100, step: 5)\n# =\u003e\n# Volume ──────────●────────── 50\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nFor everything else, you can provide an array of your desired choices:\n\n```ruby\nprompt.slider(\"Letter\", ('a'..'z').to_a)\n# =\u003e\n# Letter ────────────●───────────── m\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nBy default the slider is configured to pick middle of the range as a start value, you can change this by using the `:default` option:\n\n```ruby\nprompt.slider(\"Volume\", max: 100, step: 5, default: 75)\n# =\u003e\n# Volume ───────────────●────── 75\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nYou can also select the default value by name:\n\n```ruby\nprompt.slider(\"Letter\", ('a'..'z').to_a, default: 'q')\n# =\u003e\n# Letter ──────────────────●─────── q\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nYou can also change the default slider formatting using the `:format`. The value must contain the `:slider` token to show current value and any `sprintf` compatible flag for number display, in our case `%d`:\n\n```ruby\nprompt.slider(\"Volume\", max: 100, step: 5, default: 75, format: \"|:slider| %d%%\")\n# =\u003e\n# Volume |───────────────●──────| 75%\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nYou can also specify slider range with decimal numbers. For example, to have a step of `0.5` and display each value with a single decimal place use `%f` as format:\n\n```ruby\nprompt.slider(\"Volume\", max: 10, step: 0.5, default: 5, format: \"|:slider| %.1f\")\n# =\u003e\n# Volume |───────────────●──────| 7.5\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nYou can alternatively provide a proc/lambda to customize your formatting even further:\n\n```ruby\nslider_format = -\u003e (slider, value) { \"|#{slider}| #{value.zero? ? \"muted\" : \"%.1f\"}\" % value }\nprompt.slider(\"Volume\", max: 10, step: 0.5, default: 0, format: slider_format)\n# =\u003e\n# Volume |●─────────────────────| muted\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nIf you wish to change the slider handle and the slider range display use `:symbols` option:\n\n```ruby\nprompt.slider(\"Volume\", max: 100, step: 5, default: 75, symbols: {bullet: \"x\", line: \"_\"})\n# =\u003e\n# Volume _______________x______ 75%\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\nYou can configure help message with `:help` and when to display with `:show_help` options. The help can be displayed on `start`, `never` or `always`:\n\n```ruby\nprompt.slider(\"Volume\", max: 10, default: 7, help: \"(Move arrows left and right to set value)\", show_help: :always)\n# =\u003e\n# Volume ───────────────●────── 7\n# (Move arrows left and right to set value)\n```\n\nSlider can be configured through DSL as well:\n\n```ruby\nprompt.slider(\"What size?\") do |range|\n  range.max 100\n  range.step 5\n  range.default 75\n  range.format \"|:slider| %d%%\"\nend\n# =\u003e\n# Volume |───────────────●──────| 75%\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\n```ruby\nprompt.slider(\"What letter?\") do |range|\n  range.choices ('a'..'z').to_a\n  range.format \"|:slider| %s\"\n  range.default 'q'\nend\n# =\u003e\n# What letter? |──────────────────●───────| q\n# (Use ←/→ arrow keys, press Enter to select)\n```\n\n\n### 2.11 say\n\nTo simply print message out to standard output use `say` like so:\n\n```ruby\nprompt.say(...)\n```\n\nThe `say` method also accepts option `:color` which supports all the colors provided by [pastel](https://github.com/piotrmurach/pastel#3-supported-colors)\n\n**TTY::Prompt** provides more specific versions of `say` method to better express intention behind the message such as `ok`, `warn` and `error`.\n\n#### 2.11.1 ok\n\nPrint message(s) in green do:\n\n```ruby\nprompt.ok(...)\n```\n\n#### 2.12.2 warn\n\nPrint message(s) in yellow do:\n\n```ruby\nprompt.warn(...)\n```\n\n#### 2.11.3 error\n\nPrint message(s) in red do:\n\n```ruby\nprompt.error(...)\n```\n\n#### 2.12 keyboard events\n\nAll the prompt types, when a key is pressed, fire key press events. You can subscribe to listen to this events by calling `on` with type of event name.\n\n```ruby\nprompt.on(:keypress) { |event| ... }\n```\n\nThe event object is yielded to a block whenever particular event fires. The event has `key` and `value` methods. Further, the `key` responds to following messages:\n\n* `name`  - the name of the event such as :up, :down, letter or digit\n* `meta`  - true if event is non-standard key associated\n* `shift` - true if shift has been pressed with the key\n* `ctrl`  - true if ctrl has been pressed with the key\n\nFor example, to add vim like key navigation to `select` prompt one would do the following:\n\n```ruby\nprompt.on(:keypress) do |event|\n  if event.value == \"j\"\n    prompt.trigger(:keydown)\n  end\n\n  if event.value == \"k\"\n    prompt.trigger(:keyup)\n  end\nend\n```\n\nYou can subscribe to more than one event:\n\n```ruby\nprompt.on(:keypress) { |key| ... }\n      .on(:keydown)  { |key| ... }\n```\n\nThe available events are:\n\n* `:keypress`\n* `:keydown`\n* `:keyup`\n* `:keyleft`\n* `:keyright`\n* `:keynum`\n* `:keytab`\n* `:keyenter`\n* `:keyreturn`\n* `:keyspace`\n* `:keyescape`\n* `:keydelete`\n* `:keybackspace`\n\n## 3 settings\n\n### 3.1. `:symbols`\n\nMany prompts use symbols to display information. You can overwrite the default symbols for all the prompts using the `:symbols` key and hash of symbol names as value:\n\n```ruby\nprompt = TTY::Prompt.new(symbols: {marker: \"\u003e\"})\n```\n\nThe following symbols can be overwritten:\n\n| Symbols     | Unicode | ASCII |\n| ----------- |:-------:|:-----:|\n|  tick       | `✓`     | `√`   |\n|  cross      | `✘`     | `x`   |\n|  marker     | `‣`     | `\u003e`   |\n|  dot        | `•`     | `.`   |\n|  bullet     | `●`     | `O`   |\n|  line       | `─`     | `-`   |\n|  radio_on   | `⬢`     | `(*)` |\n|  radio_off  | `⬡`     | `( )` |\n|  arrow_up   | `↑`     | `↑`   |\n|  arrow_down | `↓`     | `↓`   |\n|  arrow_left | `←`     | `←`   |\n|  arrow_right| `→`     | `→`   |\n\n### 3.2 `:active_color`\n\nAll prompt types support `:active_color` option. By default it's set to `:green` value.\n\nThe `select`, `multi_select`, `enum_select` and `expand` prompts use the active color to highlight the currently selected choice.\n\nThe answer provided by the user is also highlighted with the active color.\n\nThis `:active_color` as value accepts either a color symbol or callable object.\n\nFor example, to change all prompts active color to `:cyan` do:\n\n```ruby\nprompt = TTY::Prompt.new(active_color: :cyan)\n```\n\nYou could also use `pastel`:\n\n```ruby\nnotice = Pastel.new.cyan.on_blue.detach\nprompt = TTY::Prompt.new(active_color: notice)\n````\n\nOr use coloring of your own choice:\n\n```\nprompt = TTY::Prompt.new(active_color: -\u003e(str) { my-color-gem(str) })\n```\n\nThis option can be applied either globally for all prompts or individually:\n\n```ruby\nprompt.select(\"What size?\", %w(Large Medium Small), active_color: :cyan)\n```\n\nPlease [see pastel](https://github.com/piotrmurach/pastel#3-supported-colors) for all supported colors.\n\n### 3.3 `:enable_color`\n\nIf you wish to disable coloring for a prompt simply pass `:enable_color` option\n\n```ruby\nprompt = TTY::Prompt.new(enable_color: false)\n```\n\n### 3.4 `:help_color`\n\nThe `:help_color` option is used to customize the display color for all the help text. By default it's set to `:bright_black` value.\n\nPrompts such as `select`, `multi_select`, `expand` support `:help_color`. This option can be applied either globally for all prompts or individually.\n\nThe `:help_color` option as value accepts either a color symbol or callable object.\n\nFor example, to change all prompts help color to `:cyan` do:\n\n```ruby\nprompt = TTY::Prompt.new(help_color: :cyan)\n```\n\nYou could also use `pastel`:\n\n```ruby\nnotice = Pastel.new.cyan.on_blue.detach\nprompt = TTY::Prompt.new(help_color: notice)\n````\n\nOr use coloring of your own choice:\n\n```ruby\nprompt = TTY::Prompt.new(help_color: -\u003e(str) { my-color-gem(str) })\n```\n\nOr configure `:help_color` for an individual prompt:\n\n```ruby\nprompt.select(\"What size?\", %w(Large Medium Small), help_color: :cyan)\n```\n\nPlease [see pastel](https://github.com/piotrmurach/pastel#3-supported-colors) for all supported colors.\n\n### 3.5 `:interrupt`\n\nBy default `InputInterrupt` error will be raised when the user hits the interrupt key(Control-C). However, you can customise this behaviour by passing the `:interrupt` option. The available options are:\n\n* `:signal` - sends interrupt signal\n* `:exit` - exits with status code\n* `:noop` - skips handler\n* custom proc\n\nFor example, to send interrupt signal do:\n\n```ruby\nprompt = TTY::Prompt.new(interrupt: :signal)\n```\n\n### 3.6 `:prefix`\n\nYou can prefix each question asked using the `:prefix` option. This option can be applied either globally for all prompts or individual for each one:\n\n```ruby\nprompt = TTY::Prompt.new(prefix: \"[?] \")\n```\n\n### 3.7 `:quiet`\n\nPrompts such as `select`, `multi_select`, `expand`, `slider` support `:quiet` which is used to disable re-echoing of the question and answer after selection is done. This option can be applied either globally for all prompts or individually.\n\n```ruby\n# global\nprompt = TTY::Prompt.new(quiet: true)\n# single prompt\nprompt.select(\"What is your favorite color?\", %w(blue yellow orange))\n````\n\n### 3.8 `:track_history`\n\nThe prompts that accept line input such as `multiline` or `ask` provide history buffer that tracks all the lines entered during `TTY::Prompt.new` interactions. The history buffer provides previous or next lines when user presses up/down arrows respectively. However, if you wish to disable this behaviour use `:track_history` option like so:\n\n```ruby\nprompt = TTY::Prompt.new(track_history: false)\n```\n\n## Contributing\n\n1. Fork it ( https://github.com/piotrmurach/tty-prompt/fork )\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create a new Pull Request\n\nThis project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.\n\n## Copyright\n\nCopyright (c) 2015 Piotr Murach. See LICENSE for further details.\n","funding_links":["https://github.com/sponsors/piotrmurach"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["activerecord","code-formatter","rubocop","static-code-analysis","activejob","mvc","rspec","line-editing","word-completion","deployment"],"project_url":"https://ruby.ecosyste.ms/api/v1/projects/339","html_url":"https://ruby.ecosyste.ms/projects/339"}