Skip to content

Command reference

One row per command, then the full option list for each. Options shown are the command-specific ones; every command also accepts the global cleo options (-h/--help, -q/--quiet, -V/--version, --ansi, --no-ansi, -n/--no-interaction, -v|vv|vvv). Run atom-tools help <command> to see this live.

command reads writes lesson
analyze source tree (drives atom) reachables, usages, stats, openapi, sarif 2
stats any slice text or json summary 4
check-reachable reachables console verdict 4
filter usages or reachables filtered slice, or chained command output 5
merge-slices reachables (chunks, globs) merged, de-duplicated slice 6
validate-lines usages or reachables text and json accuracy report 6
visualize reachables (+ optional SBOM) console report, mermaid, html 7
query-endpoints usages console endpoint list 8
convert usages or reachables openapi or sarif 8, 9
ingest any engine report unified flow model or reachables 10
attack-surface any engine report console, json, html 11
drift two reports, same engine console, markdown or json delta 12
graph reports with call graphs console, json, mermaid, graphml, gexf 13
explain any engine report text, markdown, agent json, MCP server 14
crypto-reach dosai crypto, golem, rusi text or json triage 15
apk-analysis apk, apkm or aab (drives blint and atom) SBOM, slices, consolidated report README

analyze

  -l, --language=LANGUAGE  atom language code: java, python, jssrc, jssrc/ts, c, ruby, php, jar, apk, scala, ...
  -i, --input=INPUT        Path to the source file or directory to analyse. [default: "."]
  -o, --output=OUTPUT      Directory to write reports to. [default: "reports"]
      --atom-cmd=ATOM-CMD  Path to the atom command; resolved from PATH when omitted.
      --extract-endpoints  Extract an OpenAPI document from the usages slice.
      --sarif              Export the reachable slices to a SARIF document.
      --no-usages          Skip the usages slice; only reachables are generated.

stats

  -i, --input-slice=INPUT-SLICE  Slice file. Usages, reachables, data-flow, parsedeps and semantics slices are supported.
      --json                     Write the summary as a JSON document instead of printing text.
  -o, --output-file=OUTPUT-FILE  Output file used together with --json. [default: "slice-stats.json"]

check-reachable

  -i, --input-slice=INPUT-SLICE  Slice file
  -p, --pkg=PKG                  Package to search for in the format of <package_name>:<version>
  -l, --location=LOCATION        Filename with line number to search for in the format of <filename>:<linenumber>

check-reachable prints True or False on stdout. Scripts should read that value rather than the exit code, which is always 0.

filter

  -i, --input-slice=INPUT-SLICE          Slice file to filter.
  -c, --criteria=CRITERIA                Filter based on an attribute of the slice. May be a Python regular expression.
  -p, --package-version=PACKAGE-VERSION  Filter a reachables slice based on a package name and version in format package:version. May include multiple separated by a comma.
  -o, --outfile=OUTFILE                  File to re-export filtered slice to.
  -f, --fuzz=FUZZ                        Minimum percentage to match with the given criteria INSTEAD of using a regex. Must be a number between 0 and 100.
  -e, --execute=EXECUTE                  Command to execute after filtering. [default: "export"]

merge-slices

  -i, --input-slice=INPUT-SLICE  Slice file, glob pattern, or comma separated list. Sibling chunks such as reachables_1.json are picked up automatically.
  -o, --output-file=OUTPUT-FILE  Output file [default: "merged.reachables.slices.json"]
      --no-dedupe                Keep duplicate flow groups instead of dropping them.

validate-lines

  -i, --input-slice=INPUT-SLICE  Slice file to validate.
  -t, --type=TYPE                Origin type of source on which the atom slice was generated. [default: "java"]
  -d, --base-path=BASE-PATH      This should be the same path that was used by atom when the slice was generated.
  -l, --interval=INTERVAL        Try matching within a range. Ex. slice has line number 567, with interval of 5, we check lines 562-572. Use 0 for exact matching. [default: "5"]
  -r, --report=REPORT            Output summary to file. Defaults to output.txt in the current directory. [default: "output.txt"]
  -j, --export-json=EXPORT-JSON  JSON report file to store invalid lines. Include valid lines as well using -v flag.

visualize

  -i, --input-slice=INPUT-SLICE        Reachable slice file, glob pattern, or comma separated list. Sibling chunks such as reachables_1.json are picked up automatically.
  -o, --output=OUTPUT                  Base path for the .mmd and .html outputs. [default: "reachables-viz"]
  -b, --bom=BOM                        Optional CycloneDX SBOM (e.g. from cdxgen) used to enrich package nodes with licenses and report reachability coverage.
  -f, --format=FORMAT                  Renderers to run: all, console, mermaid or html. [default: "all"]
      --max-flows=MAX-FLOWS            Maximum number of flows drawn in the mermaid diagram. The most interesting flows (high risk sinks first) are kept. [default: "60"]
      --label-wrap=LABEL-WRAP          Soft width at which long diagram labels (relative paths, purls, sink expressions) are wrapped across lines. Labels are never truncated; pass 0 to keep each on a single line. [default: "48"]
      --mermaid-source=MERMAID-SOURCE  Path to a local mermaid.min.js to embed in the HTML page so it renders offline.

query-endpoints

  -i, --input-slice=INPUT-SLICE    Slice file
  -t, --type=TYPE                  Origin type of source on which the atom slice was generated. [default: "java"]
  -f, --filter-lines=FILTER-LINES  Filter endpoints by line number or range.
  -s, --sparse                     Only display names; do not include path and line numbers.

convert

  -f, --format=FORMAT                    Destination format [default: "openapi3.1.0"]
  -i, --input-slice=INPUT-SLICE          Usages slice file [default: "usages.slices.json"]
  -e, --semantics-slice=SEMANTICS-SLICE  Semantics slice file [default: "semantics.slices.json"]
  -t, --type=TYPE                        Origin type. Supported: go, golang, jar, java, javascript, js, kotlin, kt, py, python, rb, rs, ruby, rust, sbt, scala, ts, typescript [default: "java"]
  -o, --output-file=OUTPUT-FILE          Output file [default: "openapi.json"]
  -s, --server=SERVER                    The server url to be included in the server object.

ingest

  -i, --input-slice=INPUT-SLICE  Report file(s): dosai dataflows/methods, golem analyze, rusi analyze or atom reachables. Comma separated lists and globs are supported, and engines can be mixed freely.
  -o, --output-file=OUTPUT-FILE  Output file for the unified (or reachables) document. [default: "unified-flows.json"]
      --emit=EMIT                Output form: 'unified' (the model document, default) or 'reachables' (an atom-compatible document that stats, visualize, convert, check-reachable and filter already consume). [default: "unified"]
      --engine=ENGINE            Force the producing engine (atom, dosai, golem, rusi, kosi) instead of detecting it from the report envelope.

attack-surface

  -i, --input-slice=INPUT-SLICE    Report file(s): dosai dataflows/methods, golem analyze, rusi analyze, atom reachables or atom usages slices. Comma separated lists and globs are supported, and engines can be mixed freely.
  -o, --output-file=OUTPUT-FILE    Output path: the json document with -f json, or the base path for the .mmd and .html files with -f html. [default: "attack-surface"]
  -f, --format=FORMAT              Output format(s), comma separated: json, console, html. [default: "console"]
      --min-exposure=MIN-EXPOSURE  Only report tiers at least this exposed. One of the documented tier names (anonymous-http is the most exposed). Tiers whose authentication is unknown never match the filter and are counted in a note instead.
      --max-entries=MAX-ENTRIES    Maximum number of entry points listed in the console and diagram renderings. The json output always carries every entry point. [default: "200"]

drift

      --old=OLD                  Baseline report: dosai dataflows, golem analyze, rusi or kosi analyze or atom reachables.
      --new=NEW                  Current report, from the same engine as --old.
  -o, --output-file=OUTPUT-FILE  Output file for the drift document (json format only). [default: "drift.json"]
  -f, --format=FORMAT            Output format: json, console, markdown. [default: "console"]
      --fail-on=FAIL-ON          Comma separated gate keys; exit code 2 when any trips. Known: new-high, new-medium, new-anonymous-endpoint, new-package, new-sink-category, new-entrypoint. A coverage regression trips the gate regardless of this option.
      --engine=ENGINE            Force the producing engine for both inputs instead of detecting it from the report envelope.

graph

  -i, --input-slice=INPUT-SLICE                        Report file(s) carrying a call graph: golem analyze, rusi analyze, dosai methods, or atom export --format graphml. Comma separated lists and globs are supported, and engines can be mixed freely.
      --metric=METRIC                                  One of: chokepoints, centrality, blast-radius, entry-depth, dead-code, cycles. Default: chokepoints.
      --blast-radius=BLAST-RADIUS                      Node to measure the blast radius of (a call-graph node id or a unique function name); selects the blast-radius metric.
      --min-confidence=MIN-CONFIDENCE                  Keep only edges at or above this confidence tier: exact, external, candidate, unknown.
      --include-external                               Include external (out-of-workspace) nodes in rankings. Off by default.
      --algorithms=ALGORITHMS                          atom 'algorithms' JSON output(s) (centrality and/or scc) to join verbatim; only meaningful for atom graphml inputs.
      --top=TOP                                        Ranked entries shown in the console and diagram renderings. The json output always carries every entry. [default: "15"]
      --max-chokepoint-sources=MAX-CHOKEPOINT-SOURCES  Cap on the source nodes whose paths the chokepoint metric enumerates. When the cap binds the output says so and the scores are a lower bound. [default: "64"]
  -f, --format=FORMAT                                  Output format(s), comma separated: json, console, mermaid. [default: "console"]
  -o, --output-file=OUTPUT-FILE                        Output path for the json document, the .mmd diagram, or the base path for --export graphml/gexf. [default: "call-graph"]
      --export=EXPORT                                  Export the unified graph(s) as: graphml, gexf.

explain

  -i, --input-slice=INPUT-SLICE  Report file(s): dosai dataflows/methods, golem analyze, rusi analyze, atom reachables or a unified document from ingest. Comma separated lists and globs are supported.
  -o, --output-file=OUTPUT-FILE  Write the rendering here instead of the console (the natural home for -f agent and -f markdown). [default: ""]
  -f, --format=FORMAT            Output format: text, markdown, agent. [default: "text"]
      --flow=FLOW                Explain one flow by its exact id (text and markdown formats).
      --package=PACKAGE          Explain the flows whose purls contain this string (case-insensitive substring; text and markdown formats).
      --file=FILE                Explain the flows with any node in this file (suffix match on normalised path separators; text and markdown formats).
      --query=QUERY              dosai's compact query grammar over the model: 'flows[sink_category=sql && severity=error]', with 'sort by prop [desc]' and 'count' postfixes. Collections are flows, endpoints, packages; a flow also exposes dotted source./sink. paths.
      --max-flows=MAX-FLOWS      Maximum flow narratives listed in text and markdown renderings. [default: "10"]
      --max-tokens=MAX-TOKENS    Token budget for -f agent, counted as characters/4 of the serialized JSON. [default: "4000"]
      --engine=ENGINE            Force the producing engine (atom, dosai, golem, rusi, kosi) instead of detecting it from the report envelope.
      --old=OLD                  With --mcp only: baseline report for the atom.drift tool, loaded at startup (tools never touch the filesystem).
      --mcp                      Run a read-only stdio MCP server over the loaded report.

crypto-reach

  -i, --input-slice=INPUT-SLICE  Report file(s): dosai crypto, golem analyze (--dataflow crypto|all), rusi analyze, or mixed. Atom slices and unified documents carry no crypto section and are reported as out of scope. Comma separated lists and globs are supported.
  -f, --format=FORMAT            Output format: text, json. [default: "text"]
  -o, --output-file=OUTPUT-FILE  Write the output here instead of the console. [default: ""]
      --weak-only                Keep only the triage population: weak/legacy-strength items and findings that are not literal-material inventory.
      --max-entries=MAX-ENTRIES  Maximum items listed in the text rendering. [default: "40"]

Exit codes

Most commands exit 0 on success and 1 on failure. Two commands use extra codes worth memorising. check-reachable exits 1 when there are no hits, which is a normal answer, not an error. drift exits 2 when a gate trips, so a CI script can distinguish "the diff tool broke" (1) from "the diff found risk" (2).