This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
relaton-cli is a Ruby CLI tool for managing bibliographic references to standards (ISO, IEC, IETF, NIST, etc.). It provides commands to fetch, convert, and organize standards metadata in XML, YAML, BibTeX, and HTML formats. Part of the broader Relaton/Metanorma ecosystem.
# Install dependencies
bundle install
# Run all tests
bundle exec rspec
# Run a single test file
bundle exec rspec spec/relaton/cli/command_spec.rb
# Run a specific test by line number
bundle exec rspec spec/relaton/cli/command_spec.rb:42
# Build the gem
bundle exec rake build
# Lint (RuboCop, inherits from Ribose OSS guide)
bundle exec rubocop
bundle exec rubocop -a # auto-fixThe executable exe/relaton calls Relaton::Cli.start(ARGV) which routes to Relaton::Cli::Command, a Thor-based command class. Thor handles argument parsing, option definitions, and subcommand routing.
lib/relaton/cli/command.rb— Main Thor command class with top-level commands (fetch, extract, concatenate, split, yaml2xml, xml2yaml, xml2html, yaml2html, convert, fetch-data)lib/relaton/cli/subcommand_collection.rb—relaton collectionsubcommands (create, info, list, get, find, fetch, import, export)lib/relaton/cli/subcommand_db.rb—relaton dbsubcommands (create, mv, clear, fetch, fetch_all, doctype)
Command#fetch and SubcommandDb#fetch use the shared fetch_document helper (in Relaton::Cli private methods at the bottom of command.rb). This helper transforms Thor's kebab-case option keys to snake_case symbols via gsub("-", "_").to_sym and splats them as **dup_opts to Relaton.db.fetch / Relaton.db.fetch_std. Adding a new Thor option to these commands automatically forwards it to the underlying library with no method changes needed.
SubcommandCollection#fetch calls Relaton.db.fetch directly (not through fetch_document), so new options must be explicitly forwarded there.
Current fetch options that use this pattern: --no-cache, --all-parts, --keep-year, --publication-date-before, --publication-date-after.
lib/relaton/bibdata.rb—Relaton::BibdatawrapsRelatonBib::BibliographicItem, adding URL type handling and serialization to XML/YAML/Hash. Usesmethod_missingto delegate to the underlying bibitem.lib/relaton/bibcollection.rb—Relaton::Bibcollectionrepresents a collection of bibliographic items with title/author/doctype metadata. Handles XML/YAML round-tripping.lib/relaton/element_finder.rb— Mixin providing XPath utilities with namespace handling.
lib/relaton/cli/base_convertor.rb— Abstract base defining the conversion flow (convert_and_write, write_to_file_collection)lib/relaton/cli/xml_convertor.rb— XML → YAML conversionlib/relaton/cli/yaml_convertor.rb— YAML → XML conversion (includes processor detection via doctype)lib/relaton/cli/xml_to_html_renderer.rb— Renders XML/YAML to HTML using Liquid templates fromtemplates/
lib/relaton/cli/relaton_file.rb — Static methods for extract (pull bibdata from Metanorma XML), concatenate (combine files into a collection), and split (break a collection into individual files).
Relaton::Cli::RelatonDb (in lib/relaton/cli.rb) is a Singleton managing a Relaton::Db instance. DB path is persisted in ~/.relaton/dbpath. The relaton gem's registry auto-discovers 30+ standard-body processors.
Relaton::Cli.processor(doc) and .parse_xml(doc) detect the correct processor (ISO, IEC, IETF, etc.) from a document's docidentifier element type attribute, falling back to prefix matching.
spec/acceptance/— End-to-end CLI integration tests usingrspec-commandspec/relaton/cli/— Unit tests for command, converters, subcommands, DBspec/relaton/— Unit tests for Bibcollection and Bibdataspec/support/— Test setup: SimpleCov, WebMock, VCR, equivalent-xml matchersspec/fixtures/andspec/vcr_cassettes/— Test data and recorded HTTP responses
Tests use VCR cassettes to replay HTTP interactions with standards registries. WebMock blocks real HTTP requests in tests.
relaton ~> 1.20.0— Core library providing DB, registry, and all standard-body processorsthor/thor-hollaback— CLI frameworkliquid ~> 5— HTML template renderingnokogiri(transitive via relaton) — XML parsing
Requires Ruby >= 3.0.0 (set in gemspec and .rubocop.yml).