Thank you for your interest in contributing! This document explains how to build, test, and submit changes.
DMTools-dart is the pure-Dart port of DMTools (Java/GraalJS → Dart/QuickJS). When behavior is ambiguous, the Java source is the spec — record the decision in your commit message.
git clone https://github.com/epam/dmtools-dart.git
cd dmtools-dart
dart pub get
make native # compile the QuickJS shared library — required once per checkout
# Credentials live in dmtools.env (git-ignored) — see README → Configuration
make nativeis required before tests and the CLI. Without it you get rawdlopen ... libquickjs_bridge.sofailures. CI builds it automatically.
# Compile the standalone AOT executable (needs the native library)
make build
# Run from source (fast iteration)
dart run bin/dmtools.dart# Unit + contract tests (fast, no API calls — run these for every change)
dart test
# A single file
dart test test/integrations/bitrise/bitrise_client_test.dartNote: Integration tests (
test/integration/, tagintegration) make real API calls and require valid credentials fromdmtools.env. They are excluded from the default run and executed by the nightly integration.yml.
CI (quality.yml) enforces on every push and PR — run them locally before pushing:
dart format --set-exit-if-changed .
dart analyze
dart test --coverage=coverage
dart pub global run coverage:format_coverage \
--lcov --in coverage --out coverage/lcov.info --report-on lib
crap4dart check --all # CRAP threshold 8.0 — see crap4dart.yaml
crap4dart analyzeCoverage gate: 80% on lib. All logic lives in lib/; bin/ only parses argv and delegates.
- Fork the repository and create a feature branch from
main. - Make your changes following the code style (see AGENTS.md).
- Add or update unit tests for any new logic — tests ship with code.
- Verify all gates pass (above).
- Open a pull request with a clear description of what you changed and why — and, when porting behavior, the Java file that served as spec.
See the conventions in AGENTS.md and the existing per-integration catalogs under lib/src/integrations/<name>/<name>_tools.dart — declaration order, executor routing, and the matching tests under test/integrations/<name>/.
dart formatdefaults; public API documented (thepublic_docsgate enforces it).- Keep methods small: complexity ≤ 10, body ≤ 60 lines, params ≤ 6 — the gates enforce this.
- Generated code (
*.g.dart,*.freezed.dart) is gate-excluded — regenerate, never hand-edit.
Please open a GitHub Issue with:
- A minimal reproduction case
- Your DMTools version (
dmtools --version) - Operating system
Open a GitHub Issue with the question label for questions and ideas.