Render CI reports from structured tool output as GitHub step summaries and PR comments.
Quick start
- uses: lbliii/kida@v0
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 |
release-notes |
github-prs |
GitHub release notes |
release-notes-compact |
github-prs |
Compact release notes |
release-notes-detailed |
github-prs |
Detailed release notes |
release-notes-terminal |
github-prs |
Terminal release notes |
code-review |
json |
AMP code review |
pr-summary |
json |
AMP PR summary |
deploy-preview |
json |
AMP deploy preview |
dependency-review |
json |
AMP dependency review |
security-scan |
json |
AMP security scan |
copilot-instructions |
json |
Agent instructions |
Report contracts
Built-in report templates are fixture-backed and snapshot-tested. AMP templates (code-review, pr-summary, deploy-preview, dependency-review, security-scan, and release-notes) are also checked against their schemas/amp/v1/JSON schemas.
Markdown output escapes untrusted tool and agent text before it reaches tables, details blocks, headings, links, or code snippets. Reports are designed to render in both GitHub step summaries and PR comments.
PR comments are updated by a stable HTML marker derived fromcomment-header. Use the same comment-header with comment-mode: appendwhen multiple report steps should share one comment.
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, github-prs |
post-to |
no | step-summary |
step-summary, pr-comment, release, release-asset, slack, changelog(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 |
app-id |
no | — | GitHub App ID for branded PR comments |
app-private-key |
no | — | GitHub App private key for branded PR comments |
python-version |
no | 3.14 |
Python version (3.14+), 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
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
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
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
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
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
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
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
with:
template: .github/templates/my-report.md
data: results.json
Skip Python setup (pre-installed)
- uses: lbliii/kida@v0
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.