# udsdoc

**AUTOSAR DCM/CanTp/DEM ARXML → UDS (ISO 14229) specification documents
(LaTeX → PDF) and ASAM ODX 2.2 / PDX (ISO 22901-1).**

[![PyPI version](https://badge.fury.io/py/udsdoc.svg)](https://badge.fury.io/py/udsdoc)
[![Python](https://img.shields.io/pypi/pyversions/udsdoc.svg)](https://pypi.org/project/udsdoc/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

`udsdoc` turns AUTOSAR diagnostic ARXML into a complete UDS specification and
into ODX/PDX for diagnostic tooling. It offers two front-ends over the same
pipeline: a **GUI** (local browser app) and a **CLI** (headless, CI/HPC-friendly).

## Install

```bash
pip install udsdoc          # CLI core (LaTeX / Markdown / RST / ODX / PDX)
pip install udsdoc[web]     # GUI  (udsdoc --serve)
pip install udsdoc[all]     # everything (GUI + LLM verify + ECU testing)
```

PDF output needs a LaTeX distribution with `xelatex` (TeX Live / MiKTeX).

## GUI version

```bash
udsdoc --serve            # opens http://127.0.0.1:8765
```

- **Inputs** — on the *Generate* tab, pick a BSW repository folder (or a
  built-in sample). It auto-discovers the **ARXML** (Dcm / CanTp / Dem) and the
  **C** sources; attach an optional **Compliance Matrix** CSV (+ a sources YAML)
  for a requirements-compliance chapter.
- **Outputs** — *Generate & Download* a LaTeX ZIP that includes a compiled
  **`spec.pdf`** (Tex → PDF), or *Export ODX / PDX* for CANalyzer / CANoe.
- **LLM** — the *LLM* tab connects the provider used by *Verify
  Conditionally-Accepted comments*: **Claude** (browser sign-in), **ChatGPT** /
  **Gemini** (paste an API key — the button opens the key page for you), or
  local **Ollama** (pick or install an open-source model). Credentials are
  stored locally under `~/.udsdoc/`.

## CLI version

```bash
# ARXML in → LaTeX + compiled PDF out
udsdoc dcm.arxml cantp.arxml --dem dem.arxml --pdf -o spec.tex

# auto-discover a whole BSW repo (ARXML + C sources)
udsdoc --repo /path/to/bsw-project --pdf -o spec.tex

# DID / RID C sources for variable cross-referencing
udsdoc dcm.arxml --c-source did.c --c-source rid.c -o spec.tex

# Compliance Matrix + verify the concluded OEM↔supplier dialogue vs. the
# implementation, emit ISO 22901-1 PDX
udsdoc dcm.arxml --dem dem.arxml \
    --compliance-matrix matrix.csv --verify --format pdx -o out/spec
```

- **Inputs** — ARXML as positional arguments (+ `--dem`), or a whole repository
  via `--repo`; **C** sources via `--c-source`; requirements via
  `--compliance-matrix` (+ `--compliance-matrix-sources`).
- **Outputs** — `--pdf` (Tex → PDF), `--format pdx` (ISO 22901-1 PDX; also
  `html`, `md`, `rst`, `odx`).

Python API:

```python
from udsdoc import ArxmlParser, TexGenerator

spec = ArxmlParser().parse_multi(["dcm.arxml", "cantp.arxml"])
TexGenerator().generate(spec, "spec.tex")
```

## LLM configuration

The *Verify* feature (does the concluded OEM↔supplier dialogue match the
implementation?) works with Anthropic (Claude), any OpenAI-compatible endpoint
(OpenAI, Gemini's OpenAI-compatible API, OpenRouter, …) or local Ollama.
Configure it once, whichever way suits you:

- **GUI** — the *LLM* tab: sign in with Claude, paste a ChatGPT / Gemini key, or
  pick an Ollama model.
- **Env vars** — `UDSDOC_LLM_PROVIDER`, `UDSDOC_LLM_MODEL`, `UDSDOC_LLM_BASE_URL`,
  `UDSDOC_LLM_API_KEY` (or a provider-native key such as `ANTHROPIC_API_KEY` /
  `OPENAI_API_KEY` / `GEMINI_API_KEY`).
- **CLI flags** — `--llm-provider`, `--llm-model`, `--llm-base-url`,
  `--llm-api-key`, or `--llm-config <file>`.
- **Config file** — `~/.udsdoc/llm.json`
  (`{"provider", "model", "base_url", "api_key", "timeout"}`).

`--verify` alone runs fully offline (deterministic status / numeric / lexical
checks); add `--verify-llm` to let the LLM judge the prose-ambiguous rows.

## License

MIT
