{"id":24905756,"url":"https://github.com/smokingplaya/puff","last_synced_at":"2026-04-17T13:33:06.469Z","repository":{"id":275336618,"uuid":"925788753","full_name":"smokingplaya/puff","owner":"smokingplaya","description":"💛 YAML based Command Runner with multithreading","archived":false,"fork":false,"pushed_at":"2025-04-07T19:39:57.000Z","size":106,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-09T00:08:22.481Z","etag":null,"topics":["automation","rust","scripts","yaml","yml"],"latest_commit_sha":null,"homepage":"https://smokingplaya.gitbook.io","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/smokingplaya.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-01T18:46:27.000Z","updated_at":"2025-09-12T20:03:34.000Z","dependencies_parsed_at":"2025-03-27T21:45:59.285Z","dependency_job_id":"6924d889-abb2-441e-b9f2-946e1ff2be4c","html_url":"https://github.com/smokingplaya/puff","commit_stats":null,"previous_names":["smokingplaya/puff"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/smokingplaya/puff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smokingplaya%2Fpuff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smokingplaya%2Fpuff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smokingplaya%2Fpuff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smokingplaya%2Fpuff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smokingplaya","download_url":"https://codeload.github.com/smokingplaya/puff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smokingplaya%2Fpuff/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31931458,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-17T12:37:54.787Z","status":"ssl_error","status_checked_at":"2026-04-17T12:37:25.095Z","response_time":62,"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"}},"keywords":["automation","rust","scripts","yaml","yml"],"created_at":"2025-02-02T00:24:44.513Z","updated_at":"2026-04-17T13:33:06.451Z","avatar_url":"https://github.com/smokingplaya.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\"/\u003e\n\n  Puff\n\u003c/h1\u003e\n\n\u003ch3 align=\"center\"\u003eThe puffiest CLI tool\u003c/h3\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/release/smokingplaya/puff.svg\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/smokingplaya/puff.svg\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/issues/smokingplaya/puff.svg\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/smokingplaya/puff.svg\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Made%20with%20Rust-000000?style=for-the-badge\u0026logo=rust\u0026logoColor=white\"\u003e\n\u003c/div\u003e\n\nPuff is a CLI tool that allows you to write predefined sets of commands using YAML.\n\nPuff is similar to [GNU/Make](https://www.gnu.org/software/make/).\n\n\u003e [!NOTE]\n\u003e You can just look at [Example](#example), and you'll probably understand the idea, and how to use Puff.\n\n![runtime](assets/runtime.png)\n\n# Table of contents\n* [Installation](#installation)\n  * [Linux](#linux)\n  * [Windows](#windows)\n* [Usage](#usage)\n  * [Example](#example)\n  * [Puff File](#puff-file)\n  * [Tasks](#tasks)\n  * [Puff File Data](#data)\n  * [Arguments](#arguments)\n  * [Variables](#variables)\n  * [Configuration](#configuration)\n  * [Multi Thread commands](#multi-thread-commands)\n  * [Built-in commands](#built-in-commands)\n* [Building](#building)\n* [Contribution](#contribution)\n\n# Installation\n## Linux\n1. Open terminal\n2. Paste command\n```bash\n/bin/sh -c \"$(curl -fsSL https://raw.githubusercontent.com/smokingplaya/puff/HEAD/install/linux.sh)\"\n```\n\n## Windows\n1. Open powershell **with admin rights**\n2. Paste command\n```bash\n\u0026 {Invoke-WebRequest -Uri \"https://raw.githubusercontent.com/smokingplaya/puff/refs/heads/master/install/windows.ps1\" -OutFile \"$env:USERPROFILE\\Downloads\\install_puff.ps1\"; \u0026 \"$env:USERPROFILE\\Downloads\\install_puff.ps1\"}\n```\n\n# Usage\n\u003e [!NOTE]\n\u003e Workspace = Current Working Directory\n\n## Example\n```yml\ndata: # optional\n  authors: [\"smokingplaya\"]\n  description: Test Puff File\n  projectName: Builder\n\nvariables:\n  imageName: big_bob\n\ntasks:\n  default: # $ puff\n    description: Just default Task # optional\n    commands:\n      - echo\n  build:\n    description: Build project and deploy it\n    commands:\n      - docker build -t ${imageName} .\n      - docker-compose down\n      - docker-compose up -d\n```\n\n## Puff File\nPuff File is the configuration file of the current workspace.\\\nThis means that each workspace should have its own Puff File with tasks defined in it.\n\nPuff File can have 3 different names - ``puff.yaml``, ``puff.yml``, ``.puff``, but ``puff.yaml`` is preferred.\n\nLet's learn more about its structure!\n\n## Tasks\n``tasks`` is the main parameter of the Puff File.\nIt describes all commands to be executed by a particular Task.\nIt's not very clear so far, is it? Let's take a look at an example:\n```yml\ntasks:\n  default:\n    commands:\n      - echo Hello, world!\n```\nSo, this example shows the description of Task ``default``, which when executed will print “Hello, world!” to our console\n\nHow to execute the ``default`` task? Just use\n```bash\npuff\n# or\npuff default\n```\n\u003e [!NOTE]\n\u003e You can change default task.\\\n\u003e See [Configuration](#configuration).\n\nAs you can see, the default task that is executed when there are no arguments is ``default``.\n\n## Data\n\u003e [!NOTE]\n\u003e This parameter is only needed in ``puff list``.\n\nThe ``data`` parameter is optional. It contains data about the current Puff File that describes:\n1. Project name\n2. authors\n3. Description of the current Puff File\n\nExample:\n```yml\ndata:\n  projectName: Example\n  authors: [\"smokingplaya\"]\n  description: Puff File example\n```\n\n## Arguments\nSometimes we need to add some arguments to commands that are not constant and need user input. For this purpose, Puff has a built-in command formatter that substitutes arguments for commands.\n\n\u003e [!NOTE]\n\u003e Puff supports ``.env`` files since version ``0.1.4``.\n\nThere are three types of arguments:\n1. Those entered from the command line\n    * In this case, you must describe these arguments for each Task.\n    ```yml\n    tasks:\n      default:\n        arguments:\n          - name: home\n          - name: name_of_bob\n            options: [\"Bob\", \"Maybe Bob\", \"Andrew\"]\n          - name: save_path\n            default: /home/drippy/cheese\n        commands:\n          - echo \"${home} -\u003e ${save_path}\"\n    ```\n2. Constants (``variables`` parameter)\n    * See [Variables](#variables)\n3. Environment variables\n    * Just look at example:\n    ```yml\n    tasks:\n      default:\n        commands:\n          - echo ${JAVA_HOME}\n    ```\n\n\n## Variables\nThe ``variables`` parameter describes “constants” that you can use in commands as arguments.\n\nExample:\n```yml\nvariables:\n  bestGame: minecraft\n\ntasks:\n  default:\n    commands:\n      - echo \"I love ${bestGame}\"\n```\n\n## Configuration\nThe ``configuration`` field is needed to reassign internal values such as ``shell`` and ``task``.\n\nExample:\n```yml\nconfiguration:\n  shell: bash\n  task: run\n\ntasks:\n  # $ puff\n  # will be run \"run\" task\n  run:\n    commands: []\n```\n\n## Shell\n``shell`` is the parameter responsible for the environment in which tasks will be run.\nBy default, all tasks are started in the same shell in which you started Puff.\n\nFor example, you can specify ``powershell``, ``cmd`` (windows), ``bash``, ``zsh``, ``fish``.\n\n## Task\n``shell`` is the parameter responsible for which task will be started when there is no task (i.e. by default).\nValue by default: ``default``\n\n## Multi Thread commands\nPuff supports executing commands in a multithreaded fashion.\\\nThis allows you to execute commands independently of each other, thus reducing the time required to complete a task.\n\n### Usage\n```yml\n- async: Command\n```\n\nExample:\n```yml\ntasks:\n  default:\n    commands:\n      # regular command\n      - echo\n      # multi threaded commands\n      - async: gcc projects/soundsystem/main.cpp -o build/soundsystem.o\n      - async: gcc projects/ui/main.cpp -o build/ui.o\n      - async: gcc projects/windowhandler/main.cpp -o build/windowhandler.o\n```\n\n### Await\nSometimes we can do several commands in threads, but it may happen that we need to wait for the threads to finish their work before executing a command.\n\nFor this case we have the ``await:`` keyword.\n\nExample:\n```yml\ntasks:\n  default:\n    commands:\n      # regular command\n      - echo\n      # multi threaded commands\n      - async: gcc projects/soundsystem/main.cpp -o build/soundsystem.o\n      - async: gcc projects/ui/main.cpp -o build/ui.o\n      - async: gcc projects/windowhandler/main.cpp -o build/windowhandler.o\n      - echo \"pre-thread echo\"\n      - await: echo \"threads have been completed\"\n```\n\n## Built-in commands\n### List\nUsage\n```bash\npuff list\n```\nDisplays all commands defined in the current Puff File, also showing which commands have which arguments, and what values the default arguments have.\n\n### Help\nUsage\n```bash\npuff help\n```\nDisplays all commands, build-in in Puff\n\n# Building\n1. Install [Rust Lang](https://rust-lang.org)\n2. Open your terminal and paste this\n```bash\ngit https://github.com/smokingplaya/puff\ncd puff\n# In debug mode\ncargo build\n# In release mode\ncargo build --release\n```\n\nThen you can run builded [Puff](https://github.com/smokingplaya/puff)\n```bash\n# Manually in debug mode\n./target/debug/puff #(puff.exe on windows)\n# Manually in release mode\n./target/release/puff #(puff.exe on windows)\n\n# Via cargo\ncargo run\n```\n\n# Contribution\nWe always welcome good pull requests that take place, as well as those that fix/add some functionality.\n\nWe don't have a specific code style, or other rules for writing code, we just look at your changes and if we like them we accept them.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmokingplaya%2Fpuff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmokingplaya%2Fpuff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmokingplaya%2Fpuff/lists"}