{"id":13503264,"url":"https://github.com/stylemistake/runner","last_synced_at":"2026-01-27T20:50:46.970Z","repository":{"id":35746543,"uuid":"40025699","full_name":"stylemistake/runner","owner":"stylemistake","description":"Simple, lightweight task runner for Bash.","archived":false,"fork":false,"pushed_at":"2023-11-06T15:09:27.000Z","size":134,"stargazers_count":171,"open_issues_count":2,"forks_count":15,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-08-24T01:55:56.505Z","etag":null,"topics":["bash","runner","task"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stylemistake.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2015-07-31T21:31:45.000Z","updated_at":"2025-06-05T18:22:36.000Z","dependencies_parsed_at":"2023-11-06T23:39:58.266Z","dependency_job_id":"386209de-307d-4188-b80e-a34ef8ea7dc1","html_url":"https://github.com/stylemistake/runner","commit_stats":{"total_commits":100,"total_committers":7,"mean_commits":"14.285714285714286","dds":"0.22999999999999998","last_synced_commit":"cc060ed72d07e08e7a99e378e9f4b93af2923b96"},"previous_names":["stylemistake/bash-task-runner"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/stylemistake/runner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stylemistake%2Frunner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stylemistake%2Frunner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stylemistake%2Frunner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stylemistake%2Frunner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stylemistake","download_url":"https://codeload.github.com/stylemistake/runner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stylemistake%2Frunner/sbom","scorecard":{"id":856557,"data":{"date":"2025-08-11","repo":{"name":"github.com/stylemistake/runner","commit":"6abbb38dc36efac6ad73cd9b6a2c33225df08a67"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"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":"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":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":3,"reason":"Found 9/28 approved changesets -- score normalized to 3","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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.8.0 not signed: https://api.github.com/repos/stylemistake/runner/releases/6928920","Warn: release artifact v0.7.1 not signed: https://api.github.com/repos/stylemistake/runner/releases/3317193","Warn: release artifact v0.7.0 not signed: https://api.github.com/repos/stylemistake/runner/releases/3317136","Warn: release artifact v0.8.0 does not have provenance: https://api.github.com/repos/stylemistake/runner/releases/6928920","Warn: release artifact v0.7.1 does not have provenance: https://api.github.com/repos/stylemistake/runner/releases/3317193","Warn: release artifact v0.7.0 does not have provenance: https://api.github.com/repos/stylemistake/runner/releases/3317136"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 11 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-24T00:00:27.084Z","repository_id":35746543,"created_at":"2025-08-24T00:00:27.084Z","updated_at":"2025-08-24T00:00:27.084Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28822139,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T18:44:20.126Z","status":"ssl_error","status_checked_at":"2026-01-27T18:44:09.161Z","response_time":168,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","runner","task"],"created_at":"2024-07-31T22:02:44.008Z","updated_at":"2026-01-27T20:50:46.953Z","avatar_url":"https://github.com/stylemistake.png","language":"Shell","funding_links":[],"categories":["Shell"],"sub_categories":[],"readme":"# Runner\n\n[![Travis](https://travis-ci.org/stylemistake/runner.svg)][travis]\n[![NPM](https://badge.fury.io/js/bash-task-runner.svg)][npm]\n\n\u003e A simple, lightweight task runner for Bash.\n\nRunner was made to replace Make in those few use cases, when all you need is a\nbunch of `.PHONY` targets that are simple shell scripts. It uses a familiar\nBash syntax and only depends on `bash` and `coreutils`.\n\nIn addition, Runner provides tools to run tasks in parallel for improved\nperformance, nice logging facilities and error handling.\n\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n## Table of contents\n\n- [Dependencies](#dependencies)\n- [Installation](#installation)\n  - [Simple (vendored)](#simple-vendored)\n  - [Submodule (vendored)](#submodule-vendored)\n  - [Homebrew](#homebrew)\n  - [NPM](#npm)\n  - [Git + PATH](#git--path)\n- [CLI](#cli)\n  - [Autocompletion](#autocompletion)\n  - [Flag propagation](#flag-propagation)\n- [Runnerfile](#runnerfile)\n  - [Naming convention](#naming-convention)\n  - [Default task](#default-task)\n  - [Task chaining](#task-chaining)\n  - [Error handling](#error-handling)\n- [Function reference](#function-reference)\n  - [`runner_log [message]`](#runner_log-message)\n  - [`runner_colorize \u003ccolor\u003e [message]`](#runner_colorize-color-message)\n  - [`runner_run [command]`](#runner_run-command)\n  - [`runner_get_defined_tasks`](#runner_get_defined_tasks)\n  - [`runner_is_defined \u003cname\u003e`](#runner_is_defined-name)\n  - [`runner_is_task_defined [task...]`](#runner_is_task_defined-task-)\n  - [`runner_sequence [task...]`](#runner_sequence-task-)\n  - [`runner_parallel [task...]`](#runner_parallel-task-)\n  - [`runner_bootstrap`](#runner_bootstrap)\n- [Contribution](#contribution)\n- [License](#license)\n- [Contacts](#contacts)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n\n## Dependencies\n\nRunner depends on:\n\n- bash `\u003e=4.2`\n- coreutils `\u003e=8.0`\n\nFor non-GNU environments, it also depends on:\n\n- perl `\u003e=5.0` (for resolving symlinks)\n\n**Note for macOS users:**\n\nRunner should work with bash version 3.2 and macOS version of coreutils, but\nthat way you will miss a lot of the fancy stuff that comes with the Runner.\n\nFor improved experience, use [Homebrew] to install the missing dependencies:\n\n```bash\nbrew install bash coreutils\n```\n\n\n## Installation\n\nEach of the below installation methods is differentiated along two properties:\n\n- **Local to project**\n  - Whether Runner will be installed locally to your project or globally on a\n    system.\n  - This is good for CI builds and spinning up multiple people on your project\n- **CLI-enabled**\n  - Whether you will be able to use the `runner` command from your prompt.\n  - Useful for local development, tab completion, and convenience.\n\nYou may want to combine multiple installation methods in order to satisfy both\nof these requirements. In particular, we recommend\n[**Simple (vendored)**](#simple-vendored) with a method that gives you\na CLI and is compatible with your system.\n\n|                      | Local to Project   | CLI-enabled        |\n| ---                  | ---                | ---                |\n| Simple (vendored)    | :white_check_mark: | :no_entry_sign:    |\n| Submodule (vendored) | :white_check_mark: | :white_check_mark: |\n| Homebrew             | :no_entry_sign:    | :white_check_mark: |\n| NPM                  | :white_check_mark: | :white_check_mark: |\n| Git + PATH           | :no_entry_sign:    | :white_check_mark: |\n\n### Simple (vendored)\n\nJust drop `src/runner.sh` anywhere in your project folder:\n\n```bash\nwget https://raw.githubusercontent.com/stylemistake/runner/master/src/runner.sh\n```\n\nThen skip to [Runnerfile](#runnerfile) for how to use a vendored Runner\ninstallation.\n\n### Submodule (vendored)\n\nIf you'd like a slightly better story around updating Runner when vendored, you\ncan use a Git submodule, if you're [familiar with submodules][submodules]:\n\n```bash\ngit submodule add https://github.com/stylemistake/runner\n```\n\n\u003e Note that if submodules are too heavy-handed, you can get the same effect\n\u003e (without the ease of updating) by just unzip'ing Runner's source into your\n\u003e project.\n\nYou should now be able to access `runner.sh` within the submodule. Additionally,\nyou can access the CLI with `./runner/bin/runner`. You can make this more\nergonomic by altering your PATH:\n\n```bash\nexport PATH=\"$PATH:./runner/bin\"\n```\nTo avoid modifying your path, you can add `runner` as a git alias:\n```bash\ngit config alias.runner = '!f(){ bash ./runner/bin/runner $@; }; f'\n# runner can now be called as\ngit runner\n```\nNote this will prevent the runner from recognizing `--help`, but will still allow using `-h` to print the usage documentation.\n\nThen skip to [CLI](#cli) to learn how to use the CLI.\n\n### Homebrew\n\nOn OS X, installing Runner globally is simple if you have Homebrew:\n\n```bash\nbrew install stylemistake/formulae/runner\n```\n\nThen skip to [CLI](#cli) to learn how to use the CLI.\n\n### NPM\n\nIf you don't mind the additional dependency on the NPM ecosystem, you can\ninstall Runner with NPM:\n\n```bash\n# --- Local to Project --- #\nnpm install --save bash-task-runner\n\n# to enable CLI:\nexport PATH=\"PATH:./node_modules/.bin\"\n\n# --- Global --- #\nnpm install -g bash-task-runner\n```\n\nThen skip to [CLI](#cli) to learn how to use the CLI.\n\n### Git + PATH\n\nIf Runner is not available in a package manager for your system, you can clone\nRunner to your computer, and adjust your PATH to contain the installation\nlocation:\n\n```bash\ngit clone https://github.com/stylemistake/runner\n\nexport PATH=\"$PATH:$(pwd)/runner/bin\"\n```\n\nThen skip to [CLI](#cli) to learn how to use the CLI.\n\n\n## CLI\n\nPlease see `runner -h` for complete, up-to-date CLI usage information.\n\n```\nUsage: runner [options] [task] [task_options] ...\nOptions:\n  -C \u003cdir\u003e, --directory=\u003cdir\u003e  Change to \u003cdir\u003e before doing anything.\n  --completion=\u003cshell\u003e         Output code to activate task completions.\n                               Supported shells: 'bash'.\n  -f \u003cfile\u003e, --file=\u003cfile\u003e     Use \u003cfile\u003e as a runnerfile.\n  -l, --list-tasks             List available tasks.\n  -v, --version                Print the version of runner used\n  -h, --help                   Print this message and exit.\n```\n\n### Autocompletion\n\nThe `runner` CLI supports autocompletion for task names and flags.\nAdd the following line your `~/.bashrc`:\n\n```bash\neval $(runner --completion=bash)\n```\n\n### Flag propagation\n\nAll flags you pass after the task name are passed to your tasks.\n\n```bash\n$ runner foo --production\n\ntask_foo() {\n    echo ${@} # --production\n}\n```\n\nTo pass options to the `runner` CLI specifically, you must provide them\nbefore any task names:\n\n```bash\n$ runner -f scripts/tasks.sh foo\n```\n\n\n## Runnerfile\n\nRunner works in conjunction with a `runnerfile.sh`. A basic Runnerfile looks\nlike this:\n\n```bash\ntask_foo() {\n    ## Do something...\n}\n\ntask_bar() {\n    ## Do something...\n}\n```\n\nInvoke Runner using `runner [task...]`:\n\n```bash\n$ runner foo bar\n[23:43:37.754] Starting 'foo'\n[23:43:37.755] Finished 'foo' after 1 ms\n[23:43:37.756] Starting 'bar'\n[23:43:37.757] Finished 'bar' after 1 ms\n```\n\n**Optional**: If you want the Runnerfile to be a standalone script, add\nthis to the beginning (works best in conjunction with a vendored installation):\n\n```bash\n#!/usr/bin/env bash\ncd \"$(dirname \"$0\")\" || exit\nsource \u003cpath_to\u003e/runner.sh\n```\n\nTo invoke such script, use `bash runnerfile.sh [task...]`.\n\n### Naming convention\n\nYour Runnerfile can be named any of the following. Using a `.sh` suffix helps\nwith editor syntax highlighting.\n\n- `Runnerfile`\n- `Runnerfile.sh`\n- `runnerfile`\n- `runnerfile.sh`\n\n### Default task\n\nYou can specify a default task in your Runnerfile. It will run when no arguments\nare provided. There are two ways to do this:\n\n```bash\ntask_default() {\n    # do something ...\n}\n```\n\n```bash\nrunner_default_task=\"foo\"\ntask_foo() {\n    # do something ...\n}\n```\n\n### Task chaining\n\nTasks can launch other tasks in two ways: *sequentially* and in *parallel*.\nThis way you can optimize the task flow for maximum concurrency.\n\nTo run tasks sequentially, use:\n\n```bash\ntask_default() {\n    runner_sequence foo bar\n    ## [23:50:33.194] Starting 'foo'\n    ## [23:50:33.195] Finished 'foo' after 1 ms\n    ## [23:50:33.196] Starting 'bar'\n    ## [23:50:33.198] Finished 'bar' after 2 ms\n}\n```\n\nTo run tasks in parallel, use:\n\n```bash\ntask_default() {\n    runner_parallel foo bar\n    ## [23:50:33.194] Starting 'foo'\n    ## [23:50:33.194] Starting 'bar'\n    ## [23:50:33.196] Finished 'foo' after 2 ms\n    ## [23:50:33.196] Finished 'bar' after 2 ms\n}\n```\n\n### Error handling\n\nSometimes you need to stop the task if one of the commands fails.\nYou can achieve this with a conditional return:\n\n```bash\ntask_foo() {\n    ...\n    php composer.phar install || return\n    ...\n}\n```\n\nIf a failed task was a part of a sequence, the whole sequence fails. Same\napplies to the tasks running in parallel.\n\nNotice that you should use this pattern for the whole sequence too to ensure\nno further code is executed afterwards and the overall return code is\ncorrectly set:\n\n```bash\ntask_default() {\n    ...\n    runner_sequence foo bar || return\n    ...\n    echo \"Won't show up on error above\"\n}\n```\n\n\n## Function reference\n\n### `runner_log [message]`\n\nPrints a message with a timestamp. Variations of log with colors:\n\n- `runner_log_error` (red)\n- `runner_log_warning` (yellow)\n- `runner_log_success` (green)\n- `runner_log_notice` (gray)\n\n### `runner_colorize \u003ccolor\u003e [message]`\n\nColorizes the message with the specified color. Here's a list of colors:\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `purple`\n- `cyan`\n- `light_gray`\n- `gray`\n- `light_red`\n- `light_green`\n- `light_yellow`\n- `light_blue`\n- `light_purple`\n- `light_cyan`\n- `white`\n\n### `runner_run [command]`\n\n`runner_run` command gives a way to run commands and have them outputted:\n\n```bash\ntask_default() {\n    runner_run composer install\n    ## [12:19:17.170] Starting 'default'...\n    ## [12:19:17.173] composer install\n    ## Loading composer repositories with package information\n    ## ...\n    ## [12:19:17.932] Finished 'default' after 758 ms\n}\n```\n\n### `runner_get_defined_tasks`\n\nLists all functions beginning with `task_`.\n\n### `runner_is_defined \u003cname\u003e`\n\nChecks if function is defined or program is accessible from current `$PATH`.\n\n### `runner_is_task_defined [task...]`\n\nChecks if task name is defined.\n\n### `runner_sequence [task...]`\n\nRuns tasks sequentially. If any task in the sequence fails, it stops execution\nand returns an error code of a failed task.\n\n### `runner_parallel [task...]`\n\nRuns tasks in parallel, and lets them finish even if any error occurs. In case\nof an error, this command returns a special error code.\n\nError codes:\n\n- `1` - one task has failed\n- `2` - some tasks have failed\n- `3` - all tasks have failed\n\n### `runner_bootstrap`\n\nLaunches the task runner. This can be used to override the default startup\nmechanism.\n\nBy default, task runner starts up when it reaches the end of a Runnerfile.\nBy using `runner_bootstrap`, you can manually choose a point where it begins\nto run tasks:\n\n```bash\ntask_default() {\n    ## Do things...\n}\n\nrunner_bootstrap ## \u003c-- runs tasks here\n\nif [[ ${?} -eq 0 ]]; then\n    echo \"Success! :)\"\nelse\n    echo \"Failure! :(\"\nfi\n```\n\nIn example above, we used `runner_bootstrap` to create a code section, which\nhandles the runner's exit code. You can use this to handle errors, do\ncleanup work or restart certain tasks when needed.\n\n\n## Contribution\n\nPlease provide pull requests in a separate branch (other than `master`), this\nway it's easier for me to review and pull changes.\n\nBefore writing code, open an [issue][issues] to get initial feedback.\n\n\n## License\n\nThis software is covered by GNU Lesser General Public License v3 (LGPL-3.0).\nSee [LICENSE.md].\n\n\n## Contacts\n\nStyle Mistake \u003c[stylemistake@gmail.com]\u003e\n\n\n[travis]: https://travis-ci.org/stylemistake/runner\n[gitter]: https://gitter.im/stylemistake/bash-task-runner\n[npm]: https://www.npmjs.com/package/bash-task-runner\n[homebrew]: http://brew.sh/\n[src/runner.sh]: https://raw.githubusercontent.com/stylemistake/runner/master/src/runner.sh\n[issues]: https://github.com/stylemistake/runner/issues\n[submodules]: https://git-scm.com/book/en/v2/Git-Tools-Submodules\n[faq]: https://github.com/stylemistake/runner/wiki/FAQ\n[LICENSE.md]: LICENSE.md\n[stylemistake@gmail.com]: mailto:stylemistake@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstylemistake%2Frunner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstylemistake%2Frunner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstylemistake%2Frunner/lists"}