{"id":50728589,"url":"https://github.com/kettle-dev/ts-grammar-action","last_synced_at":"2026-06-10T06:06:00.803Z","repository":{"id":349917846,"uuid":"1124994219","full_name":"kettle-dev/ts-grammar-action","owner":"kettle-dev","description":"📦️ GHA: Install tree sitter, language grammars, rust, java, and al the fiddly bits like ENV variables","archived":false,"fork":false,"pushed_at":"2026-04-08T04:41:19.000Z","size":38,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-09T11:26:13.841Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"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/kettle-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-12-30T01:15:52.000Z","updated_at":"2026-04-08T04:41:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kettle-dev/ts-grammar-action","commit_stats":null,"previous_names":["kettle-rb/ts-grammar-action","kettle-dev/ts-grammar-action"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/kettle-dev/ts-grammar-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kettle-dev%2Fts-grammar-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kettle-dev%2Fts-grammar-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kettle-dev%2Fts-grammar-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kettle-dev%2Fts-grammar-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kettle-dev","download_url":"https://codeload.github.com/kettle-dev/ts-grammar-action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kettle-dev%2Fts-grammar-action/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34139197,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"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"}},"keywords":[],"created_at":"2026-06-10T06:06:00.065Z","updated_at":"2026-06-10T06:06:00.789Z","avatar_url":"https://github.com/kettle-dev.png","language":null,"funding_links":["https://opencollective.com/kettle-rb","https://github.com/sponsors/pboling","https://liberapay.com/pboling/donate","https://www.paypal.com/paypalme/peterboling","https://tidelift.com/subscription/pkg/rubygems-ts-grammar-action?utm_source=rubygems-ts-grammar-action\u0026utm_medium=referral\u0026utm_campaign=readme","https://polar.sh/pboling","https://ko-fi.com/O5O86SNP4","https://patreon.com/galtzo","https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff","https://www.buymeacoffee.com/pboling"],"categories":[],"sub_categories":[],"readme":"# ts-grammar-action\n\nA GitHub Action for installing tree-sitter and language grammars via [tsdl](https://github.com/stackmystack/tsdl).\n\nThis action wraps the official [`tree-sitter/setup-action`](https://github.com/tree-sitter/setup-action) and uses `tsdl` to build and install language-specific grammar shared libraries.\n\n## Features\n\n  - 🌲 Uses official `tree-sitter/setup-action` for library and CLI installation\n  - 📦 Builds grammar shared libraries (`.so` files) via [tsdl](https://github.com/stackmystack/tsdl)\n  - 📌 Pinned grammar versions by default (override with `grammar-*-ref` inputs)\n  - ⚡ Caching support via the official action\n  - 🔧 Configures environment variables (`TREE_SITTER_*_PATH`) for each grammar\n  - 🐧 Linux and macOS support\n## Supported Grammars\n\n| Grammar | Input | Repository |\n| --- | --- | --- |\n| Bash | `grammar-bash` | [tree-sitter/tree-sitter-bash](https://github.com/tree-sitter/tree-sitter-bash) |\n| JSON | `grammar-json` | [tree-sitter/tree-sitter-json](https://github.com/tree-sitter/tree-sitter-json) |\n| TOML | `grammar-toml` | [tree-sitter-grammars/tree-sitter-toml](https://github.com/tree-sitter-grammars/tree-sitter-toml) |\n| RBS | `grammar-rbs` | [joker1007/tree-sitter-rbs](https://github.com/joker1007/tree-sitter-rbs) |\n\n\u003e **Note**: JSONC (JSON with Comments) is supported by the main `tree-sitter-json` grammar as of v0.24.0. A separate jsonc grammar is no longer needed.\n\n## Usage\n\n### Version Reference\n\nUse one of the following version references:\n  - `@v2` - Latest stable v2.x release (recommended for production)\n  - `@v2.0.0` - Specific version\n  - `@main` - Latest development version (may be unstable)\n### Basic Usage\n\nInstall tree-sitter library and selected grammars:\n\n``` yaml\nsteps:\n  - uses: actions/checkout@v4\n\n  - name: Install tree-sitter with grammars\n    uses: kettle-rb/ts-grammar-action@v2\n    with:\n      grammar-bash: true\n      grammar-toml: true\n```\n\n### All Options\n\n``` yaml\nsteps:\n  - uses: actions/checkout@v4\n\n  - name: Install tree-sitter with grammars\n    uses: kettle-rb/ts-grammar-action@v2\n    with:\n      # Tree-sitter library/CLI options\n      install-cli: false          # Install tree-sitter CLI (default: false)\n      install-lib: true           # Install libtree-sitter (default: true)\n      tree-sitter-ref: latest     # tree-sitter version (default: latest)\n\n      # Rust toolchain (for tree_stump gem or CLI build)\n      setup-rust: false           # Install Rust toolchain (default: false)\n      rust-toolchain: stable      # Rust version (default: stable)\n\n      # Java/jtreesitter (for JRuby Java backend)\n      # Note: setup-jtreesitter: true automatically installs Java JDK\n      setup-java: false           # Install Java JDK only (default: false)\n      java-version: \"23\"          # Java version (default: 23)\n      java-distribution: temurin  # Java distribution (default: temurin)\n      setup-jtreesitter: false    # Download jtreesitter JAR + install Java (default: false)\n      jtreesitter-version: \"0.24.0\"  # jtreesitter version (default: 0.24.0)\n      jtreesitter-install-dir: /usr/local/share/java  # JAR install directory\n\n      # tsdl options\n      tsdl-version: v2.0.0       # tsdl version (default: v2.0.0)\n\n      # Grammar selections (all default to false)\n      grammar-bash: false\n      grammar-bash-ref: v0.25.1      # Pin grammar version\n      grammar-json: false\n      grammar-json-ref: v0.24.8\n      grammar-toml: false\n      grammar-toml-ref: v0.7.0\n      grammar-rbs: false\n      grammar-rbs-ref: v0.2.2\n\n      # Installation prefix (default: /usr/local)\n      grammar-install-prefix: /usr/local\n```\n\n### Using with tree\\_stump (Rust Backend)\n\nIf you're using the [tree\\_stump](https://github.com/joker1007/tree_stump) gem for tree\\_haver's Rust backend on MRI Ruby, you need Rust installed to compile it:\n\n``` yaml\nsteps:\n  - uses: actions/checkout@v4\n\n  - name: Install tree-sitter with Rust and grammars\n    uses: kettle-rb/ts-grammar-action@v2\n    with:\n      setup-rust: true            # Install Rust toolchain\n      rust-toolchain: stable      # Use stable Rust\n      grammar-toml: true\n      grammar-bash: true\n\n  - name: Setup Ruby\n    uses: ruby/setup-ruby@v1\n    with:\n      ruby-version: '3.3'\n      bundler-cache: true\n\n  - name: Run tests\n    run: bundle exec rspec\n```\n\n### Using with jtreesitter (JRuby Java Backend)\n\nFor JRuby workflows using tree\\_haver's Java backend with [jtreesitter](https://github.com/tree-sitter/java-tree-sitter):\n\n\u003e **Note**: Setting `setup-jtreesitter: true` automatically installs Java JDK - you don't need to also set `setup-java: true`.\n\n``` yaml\nsteps:\n  - uses: actions/checkout@v4\n\n  - name: Install tree-sitter with Java and grammars\n    uses: kettle-rb/ts-grammar-action@v2\n    with:\n      setup-jtreesitter: true     # Automatically installs Java JDK + jtreesitter JAR\n      java-version: \"23\"          # Java version to install\n      grammar-toml: true\n      grammar-bash: true\n\n  - name: Setup JRuby\n    uses: ruby/setup-ruby@v1\n    with:\n      ruby-version: jruby\n      bundler-cache: true\n\n  - name: Run tests\n    run: bundle exec rspec\n    env:\n      # These are automatically set by the action:\n      # TREE_SITTER_JAVA_JARS_DIR: /usr/local/share/java\n      # CLASSPATH: /usr/local/share/java/jtreesitter-0.24.0.jar\n```\n\n### Using with Ruby Gems\n\nThis action is designed to work with the [tree\\_haver](https://github.com/kettle-rb/tree_haver) gem and the `*-merge` gem family for AST-based file merging:\n\n``` yaml\nsteps:\n  - uses: actions/checkout@v4\n\n  - name: Install tree-sitter and grammars\n    uses: kettle-rb/ts-grammar-action@v2\n    with:\n      grammar-toml: true\n      grammar-bash: true\n      grammar-json: true\n\n  - name: Setup Ruby\n    uses: ruby/setup-ruby@v1\n    with:\n      ruby-version: '3.3'\n      bundler-cache: true\n\n  - name: Run tests\n    run: bundle exec rspec\n    env:\n      # These are automatically set by the action:\n      # TREE_SITTER_TOML_PATH: /usr/local/lib/libtree-sitter-toml.so\n      # TREE_SITTER_BASH_PATH: /usr/local/lib/libtree-sitter-bash.so\n      # TREE_SITTER_JSON_PATH: /usr/local/lib/libtree-sitter-json.so\n```\n\n## Outputs\n\n| Output | Description |\n| --- | --- |\n| `grammars-installed` | Comma-separated list of installed grammar names |\n| `lib-path` | Path to installed grammar libraries |\n| `tsdl-version` | Installed tsdl version |\n| `rust-installed` | Whether Rust toolchain was installed (`true`/`false`) |\n| `java-installed` | Whether Java JDK was installed (`true`/`false`) |\n| `jtreesitter-installed` | Whether jtreesitter JAR was installed (`true`/`false`) |\n| `jtreesitter-jar-path` | Path to jtreesitter JAR file |\n\n### Example: Using Outputs\n\n``` yaml\nsteps:\n  - uses: actions/checkout@v4\n\n  - name: Install grammars\n    id: grammars\n    uses: kettle-rb/ts-grammar-action@v2\n    with:\n      grammar-toml: true\n      grammar-json: true\n\n  - name: Show installed grammars\n    run: |\n      echo \"Installed: ${{ steps.grammars.outputs.grammars-installed }}\"\n      echo \"Library path: ${{ steps.grammars.outputs.lib-path }}\"\n      ls -la ${{ steps.grammars.outputs.lib-path }}/libtree-sitter-*.so\n```\n\n## Environment Variables\n\nThe action automatically sets environment variables for each installed component:\n\n### Grammar Environment Variables\n\n| Variable | Example Value |\n| --- | --- |\n| `TREE_SITTER_BASH_PATH` | `/usr/local/lib/libtree-sitter-bash.so` |\n| `TREE_SITTER_JSON_PATH` | `/usr/local/lib/libtree-sitter-json.so` |\n| `TREE_SITTER_TOML_PATH` | `/usr/local/lib/libtree-sitter-toml.so` |\n| `TREE_SITTER_RBS_PATH` | `/usr/local/lib/libtree-sitter-rbs.so` |\n| `LD_LIBRARY_PATH` | Updated to include grammar library directory |\n\n### Java/jtreesitter Environment Variables\n\n| Variable | Example Value |\n| --- | --- |\n| `TREE_SITTER_JAVA_JARS_DIR` | `/usr/local/share/java` |\n| `CLASSPATH` | `/usr/local/share/java/jtreesitter-0.24.0.jar` |\n| `JAVA_HOME` | Set by `actions/setup-java` |\n\nThese environment variables are used by [tree\\_haver](https://github.com/kettle-rb/tree_haver) to locate grammar libraries and Java JARs.\n\n## Requirements\n\n  - **Linux or macOS** - Windows support may be added in the future\n  - **sudo** - For installing to system directories\n## How It Works\n\n1.  **Java Setup** (optional): Installs Java JDK via `actions/setup-java` if `setup-java` or `setup-jtreesitter` is enabled\n2.  **jtreesitter Setup** (optional): Downloads jtreesitter JAR from Maven Central for JRuby's Java backend\n3.  **Rust Setup** (optional): Installs Rust toolchain via `dtolnay/rust-toolchain` if `setup-rust` is enabled\n4.  **Tree-sitter Setup**: Uses the official `tree-sitter/setup-action` to install the tree-sitter library and optionally the CLI\n5.  **tsdl Install**: Downloads the [tsdl](https://github.com/stackmystack/tsdl) binary from GitHub releases\n6.  **Grammar Build**: Generates a `parsers.toml` config from inputs and runs `tsdl build` to compile grammars\n7.  **Configuration**: Sets up environment variables for grammar and JAR discovery\n## Comparison with tree-sitter/setup-action\n\n| Feature | tree-sitter/setup-action | ts-grammar-action |\n| --- | --- | --- |\n| Library installation | ✅ | ✅ (via delegation) |\n| CLI installation | ✅ | ✅ (via delegation) |\n| Caching | ✅ | ✅ (via delegation) |\n| Grammar installation | ❌ | ✅ (via [tsdl](https://github.com/stackmystack/tsdl)) |\n| Pinned grammar versions | ❌ | ✅ |\n| Rust toolchain | ✅ (for CLI only) | ✅ (for tree\\_stump gem) |\n| Java JDK | ❌ | ✅ |\n| jtreesitter JAR | ❌ | ✅ |\n| Environment variables | Library paths only | Library + grammar + Java |\n\n## Related Projects\n\nThis project is part of the [kettle-rb](https://github.com/kettle-rb) family of tools.\nThis action specifically facilitates testing many of the gems in the merge gem family in GitHub Actions.\n\n### The `*-merge` Gem Family\n\nThe `*-merge` gem family provides intelligent, AST-based merging for various file formats. At the foundation is [tree_haver][tree_haver], which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.\n\n| Gem                                      | Language\u003cbr\u003e/ Format | Parser Backend(s)                                                                                   | Description                                                                      |\n|------------------------------------------|----------------------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|\n| [tree_haver][tree_haver]                 | Multi                | MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus                                  | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |\n| [ast-merge][ast-merge]                   | Text                 | internal                                                                                            | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems   |\n| [bash-merge][bash-merge]                 | Bash                 | [tree-sitter-bash][ts-bash] (via tree_haver)                                                        | Smart merge for Bash scripts                                                     |\n| [commonmarker-merge][commonmarker-merge] | Markdown             | [Commonmarker][commonmarker] (via tree_haver)                                                       | Smart merge for Markdown (CommonMark via comrak Rust)                            |\n| [dotenv-merge][dotenv-merge]             | Dotenv               | internal                                                                                            | Smart merge for `.env` files                                                     |\n| [json-merge][json-merge]                 | JSON                 | [tree-sitter-json][ts-json] (via tree_haver)                                                        | Smart merge for JSON files                                                       |\n| [jsonc-merge][jsonc-merge]               | JSONC                | [tree-sitter-json][ts-json] (via tree_haver)                                                        | Smart merge for JSON with Comments                                               |\n| [markdown-merge][markdown-merge]         | Markdown             | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver)                                    | **Foundation**: Shared base for Markdown mergers with inner code block merging   |\n| [markly-merge][markly-merge]             | Markdown             | [Markly][markly] (via tree_haver)                                                                   | Smart merge for Markdown (CommonMark via cmark-gfm C)                            |\n| [prism-merge][prism-merge]               | Ruby                 | [Prism][prism] (`prism` std lib gem)                                                                | Smart merge for Ruby source files                                                |\n| [psych-merge][psych-merge]               | YAML                 | [Psych][psych] (`psych` std lib gem)                                                                | Smart merge for YAML files                                                       |\n| [rbs-merge][rbs-merge]                   | RBS                  | [tree-sitter-rbs][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem)                          | Smart merge for Ruby type signatures                                             |\n| [toml-merge][toml-merge]                 | TOML                 | [Citrus + toml-rb][toml-rb] (default, via tree_haver), [tree-sitter-toml][ts-toml] (via tree_haver) | Smart merge for TOML files                                                       |\n\n#### Backend Platform Compatibility\n\ntree_haver supports multiple parsing backends, but not all backends work on all Ruby platforms:\n\n| Platform 👉️\u003cbr\u003e TreeHaver Backend 👇️         | MRI | JRuby | TruffleRuby | Notes                                               |\n|------------------------------------------------|:---:|:-----:|:-----------:|-----------------------------------------------------|\n| **MRI** ([ruby_tree_sitter][ruby_tree_sitter]) |  ✅  |   ❌   |      ❌      | C extension, MRI only                               |\n| **Rust** ([tree_stump][tree_stump])            |  ✅  |   ❌   |      ❌      | Rust extension via magnus/rb-sys, MRI only          |\n| **FFI**                                        |  ✅  |   ✅   |      ❌      | TruffleRuby's FFI doesn't support `STRUCT_BY_VALUE` |\n| **Java** ([jtreesitter][jtreesitter])          |  ❌  |   ✅   |      ❌      | JRuby only, requires grammar JARs                   |\n| **Prism**                                      |  ✅  |   ✅   |      ✅      | Ruby parsing, stdlib in Ruby 3.4+                   |\n| **Psych**                                      |  ✅  |   ✅   |      ✅      | YAML parsing, stdlib                                |\n| **Citrus**                                     |  ✅  |   ✅   |      ✅      | Pure Ruby, no native dependencies                   |\n| **Commonmarker**                               |  ✅  |   ❌   |      ❓      | Rust extension for Markdown                         |\n| **Markly**                                     |  ✅  |   ❌   |      ❓      | C extension for Markdown                            |\n\n**Legend**: ✅ = Works, ❌ = Does not work, ❓ = Untested\n\n**Why some backends don't work on certain platforms**:\n\n- **JRuby**: Runs on the JVM; cannot load native C/Rust extensions (`.so` files)\n- **TruffleRuby**: Has C API emulation via Sulong/LLVM, but it doesn't expose all MRI internals that native extensions require (e.g., `RBasic.flags`, `rb_gc_writebarrier`)\n- **FFI on TruffleRuby**: TruffleRuby's FFI implementation doesn't support returning structs by value, which tree-sitter's C API requires\n\n**Example implementations** for the gem templating use case:\n\n| Gem                      | Purpose         | Description                                   |\n|--------------------------|-----------------|-----------------------------------------------|\n| [kettle-dev][kettle-dev] | Gem Development | Gem templating tool using `*-merge` gems      |\n| [kettle-jem][kettle-jem] | Gem Templating  | Gem template library with smart merge support |\n\n[tree_haver]: https://github.com/kettle-rb/tree_haver\n[ast-merge]: https://github.com/kettle-rb/ast-merge\n[prism-merge]: https://github.com/kettle-rb/prism-merge\n[psych-merge]: https://github.com/kettle-rb/psych-merge\n[json-merge]: https://github.com/kettle-rb/json-merge\n[jsonc-merge]: https://github.com/kettle-rb/jsonc-merge\n[bash-merge]: https://github.com/kettle-rb/bash-merge\n[rbs-merge]: https://github.com/kettle-rb/rbs-merge\n[dotenv-merge]: https://github.com/kettle-rb/dotenv-merge\n[toml-merge]: https://github.com/kettle-rb/toml-merge\n[markdown-merge]: https://github.com/kettle-rb/markdown-merge\n[markly-merge]: https://github.com/kettle-rb/markly-merge\n[commonmarker-merge]: https://github.com/kettle-rb/commonmarker-merge\n[kettle-dev]: https://github.com/kettle-rb/kettle-dev\n[kettle-jem]: https://github.com/kettle-rb/kettle-jem\n[prism]: https://github.com/ruby/prism\n[psych]: https://github.com/ruby/psych\n[ts-json]: https://github.com/tree-sitter/tree-sitter-json\n[ts-bash]: https://github.com/tree-sitter/tree-sitter-bash\n[ts-rbs]: https://github.com/joker1007/tree-sitter-rbs\n[ts-toml]: https://github.com/tree-sitter-grammars/tree-sitter-toml\n[dotenv]: https://github.com/bkeepers/dotenv\n[rbs]: https://github.com/ruby/rbs\n[toml-rb]: https://github.com/emancu/toml-rb\n[markly]: https://github.com/ioquatix/markly\n[commonmarker]: https://github.com/gjtorikian/commonmarker\n[ruby_tree_sitter]: https://github.com/Faveod/ruby-tree-sitter\n[tree_stump]: https://github.com/joker1007/tree_stump\n[jtreesitter]: https://central.sonatype.com/artifact/io.github.tree-sitter/jtreesitter\n\n## 🦷 FLOSS Funding\n\nWhile kettle-rb tools are free software and will always be, the project would benefit immensely from some funding.\nRaising a monthly budget of... \"dollars\" would make the project more sustainable.\n\nWe welcome both individual and corporate sponsors\\! We also offer a\nwide array of funding channels to account for your preferences\n(although currently [Open Collective](https://opencollective.com/kettle-rb) is our preferred funding platform).\n\n**If you're working in a company that's making significant use of kettle-rb tools we'd\nappreciate it if you suggest to your company to become a kettle-rb sponsor.**\n\nYou can support the development of kettle-rb tools via\n[GitHub Sponsors](https://github.com/sponsors/pboling),\n[Liberapay](https://liberapay.com/pboling/donate),\n[PayPal](https://www.paypal.com/paypalme/peterboling),\n[Open Collective](https://opencollective.com/kettle-rb)\nand [Tidelift](https://tidelift.com/subscription/pkg/rubygems-ts-grammar-action?utm_source=rubygems-ts-grammar-action\u0026utm_medium=referral\u0026utm_campaign=readme).\n\n| 📍 NOTE |\n| --- |\n| If doing a sponsorship in the form of donation is problematic for your company \u003cbr/\u003e from an accounting standpoint, we'd recommend the use of Tidelift, \u003cbr/\u003e where you can get a support-like subscription instead. |\n\n### Open Collective for Individuals\n\nSupport us with a monthly donation and help us continue our activities. \\[[Become a backer](https://opencollective.com/kettle-rb#backer)\\]\n\nNOTE: [kettle-readme-backers](https://github.com/kettle-rb/ts-grammar-action/blob/main/exe/kettle-readme-backers) updates this list every day, automatically.\n\n\u003c!-- OPENCOLLECTIVE-INDIVIDUALS:START --\u003e\nNo backers yet. Be the first\\!\n\u003c!-- OPENCOLLECTIVE-INDIVIDUALS:END --\u003e\n\n### Open Collective for Organizations\n\nBecome a sponsor and get your logo on our README on GitHub with a link to your site. \\[[Become a sponsor](https://opencollective.com/kettle-rb#sponsor)\\]\n\nNOTE: [kettle-readme-backers](https://github.com/kettle-rb/ts-grammar-action/blob/main/exe/kettle-readme-backers) updates this list every day, automatically.\n\n\u003c!-- OPENCOLLECTIVE-ORGANIZATIONS:START --\u003e\nNo sponsors yet. Be the first\\!\n\u003c!-- OPENCOLLECTIVE-ORGANIZATIONS:END --\u003e\n\n[kettle-readme-backers]: https://github.com/kettle-rb/ts-grammar-action/blob/main/exe/kettle-readme-backers\n\n## 🔐 Security\n\nSee [SECURITY.md](SECURITY.md).\n\n## 🤝 Contributing\n\nIf you need some ideas of where to help, see [issues](https://github.com/kettle-rb/ts-grammar-action/issues), or [PRs](https://github.com/kettle-rb/ts-grammar-action/pulls),\nor use the action and think about how it could be better.\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for more detailed instructions.\n\nWe [![Keep A Changelog](https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat)](https://keepachangelog.com/en/1.0.0/) so if you make changes, remember to update it.\n\n### 🚀 Release Instructions\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n### 🪇 Code of Conduct\n\nEveryone interacting with this project's codebases, issue trackers,\nchat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1](https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg)](CODE_OF_CONDUCT.md).\n\n## 🌈 Contributors\n\n[![Contributors](https://contrib.rocks/image?repo=kettle-rb/ts-grammar-action)](https://github.com/kettle-rb/ts-grammar-action/graphs/contributors)\n\nMade with [contributors-img](https://contrib.rocks).\n\nAlso see GitLab Contributors: \u003chttps://gitlab.com/kettle-rb/ts-grammar-action/-/graphs/main\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e⭐️ Star History\u003c/summary\u003e\n\n\u003ca href=\"https://star-history.com/#kettle-rb/ts-grammar-action\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=kettle-rb/ts-grammar-action\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=kettle-rb/ts-grammar-action\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=kettle-rb/ts-grammar-action\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n\u003c/details\u003e\n\n## 📄 License\n\nThe gem is available as open source under the terms of\nthe [MIT License](LICENSE.txt) [![License: MIT](https://img.shields.io/badge/License-MIT-259D6C.svg)](https://opensource.org/licenses/MIT).\nSee [LICENSE.txt](LICENSE.txt) for the official [Copyright Notice](https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year).\n\n### © Copyright\n\n\u003cul\u003e\n    \u003cli\u003e\n        Copyright (c) 2025 Peter H. Boling, of\n        \u003ca href=\"https://discord.gg/3qme4XHNKN\"\u003e\n            Galtzo.com\n            \u003cpicture\u003e\n              \u003cimg src=\"https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px-blank.svg\" alt=\"Galtzo.com Logo (Wordless) by Aboling0, CC BY-SA 4.0\" width=\"24\"\u003e\n            \u003c/picture\u003e\n        \u003c/a\u003e, and ts-grammar-action contributors.\n    \u003c/li\u003e\n\u003c/ul\u003e\n\n## 🤑 A request for help\n\nMaintainers have teeth and need to pay their dentists.\nAfter getting laid off in an RIF in March, and encountering difficulty finding a new one,\nI began spending most of my time building open source tools.\nI'm hoping to be able to pay for my kids' health insurance this month,\nso if you value the work I am doing, I need your support.\nPlease consider sponsoring me or the project.\n\nTo join the community or get help 👇️ Join the Discord.\n\n[![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge\u0026logo=discord)](https://discord.gg/3qme4XHNKN)\n\nTo say \"thanks\\!\" ☝️ Join the Discord or 👇️ send money.\n\n[![Sponsor kettle-rb/ts-grammar-action on Open Source Collective](https://img.shields.io/opencollective/all/kettle-rb?style=for-the-badge)](https://opencollective.com/kettle-rb) 💌 [![Sponsor me on GitHub Sponsors](https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge\u0026logo=github)](https://github.com/sponsors/pboling) 💌 [![Sponsor me on Liberapay](https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge\u0026logo=liberapay\u0026color=a51611)](https://liberapay.com/pboling/donate) 💌 [![Donate on PayPal](https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge\u0026logo=paypal\u0026color=0A0A0A)](https://www.paypal.com/paypalme/peterboling)\n\n### Please give the project a star ⭐ ♥.\n\nThanks for RTFM. ☺️\n\n[⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay\u0026color=a51611\u0026style=flat\n[⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge\u0026logo=liberapay\u0026color=a51611\n[⛳liberapay]: https://liberapay.com/pboling/donate\n[🖇osc-all-img]: https://img.shields.io/opencollective/all/kettle-rb\n[🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/kettle-rb\n[🖇osc-backers-img]: https://img.shields.io/opencollective/backers/kettle-rb\n[🖇osc-backers]: https://opencollective.com/kettle-rb#backer\n[🖇osc-backers-i]: https://opencollective.com/kettle-rb/backers/badge.svg?style=flat\n[🖇osc-sponsors]: https://opencollective.com/kettle-rb#sponsor\n[🖇osc-sponsors-i]: https://opencollective.com/kettle-rb/sponsors/badge.svg?style=flat\n[🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/kettle-rb?style=for-the-badge\n[🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/kettle-rb?style=for-the-badge\n[🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/kettle-rb?style=for-the-badge\n[🖇osc]: https://opencollective.com/kettle-rb\n[🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social\u0026logo=github\n[🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge\u0026logo=github\n[🖇sponsor]: https://github.com/sponsors/pboling\n[🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat\n[🖇polar]: https://polar.sh/pboling\n[🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat\n[🖇kofi]: https://ko-fi.com/O5O86SNP4\n[🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat\n[🖇patreon]: https://patreon.com/galtzo\n[🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat\n[🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff\n[🖇buyme]: https://www.buymeacoffee.com/pboling\n[🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat\u0026logo=paypal\n[🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge\u0026logo=paypal\u0026color=0A0A0A\n[🖇paypal]: https://www.paypal.com/paypalme/peterboling\n[🖇floss-funding.dev]: https://floss-funding.dev\n[🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding\n[✉️discord-invite]: https://discord.gg/3qme4XHNKN\n[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge\u0026logo=discord\n[✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge\u0026logo=dailydotdev\u0026logoColor=white\n[✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends\n\n[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780\n[⛳️tag-img]: https://img.shields.io/github/tag/kettle-rb/ts-grammar-action.svg\n[⛳️tag]: http://github.com/kettle-rb/ts-grammar-action/releases\n[🚂maint-blog]: http://www.railsbling.com/tags/ts-grammar-action\n[🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge\u0026logo=rubyonrails\u0026logoColor=orange\n[🚂maint-contact]: http://www.railsbling.com/contact\n[🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat\u0026logo=rubyonrails\u0026logoColor=red\n[💖🖇linkedin]: http://www.linkedin.com/in/peterboling\n[💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat\u0026logo=newjapanprowrestling\n[💖✌️wellfound]: https://wellfound.com/u/peter-boling\n[💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat\u0026logo=wellfound\n[💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling\n[💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat\u0026logo=crunchbase\n[💖🐘ruby-mast]: https://ruby.social/@galtzo\n[💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social\u0026style=flat\u0026logo=mastodon\u0026label=Ruby%20@galtzo\n[💖🦋bluesky]: https://bsky.app/profile/galtzo.com\n[💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat\u0026logo=bluesky\u0026logoColor=white\n[💖🌳linktree]: https://linktr.ee/galtzo\n[💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat\u0026logo=linktree\n[💖💁🏼‍♂️devto]: https://dev.to/galtzo\n[💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat\u0026logo=devdotto\u0026logoColor=white\n[💖💁🏼‍♂️aboutme]: https://about.me/peter.boling\n[💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat\u0026logo=aboutme\u0026logoColor=white\n[💖🧊berg]: https://codeberg.org/pboling\n[💖🐙hub]: https://github.org/pboling\n[💖🛖hut]: https://sr.ht/~galtzo/\n[💖🧪lab]: https://gitlab.com/pboling\n[💁🏼‍♂️peterboling]: http://www.peterboling.com\n[🚂railsbling]: http://www.railsbling.com\n[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge\u0026logo=Github\u0026logoColor=green\n[📜src-gh]: https://github.com/kettle-rb/ts-grammar-action\n[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜gh-wiki]: https://github.com/kettle-rb/ts-grammar-action/wiki\n[📜gh-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[👽oss-help]: https://www.codetriage.com/kettle-rb/ts-grammar-action\n[👽oss-helpi]: https://www.codetriage.com/kettle-rb/ts-grammar-action/badges/users.svg\n[🤝gh-issues]: https://github.com/kettle-rb/ts-grammar-action/issues\n[🤝gh-pulls]: https://github.com/kettle-rb/ts-grammar-action/pulls\n[🤝contributing]: CONTRIBUTING.md\n[🖐contrib-rocks]: https://contrib.rocks\n[🖐contributors]: https://github.com/kettle-rb/ts-grammar-action/graphs/contributors\n[🖐contributors-img]: https://contrib.rocks/image?repo=kettle-rb/ts-grammar-action\n[🪇conduct]: CODE_OF_CONDUCT.md\n[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg\n[📌gitmoji]: https://gitmoji.dev\n[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square\n[🔐security]: SECURITY.md\n[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat\n[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year\n[📄license]: LICENSE.txt\n[📄license-ref]: https://opensource.org/licenses/MIT\n[📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg\n[📄license-compat]: https://dev.to/galtzo/how-to-check-license-compatibility-41h0\n[📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat\u0026logo=Apache\n[📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm\n[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat\n\n[dotenv]: https://github.com/bkeepers/dotenv\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkettle-dev%2Fts-grammar-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkettle-dev%2Fts-grammar-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkettle-dev%2Fts-grammar-action/lists"}