chromia-cli-tools provides CLI-specific utilities and launcher infrastructure for building command-line interfaces that consume the chromia-build-tools APIs. This module bridges the gap between the programmatic APIs and user-facing CLI commands.
This module provides:
- CLI launcher base class with exception handling
- Configuration option builders for Clikt commands
- Terminal output formatting and theming
- Environment adapters between CLI frameworks
The module provides infrastructure for CLI applications:
chromia-cli-tools/
└── src/main/kotlin/com/chromia/cli/tools/
├── launcher/
│ └── CliLauncher.kt # Base CLI launcher class
├── config/
│ └── configOption.kt # Configuration option builders
├── formatter/
│ ├── PanelHelpFormatter.kt # Custom help formatter
│ └── theme.kt # Terminal color theme
├── env/
│ └── CliktCliEnv.kt # Clikt to RellCliEnv adapter
├── ft/
│ ├── evmAuth.kt # EVM authentication utilities
│ └── ftAuth.kt # FT4 authentication utilities
├── multisignature/
│ └── multisignature.kt # Multi-signature utilities
└── util/
├── date.kt # Date utilities
└── Options.kt # CLI option builders
CliLauncher.kt:
- Base class for CLI applications using Clikt framework
- Handles exception translation and error reporting
- Configures terminal output and help formatting
- Provides
catchingAllExceptionsMain()for centralized exception handling
Key Features:
- Translates exceptions to user-friendly error messages
- Configures terminal theme based on ANSI support
- Sets up custom help formatter (PanelHelpFormatter)
- Provides consistent error exit codes (1, 2, or 3) based on exception type
- Logs errors to files (configurable via
CHR_LOG_FOLDER)
Exception Handling:
RellCliExitException→ Exit code 1ClientError→ Exit code 1RellCliException→ Exit code 2ValidationException→ Exit code 2UserMistake→ Exit code 2 or 3 (depending on cause)SQLException→ Exit code 2- Generic
Exception→ Exit code 3
configOption.kt:
- Configuration option builders for Clikt commands
chromiaConfigOption(): Loads client configuration (optional, reads from filesystem)chromiaModelOption(): Loads and validateschromia.yml(required)optionalChromiaModelOption(): Loads model without throwing if missingsafeOptionalChromiaModelOption(): Loads model without throwing on errorschromiaModelConfigOption(): Loads both model and config
Purpose: Provides reusable configuration loading patterns for CLI commands, ensuring consistent configuration handling across commands.
PanelHelpFormatter.kt:
- Custom help formatter for CLI commands
- Provides panel-based help output instead of standard Clikt formatting
theme.kt:
chromiaTheme: Terminal color theme configuration- Defines color scheme for Chromia CLI output
CliktCliEnv.kt:
CliktCliEnv: Adapter between Clikt commands andRellCliEnvinterface- Bridges Clikt's echo functionality to Rell's CLI environment interface
- Tracks error state for command execution
evmAuth.kt / ftAuth.kt:
- Authentication utilities for EVM and FT4 (Chromia's authentication system)
- Used for signing transactions and authenticating with Chromia networks
multisignature.kt:
- Utilities for multi-signature transaction handling
- Supports threshold-based signing
Options.kt:
- Reusable CLI option builders:
thresholdOption(): Multi-signature threshold configurationtimebOptions(): Time-based transaction optionsslowDBStatementLogMsOption(): Database logging thresholdsignersOption(): Signer configuration
date.kt:
- Date/time parsing and formatting utilities for CLI
Core Dependencies:
com.chromia.cli.tools:chromia-build-tools- Core APIscom.chromia.cli.tools:chromia-cli-base- Base utilitiesnet.postchain.client:postchain-client- Postchain clientnet.postchain.rell:rell-api-base- Rell APInet.postchain.client:ft4-client- FT4 authenticationcom.github.ajalt.clikt:clikt-jvm- CLI frameworkcom.github.ajalt.mordant:mordant-jvm-jna-jvm- Terminal outputio.github.microutils:kotlin-logging-jvm- Logging
Utilities:
org.webjars.npm:ethers- Ethereum/EVM utilitiesorg.http4k:http4k-server-netty- HTTP server (for some CLI features)
This module is consumed by CLI implementations (like the chr command). A typical CLI implementation would:
- Extend
CliLauncherfor the main command - Use configuration option builders for command options
- Use
CliktCliEnvto bridge to Rell APIs - Use utility functions for common CLI patterns
Example Structure:
class MyCommand : CliLauncher("my-command") {
// Use config option builders
private val model by chromiaModelOption()
override fun run() {
val cliEnv = cliEnv()
// Use chromia-build-tools APIs
val configs = ChromiaCompileApi.build(cliEnv, model)
// ...
}
}
fun main(args: Array<String>) {
MyCommand().catchingAllExceptionsMain(args)
}This module provides the CLI layer on top of chromia-build-tools:
CliLauncherhandles user-facing concerns (errors, output)- Configuration options load models and configs for build-tools APIs
CliktCliEnvadapts Clikt to Rell's CLI environment interface- Utilities provide common CLI patterns (authentication, signing, etc.)
- Logging Location: Log file location is configurable via
CHR_LOG_FOLDERbut defaults to "logs" directory in current working directory.
The module includes unit tests in src/test/kotlin/. Run tests with:
cd chromia-cli-tools
mvn testThe build ensures that the binary compatibility of this library is maintained. If you make any changes to the exported API, run:
mvn compile kotlin-bcv:dump