GitHub Action

Render CI reports from structured tool output as GitHub step summaries and PR comments

4 min read 799 words

Render CI reports from structured tool output as GitHub step summaries and PR comments.

Quick start

- uses: lbliii/kida@v0.3.3
  with:
    template: pytest
    data: reports/pytest.xml
    data-format: junit-xml

Built-in templates

Template Data format Tool
pytest junit-xml pytest--junitxml
coverage json or lcov pytest-cov--cov-report=json
ruff json ruff--output-format json
ty junit-xml ty--output-format junit
jest json jest--json
gotest junit-xml go-junit-report
sarif sarif CodeQL, Semgrep, Trivy, ESLint

Inputs

Input Required Default Description
template yes Built-in name or path to custom.mdtemplate
data yes Path to the data file
data-format no json json, junit-xml, sarif, lcov
post-to no step-summary step-summary, pr-comment, or both (comma-separated)
comment-header no template name Identifies the PR comment for updates
comment-mode no replace replace overwrites; appendadds below existing content
fail-under no Fail the step if coverage/pass-rate is below this %
context no JSON string with extra template variables
token no github.token Token for PR comments
python-version no 3.12 Python version (3.12+), or skipto use your own
install no true Setfalseif kida is already installed
kida-command no kida Override command (e.g.uv run kida)

Outputs

Output Description
report Rendered markdown content
comment-id PR comment ID (when posting to PR)

Examples

Pytest + coverage with PR comments

- name: Run tests
  run: |
    pytest --junitxml=reports/pytest.xml \
      --cov=mypackage --cov-report=json:reports/coverage.json

- name: Test report
  if: always()
  uses: lbliii/kida@v0.3.3
  with:
    template: pytest
    data: reports/pytest.xml
    data-format: junit-xml
    post-to: step-summary,pr-comment

- name: Coverage report
  if: always()
  uses: lbliii/kida@v0.3.3
  with:
    template: coverage
    data: reports/coverage.json
    post-to: step-summary,pr-comment
    fail-under: '80'

Combined PR comment (multiple reports in one comment)

Use the samecomment-header with comment-mode: appendto build a single PR comment from multiple report steps:

- name: Test report
  uses: lbliii/kida@v0.3.3
  with:
    template: pytest
    data: reports/pytest.xml
    data-format: junit-xml
    post-to: step-summary,pr-comment
    comment-header: CI Report

- name: Coverage report
  uses: lbliii/kida@v0.3.3
  with:
    template: coverage
    data: reports/coverage.json
    post-to: step-summary,pr-comment
    comment-header: CI Report
    comment-mode: append

- name: Lint report
  uses: lbliii/kida@v0.3.3
  with:
    template: ruff
    data: reports/ruff.json
    post-to: step-summary,pr-comment
    comment-header: CI Report
    comment-mode: append

This creates one PR comment with all three reports separated by horizontal rules, auto-updated on re-push.

Diff coverage (changed files only)

Pass changed file paths viacontextto highlight coverage for PR-touched files:

- name: Get changed files
  id: changed
  run: |
    FILES=$(gh pr diff ${{ github.event.pull_request.number }} --name-only | grep '\.py$' || true)
    JSON=$(echo "$FILES" | python3 -c "import sys,json; print(json.dumps([l.strip() for l in sys.stdin if l.strip()]))")
    echo "files=$JSON" >> "$GITHUB_OUTPUT"
  env:
    GH_TOKEN: ${{ github.token }}

- name: Coverage report
  uses: lbliii/kida@v0.3.3
  with:
    template: coverage
    data: reports/coverage.json
    post-to: step-summary,pr-comment
    context: '{"changed_files": ${{ steps.changed.outputs.files }}}'

Ruff lint violations

- name: Run ruff
  run: ruff check src/ --output-format json > reports/ruff.json || true

- name: Lint report
  if: always()
  uses: lbliii/kida@v0.3.3
  with:
    template: ruff
    data: reports/ruff.json
    post-to: step-summary,pr-comment

Custom template

Pointtemplate at any .mdfile in your repo. Data is unpacked as template variables:

- uses: lbliii/kida@v0.3.3
  with:
    template: .github/templates/my-report.md
    data: results.json

Skip Python setup (pre-installed)

- uses: lbliii/kida@v0.3.3
  with:
    template: pytest
    data: results.xml
    data-format: junit-xml
    python-version: skip
    install: 'false'
    kida-command: uv run kida

Agent templates (AMP)

The Kida action also renders AI agent output via the Agent Message Protocol (AMP). AMP extends the built-in template set with templates for agent-produced messages:

Template AMP type Description
code-review code-review AI code review with severity badges and diff suggestions
pr-summary pr-summary Auto-generated PR description with risk analysis
deploy-preview deploy-preview Deploy status with bundle size and Lighthouse scores
dependency-review dependency-review Dependency changes with vulnerability and license analysis
security-scan security-scan Security findings with CWE/CVE references and remediation
release-notes release-notes Generated release notes and highlights, typically posted torelease

See Agent Templates for schema details and customization, or the Agent Integration Tutorial for a full end-to-end walkthrough.