{"id":50195245,"url":"https://github.com/structuredmerge/structuredmerge-ruby","last_synced_at":"2026-06-11T09:00:59.363Z","repository":{"id":327473381,"uuid":"1108676640","full_name":"structuredmerge/structuredmerge-ruby","owner":"structuredmerge","description":"☯️ Ruby implementation of the StructuredMerge contract","archived":false,"fork":false,"pushed_at":"2026-06-05T04:46:23.000Z","size":9185,"stargazers_count":18,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-05T07:23:24.740Z","etag":null,"topics":["ast","merge","prism","ruby","rubygem","template"],"latest_commit_sha":null,"homepage":"https://structuredmerge.org","language":"HTML","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/structuredmerge.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","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},"funding":{"buy_me_a_coffee":"pboling","community_bridge":null,"github":["pboling"],"issuehunt":"pboling","ko_fi":"pboling","liberapay":"pboling","open_collective":"","patreon":"galtzo","polar":"pboling","thanks_dev":"u/gh/pboling","tidelift":"rubygems/structuredmerge-ruby"}},"created_at":"2025-12-02T19:08:56.000Z","updated_at":"2026-06-05T04:46:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/structuredmerge/structuredmerge-ruby","commit_stats":null,"previous_names":["kettle-rb/prism-merge","structuredmerge/structuredmerge-ruby"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/structuredmerge/structuredmerge-ruby","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/structuredmerge%2Fstructuredmerge-ruby","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/structuredmerge%2Fstructuredmerge-ruby/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/structuredmerge%2Fstructuredmerge-ruby/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/structuredmerge%2Fstructuredmerge-ruby/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/structuredmerge","download_url":"https://codeload.github.com/structuredmerge/structuredmerge-ruby/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/structuredmerge%2Fstructuredmerge-ruby/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34067353,"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-08T02:00:07.615Z","response_time":111,"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":["ast","merge","prism","ruby","rubygem","template"],"created_at":"2026-05-25T17:00:40.014Z","updated_at":"2026-06-11T09:00:59.357Z","avatar_url":"https://github.com/structuredmerge.png","language":"HTML","funding_links":["https://buymeacoffee.com/pboling","https://github.com/sponsors/pboling","https://issuehunt.io/r/pboling","https://ko-fi.com/pboling","https://liberapay.com/pboling","https://patreon.com/galtzo","https://polar.sh/pboling","https://thanks.dev/u/gh/pboling","https://tidelift.com/funding/github/rubygems/structuredmerge-ruby"],"categories":["HTML"],"sub_categories":[],"readme":"[![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![structuredmerge Logo by Aboling0, CC BY-SA 4.0][🖼️structuredmerge-i]][🖼️structuredmerge]\n\n[🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg\n[🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN\n[🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg\n[🖼️ruby-lang]: https://www.ruby-lang.org/\n[🖼️structuredmerge-i]: https://logos.galtzo.com/assets/images/structuredmerge/avatar-192px.svg\n[🖼️structuredmerge]: https://github.com/structuredmerge\n\n# StructuredMerge Ruby\n\nStructuredMerge Ruby provides Ruby gems for building merge-aware tools that need\nportable structured-merge contracts, fixture-backed behavior, and Ruby-native\nintegration points.\n\nThe monorepo includes the core AST/review contracts, parser substrate support,\nformat-specific merge gems, binary/ZIP planning helpers, provider adapters, and\na Ruby packaging recipe gem.\n\nProject links:\n\n- Website: \u003chttps://structuredmerge.org\u003e\n- Implementations: \u003chttps://structuredmerge.org/implementations.html\u003e\n- Specification: \u003chttps://github.com/structuredmerge/structuredmerge-spec\u003e\n- Shared fixtures: \u003chttps://github.com/structuredmerge/structuredmerge-fixtures\u003e\n\n## Package Family\n\nStructuredMerge Ruby is a layered gem family. The lower layers provide parser,\nrange, AST, merge, and template contracts; format gems apply those contracts to\nspecific languages and data formats; provider gems bind a format family to a\nparser or serializer; workflow gems package the behavior for Git drivers,\nrelease automation, and monorepo maintenance.\n\nPackage README files keep this section short and link here. This root guide is\nthe implementation inventory for Ruby users who need to choose gems, understand\nbackend coverage, or wire a focused backend into a test suite.\n\nThe family is intentionally layered:\n\n- [`tree_haver`][ruby-tree-haver] provides parser portability, backend discovery, byte ranges, and runtime capability reporting.\n- [`ast-merge`][ruby-ast-merge] provides the cross-format merge substrate: shared base classes, layout/comment ownership, diagnostics, review state, and execution reports.\n- Family gems such as [`markdown-merge`][ruby-markdown-merge], [`yaml-merge`][ruby-yaml-merge], and [`toml-merge`][ruby-toml-merge] own parser-neutral behavior for one format family.\n- Provider gems such as [`markly-merge`][ruby-markly-merge], [`psych-merge`][ruby-psych-merge], and [`citrus-toml-merge`][ruby-citrus-toml-merge] register backend-specific parser/emitter behavior.\n- Workflow gems such as [`ast-merge-git`][ruby-ast-merge-git], [`smorg-rb`][ruby-smorg-rb], and [`kettle-jem`][ruby-kettle-jem] package the family for Git, release, and templating workflows.\n\n### Core and Workflow Gems\n\n| Gem | Layer | What it provides |\n| --- | --- | --- |\n| [`tree_haver`][ruby-tree-haver] | Parser substrate | Parser backend registry, byte ranges, node wrappers, source locations, binary tree contracts, and backend selection helpers. |\n| [`ast-merge`][ruby-ast-merge] | Merge substrate | AST merge contracts, diagnostics, structural edit plans, review/replay vocabulary, nested merge orchestration, backend provider registration, and shared spec helpers. |\n| [`ast-template`][ruby-ast-template] | Template substrate | Template/session transport objects used by recipe tooling and language-specific templating layers. |\n| [`ast-merge-git`][ruby-ast-merge-git] | Git integration | Merge-driver, diff-driver, conflict inspection, language registry, and command plumbing for `smorg-rb`. |\n| [`smorg-rb`][ruby-smorg-rb] | Command package | Ruby implementation command packaging and executable entry points. |\n| [`kettle-jem`][ruby-kettle-jem] | Recipe tooling | Template recipes, monorepo root materialization, gem maintenance helpers, and StructuredMerge Ruby release support. |\n\n### Transformation Gems\n\n| Gem | Layer | What it provides |\n| --- | --- | --- |\n| [`ast-crispr`][ruby-ast-crispr] | Generic AST edits | Structured document surgery recipes for generated blocks and template-owned regions. |\n| [`ast-crispr-ruby-prism`][ruby-ast-crispr-ruby-prism] | Ruby AST edits | [Prism][prism]-backed Ruby source edits, including require insertion and template-managed Ruby regions. |\n| [`ast-crispr-markdown-markly`][ruby-ast-crispr-markdown-markly] | Markdown AST edits | [Markly][markly]-backed Markdown block replacement and README recipe support. |\n\n### Format Gems\n\n| Gem | Family | What it provides |\n| --- | --- | --- |\n| [`plain-merge`][ruby-plain-merge] | Text | Plain-text fallback contracts and conflict-preserving merge behavior. |\n| [`json-merge`][ruby-json-merge] | JSON and JSONC | Object/array-aware JSON merge behavior using the shared StructuredMerge merge substrate and [tree-sitter JSON][ts-json] grammar coverage where the selected backend supplies it. |\n| [`yaml-merge`][ruby-yaml-merge] | YAML | YAML-family merge contracts, shared provider tags, and provider-neutral behavior. |\n| [`toml-merge`][ruby-toml-merge] | TOML | TOML-family merge contracts and provider-neutral behavior. |\n| [`dotenv-merge`][ruby-dotenv-merge] | dotenv | Environment-file merge behavior for key/value configuration files. |\n| [`markdown-merge`][ruby-markdown-merge] | Markdown | Markdown-family merge contracts, heading/table/list matching, link-reference handling, fenced-code flow, and provider-neutral behavior. |\n| [`ruby-merge`][ruby-ruby-merge] | Ruby source | Ruby source merge contracts and parser-backed source-language behavior. |\n| [`rbs-merge`][ruby-rbs-merge] | RBS | Ruby signature merge behavior, declaration matching, and template-owned signature updates using [RBS][rbs] and tree-sitter RBS grammar coverage where available. |\n| [`bash-merge`][ruby-bash-merge] | Bash source | Shell source merge contracts and parser-backed shell-language behavior using [tree-sitter Bash][ts-bash] where available. |\n| [`go-merge`][ruby-go-merge] | Go source | Go source merge contracts for the cross-language StructuredMerge family. |\n| [`rust-merge`][ruby-rust-merge] | Rust source | Rust source merge contracts for the cross-language StructuredMerge family. |\n| [`typescript-merge`][ruby-typescript-merge] | TypeScript source | TypeScript source merge contracts for the cross-language StructuredMerge family. |\n| [`binary-merge`][ruby-binary-merge] | Binary | Binary tree planning contracts, byte-range ownership, diagnostics, and [Kaitai Struct][kaitai] oriented structured binary support. |\n| [`zip-merge`][ruby-zip-merge] | Archives | ZIP archive planning helpers, archive member ownership, and archive-aware merge contracts. |\n\n### Provider Gems\n\nProvider gems register themselves with the backend tag system used by\n`ast-merge` and `tree_haver`. That registry lets a spec suite run against a\nsingle selected backend, lets a format gem ask for a capability instead of a\nhard dependency, and keeps parser-specific behavior out of provider-neutral\nmerge gems.\n\n| Gem | Provides | Runtime notes |\n| --- | --- | --- |\n| [`psych-merge`][ruby-psych-merge] | YAML provider | Uses Ruby's [Psych][psych] parser and emitter. |\n| [`citrus-toml-merge`][ruby-citrus-toml-merge] | TOML provider | Uses a [Citrus][citrus] grammar and pure-Ruby parser path, commonly paired with [`toml-rb`][toml-rb] style TOML data handling. |\n| [`parslet-toml-merge`][ruby-parslet-toml-merge] | TOML provider | Uses [Parslet][parslet] and pure-Ruby parser path, commonly paired with [`toml`][toml] style TOML data handling. |\n| [`commonmarker-merge`][ruby-commonmarker-merge] | Markdown provider | Uses [CommonMarker][commonmarker] for CommonMark-oriented Markdown parsing. |\n| [`kramdown-merge`][ruby-kramdown-merge] | Markdown provider | Uses [Kramdown][kramdown] for Ruby-native Markdown parsing. |\n| [`markly-merge`][ruby-markly-merge] | Markdown provider | Uses [Markly][markly] for cmark-gfm-backed Markdown parsing and README templating support. |\n| [`prism-merge`][ruby-prism-merge] | Ruby provider | Uses [Prism][prism] for Ruby source parsing and Ruby-specific merge refiners. |\n\n### Ruby Backend Notes\n\nRuby has the broadest backend surface in the StructuredMerge implementation set.\n`tree_haver` owns the parser backend registry and byte-range contracts;\n`ast-merge` owns provider registration and merge orchestration. The backend\ntags are capability names, not package preferences.\n\n| Backend or provider path | Used by | Notes |\n| --- | --- | --- |\n| `:TSLP` | source-family gems | Uses [tree-sitter-language-pack][tree-sitter-language-pack] parser aggregation where available. This is the preferred tree-sitter provider path for broad language coverage. |\n| `:MRI` | source-family gems | Uses [`ruby_tree_sitter`][ruby-tree-sitter]; retained as the MRI-native tree-sitter backend name. |\n| `:rust` | source-family gems | Uses [`tree_stump`][tree-stump] where that native Rust-backed parser path is selected. |\n| `:ffi` | source-family gems | Uses [FFI][ffi] bindings to [libtree-sitter][tree-sitter]; suitable where the runtime and native library support the needed ABI. |\n| `:java` | source-family gems | Uses JVM tree-sitter bindings through [java-tree-sitter][java-tree-sitter] / [jtreesitter][jtreesitter] for JRuby-oriented parser runs. |\n| [Prism][prism] | `ruby-merge`, `prism-merge`, `ast-crispr-ruby-prism` | Ruby-native parser path for Ruby source and structured Ruby source edits. |\n| [Psych][psych] | `yaml-merge`, `psych-merge` | Ruby standard YAML parser/emitter path. |\n| [RBS][rbs] | `rbs-merge` | Ruby signature parser path. |\n| [CommonMarker][commonmarker], [Markly][markly], [Kramdown][kramdown] | `markdown-merge` providers | Markdown parser families with different CommonMark/GFM/Ruby-native tradeoffs. |\n| [Citrus][citrus], [Parslet][parslet] | `toml-merge` providers | Pure-Ruby TOML parser families used as provider-specific backend paths. |\n| [Kaitai Struct][kaitai] | `binary-merge` | Schema-oriented binary parsing support for structured binary work. |\n\n#### Backend Platform Compatibility\n\n`tree_haver` supports multiple Ruby parser backends, but not every backend works\non every Ruby runtime:\n\n| TreeHaver backend | MRI | JRuby | TruffleRuby | Notes |\n| --- | :---: | :---: | :---: | --- |\n| `:TSLP` ([tree-sitter-language-pack][tree-sitter-language-pack]) | ✅ | ❓ | ❓ | Aggregated tree-sitter provider used by StructuredMerge language-family gems where available. |\n| `:MRI` ([`ruby_tree_sitter`][ruby-tree-sitter]) | ✅ | ❌ | ❌ | C extension, MRI only. |\n| `:rust` ([`tree_stump`][tree-stump]) | ✅ | ❌ | ❌ | Rust extension through Ruby native-extension tooling, MRI only. |\n| `:ffi` ([FFI][ffi] + [libtree-sitter][tree-sitter]) | ✅ | ✅ | ❌ | TruffleRuby FFI does not support the tree-sitter struct-by-value ABI. |\n| `:java` ([java-tree-sitter][java-tree-sitter] / [jtreesitter][jtreesitter]) | ❌ | ✅ | ❌ | JRuby-oriented path that requires matching grammar JARs. |\n| [Prism][prism] | ✅ | ✅ | ✅ | Ruby parser, standard library in Ruby 3.4+. |\n| [Psych][psych] | ✅ | ✅ | ✅ | YAML parser/emitter, standard library. |\n| [Citrus][citrus] | ✅ | ✅ | ✅ | Pure Ruby PEG parser. |\n| [Parslet][parslet] | ✅ | ✅ | ✅ | Pure Ruby PEG parser. |\n| [CommonMarker][commonmarker] | ✅ | ❌ | ❓ | Native Markdown parser used through `commonmarker-merge`. |\n| [Markly][markly] | ✅ | ❌ | ❓ | Native cmark-gfm parser used through `markly-merge`. |\n| [Kramdown][kramdown] | ✅ | ✅ | ✅ | Pure Ruby Markdown parser. |\n\nLegend: ✅ = works, ❌ = does not work, ❓ = not part of the supported runtime claim.\n\n[ruby-tree-haver]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/tree_haver\n[ruby-ast-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-merge\n[ruby-ast-template]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-template\n[ruby-ast-merge-git]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-merge-git\n[ruby-smorg-rb]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/smorg-rb\n[ruby-kettle-jem]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem\n[ruby-ast-crispr]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr\n[ruby-ast-crispr-ruby-prism]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-ruby-prism\n[ruby-ast-crispr-markdown-markly]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-markdown-markly\n[ruby-plain-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/plain-merge\n[ruby-json-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/json-merge\n[ruby-yaml-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/yaml-merge\n[ruby-toml-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/toml-merge\n[ruby-dotenv-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/dotenv-merge\n[ruby-markdown-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/markdown-merge\n[ruby-ruby-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ruby-merge\n[ruby-rbs-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/rbs-merge\n[ruby-bash-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/bash-merge\n[ruby-go-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/go-merge\n[ruby-rust-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/rust-merge\n[ruby-typescript-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/typescript-merge\n[ruby-binary-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/binary-merge\n[ruby-zip-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/zip-merge\n[ruby-psych-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/psych-merge\n[ruby-citrus-toml-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/citrus-toml-merge\n[ruby-parslet-toml-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/parslet-toml-merge\n[ruby-commonmarker-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/commonmarker-merge\n[ruby-kramdown-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kramdown-merge\n[ruby-markly-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/markly-merge\n[ruby-prism-merge]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/prism-merge\n[tree-sitter-language-pack]: https://github.com/kreuzberg-dev/tree-sitter-language-pack\n[tree-sitter]: https://tree-sitter.github.io/tree-sitter/\n[ruby-tree-sitter]: https://github.com/Faveod/ruby-tree-sitter\n[tree-stump]: https://github.com/joker1007/tree_stump\n[ffi]: https://github.com/ffi/ffi\n[java-tree-sitter]: https://github.com/tree-sitter/java-tree-sitter\n[jtreesitter]: https://central.sonatype.com/artifact/io.github.tree-sitter/jtreesitter\n[prism]: https://github.com/ruby/prism\n[psych]: https://github.com/ruby/psych\n[rbs]: https://github.com/ruby/rbs\n[commonmarker]: https://github.com/gjtorikian/commonmarker\n[markly]: https://github.com/ioquatix/markly\n[kramdown]: https://github.com/gettalong/kramdown\n[citrus]: https://github.com/mjackson/citrus\n[parslet]: https://github.com/kschiess/parslet\n[toml-rb]: https://github.com/emancu/toml-rb\n[toml]: https://github.com/jm/toml\n[kaitai]: https://kaitai.io/\n[ts-json]: https://github.com/tree-sitter/tree-sitter-json\n[ts-bash]: https://github.com/tree-sitter/tree-sitter-bash\n\n## Install\n\nInstall the gems your tool needs:\n\n```sh\nbundle add ast-merge json-merge\n```\n\n## Command\n\nThe Ruby implementation ships the implementation-specific `smorg-rb` command.\nUse that name in git configuration unless a package manager or local install has\nprovided a `smorg` symlink.\n\nPackage-manager formulas may expose the selected implementation as `smorg`.\nFor a local user-created symlink:\n\n```sh\nln -s \"$(command -v smorg-rb)\" ~/.local/bin/smorg\n```\n\n```sh\ngit config merge.smorg-rb.driver 'smorg-rb merge-driver %O %A %B %P'\ngit config diff.smorg-rb.command 'smorg-rb diff-driver'\nsmorg-rb conflicts diff path/to/file-with-conflicts.go\nsmorg-rb languages --gitattributes\n```\n\n`merge-driver` updates Git's `%A` file by default, or writes to `--output` when\nused outside git. `diff-driver` accepts both the two-argument local form and the\nseven- or nine-argument forms Git passes to external diff commands.\n`conflicts diff` reports conflict-marker regions in a file that already contains\nGit conflict markers.\n\nSemantic merge-driver coverage is fixture-backed for JSON. Other language and\nformat paths are git-compatible command surfaces without semantic driver\ncoverage.\n\n## Gems\n\nCore:\n\n- [`tree_haver`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/tree_haver) - parser substrate, byte ranges, backend adapters, and binary tree contracts.\n- [`ast-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-merge) - AST merge contracts, diagnostics, planning, review, replay, and nested-merge vocabulary.\n- [`ast-template`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-template) - template/session transport contracts.\n\nFormat libraries:\n\n- [`plain-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/plain-merge)\n- [`json-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/json-merge)\n- [`yaml-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/yaml-merge)\n- [`toml-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/toml-merge)\n- [`markdown-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/markdown-merge)\n- [`ruby-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ruby-merge)\n- [`go-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/go-merge)\n- [`rust-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/rust-merge)\n- [`typescript-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/typescript-merge)\n- [`binary-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/binary-merge)\n- [`zip-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/zip-merge)\n\nProvider and recipe gems:\n\n- [`psych-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/psych-merge)\n- [`citrus-toml-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/citrus-toml-merge)\n- [`parslet-toml-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/parslet-toml-merge)\n- [`commonmarker-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/commonmarker-merge)\n- [`kramdown-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kramdown-merge)\n- [`markly-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/markly-merge)\n- [`prism-merge`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/prism-merge)\n- [`kettle-jem`](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem)\n\n## Portability\n\nThe Ruby gems are developed against the shared StructuredMerge fixtures. Those\nfixtures define the cross-language behavior expected from the Go, TypeScript,\nRust, and Ruby implementations. Conformance checks live in gem specs and in the\nshared spec/fixture tooling rather than in a static status document.\n\n## Development\n\nCommon checks:\n\n- `mise run check`\n- `bundle exec rake`\n- package-specific `bundle exec rspec` commands\n\nBundler path gems are the default isolation mechanism inside this monorepo. When\nthis repository needs to consume sibling workspace projects outside the monorepo\nitself, prefer `nomono`-driven Bundler wiring rather than manual Ruby load-path\nchanges.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstructuredmerge%2Fstructuredmerge-ruby","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstructuredmerge%2Fstructuredmerge-ruby","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstructuredmerge%2Fstructuredmerge-ruby/lists"}