Kida ships eight subcommands:check, render, fmt, components, readme, extract, manifest, and diff. All are available through the kida entry point or python -m kida.
kida <command> [options]
Contract Status
The public CLI contract is the set of subcommands and flags documented here.
Output text can become clearer, but machine-readable JSON shapes for
check --format json, components --json, readme --json, and manifest
should only change deliberately with docs and changelog updates when behavior
changes.
kida check
Parse all.htmltemplates under a directory. Reports syntax errors, loader resolution failures, and optional lint checks.
kida check <template_dir> [flags]
Positional argument:
| Argument | Description |
|---|---|
template_dir |
Root directory passed toFileSystemLoader. All *.htmlfiles are scanned recursively. |
Flags:
| Flag | Description |
|---|---|
--strict |
Fail on bare{% end %} closers. Requires explicit {% endif %}, {% endblock %}, {% endcall %}, etc. |
--validate-calls |
Validate macro call sites against{% def %}signatures. Reports unknown parameters and missing required parameters. Duplicate keyword arguments are rejected earlier as parser errors. |
--a11y |
Check templates for accessibility issues (missingaltattributes, heading order, etc.). |
--typed |
Type-check templates against{% template %}declarations. |
--lint-fragile-paths |
Suggest./ relative paths for same-folder include, extends, embed, and import statements so folder moves stay zero-edit. Programmatic FragilePathIssue records expose K-PATH-001; CLI text remains unchanged. |
--format {text,json,sarif} |
Select human text, Kida diagnostics JSON v1, or SARIF 2.1.0 output. Defaults totext. |
Examples
Basic syntax check:
kida check templates/
Strict mode with call validation:
kida check templates/ --strict --validate-calls
Full lint pass (all checks enabled):
kida check templates/ --strict --validate-calls --a11y --typed --lint-fragile-paths
Output format
Errors and warnings print to stderr, one per line:
layouts/base.html: unexpected tag 'endblock'
partials/nav.html:12: strict: unified {% end %} closes 'if' — prefer {% endif %}
components/card.html:8: a11y/img-alt [WARNING]: <img> missing alt attribute
--validate-calls diagnostics use stable K-CMP-*codes:
components/page.html:12: K-CMP-001: Call to 'card' — missing required: title
components/page.html:18: K-CMP-002: type: card() param 'count' expects int, got str ('many')
Text output goes to stderr. JSON and SARIF go to stdout, so either machine format can be redirected without mixing in human progress text:
kida check templates/ --typed --a11y --format json > diagnostics.json
kida check templates/ --strict --format sarif > diagnostics.sarif
The JSON envelope is versioned by schema_versionand includes the resolved
root, ordered diagnostics, severity summary, partialcollection status,
andexit_code. Its published schema is
schemas/diagnostics/v1/check.schema.json.
Each diagnostic always includes its stable code, category, severity, message,
path/range, optional suggestion and safe edit, related locations, confidence,
notes, documentation URL, source snippet, and metadata. Kida source columns are
zero-based in JSON; SARIF columns are converted to SARIF's one-based convention.
Machine-readable findings are deterministically ordered by validation phase,
path, range, code, and message. Exact duplicates with the same code, path,
range, and message are emitted once. A failed template does not stop the rest
of the directory scan;partial: truerecords that at least one requested
analysis could not be completed.
Diagnostic confidence describes the kind of evidence behind a finding:
provenmeans parsing or static analysis established the finding.conservativemeans static analysis intentionally chose the safe warning when it could not rule a problem out.runtime-onlymeans the fact came from execution and cannot be claimed as a compile-time proof.unknownmeans the producer has not classified its evidence yet.
Exit status is0 when there are no findings, 1when any enabled check emits
a finding, and2for an invalid invocation or template root. Severity labels
do not change this existing check policy.
kida render
Render a single template to stdout. Supports HTML and terminal rendering modes.
kida render <template> [flags]
Positional argument:
| Argument | Description |
|---|---|
template |
Path to the template file to render. |
Flags:
| Flag | Default | Description |
|---|---|---|
--data FILE |
none | JSON file providing template context variables. |
--data-str JSON |
none | Inline JSON string providing template context variables. |
--mode {html,terminal,markdown} |
html |
Rendering mode.terminalenables ANSI styling and width-aware layout. |
--width INT |
auto | Override terminal width (terminal mode only). |
--color {none,basic,256,truecolor} |
auto | Override color depth (terminal mode only). |
--data-format {json,junit-xml,sarif,lcov} |
json |
Format of the data file. |
--set KEY=VALUE |
none | Set template variables (repeatable). Values are parsed as JSON if valid, otherwise kept as strings. |
--explain |
off | Show which compile-time optimizations were applied. |
--stream |
off | Progressive output: reveal template chunks with a brief delay. |
--stream-delay SECONDS |
0.02 |
Delay between stream chunks. Requires--stream. |
Examples
Render with inline data:
kida render page.html --data-str '{"title": "Hello"}'
Render from a JSON file in HTML mode:
kida render page.html --data context.json --mode html
Terminal mode with explicit width and color:
kida render dashboard.html --width 120 --color 256
Streaming output:
kida render report.html --data stats.json --stream --stream-delay 0.05
kida fmt
Auto-format Kida template files. Accepts individual files or directories (scans for*.htmlrecursively).
kida fmt <paths...> [flags]
Positional argument:
| Argument | Description |
|---|---|
paths |
One or more files or directories to format. |
Flags:
| Flag | Default | Description |
|---|---|---|
--indent INT |
2 |
Spaces per indentation level. |
--check |
off | Check formatting without writing changes. Exits1if any file would be reformatted. |
Examples
Format all templates in a directory:
kida fmt templates/
Format specific files with 4-space indent:
kida fmt layouts/base.html partials/nav.html --indent 4
CI check (no writes, non-zero exit on drift):
kida fmt templates/ --check
kida components
List all{% def %}components across templates in a directory. Useful for auditing component libraries and generating documentation.
kida components <template_dir> [flags]
Positional argument:
| Argument | Description |
|---|---|
template_dir |
Root directory passed toFileSystemLoader. All *.htmlfiles are scanned recursively. |
Flags:
| Flag | Default | Description |
|---|---|---|
--json |
off | Output as JSON for machine consumption. |
--filter NAME |
none | Filter components by name (case-insensitive substring match). |
Examples
List all components:
kida components templates/
Filter by name:
kida components templates/ --filter card
Machine-readable output:
kida components templates/ --json
Output format
Human-readable output groups by template file:
components/card.html
def card(title: str, variant: str = ...)
slots: (default), actions
components/nav.html
def nav_link(href: str, label: str)
2 component(s) found.
JSON output produces an array of objects withname, template, lineno,
params, slots, has_default_slot, depends_on, vararg, and kwarg
fields. Each param includesname, annotation, has_default, and
required.
kida manifest
Render templates with capture instrumentation and emit a render manifest as JSON. Frameworks can use this to track rendered block fragments and context keys.
kida manifest <template_dir> [flags]
Positional argument:
| Argument | Description |
|---|---|
template_dir |
Root directory passed toFileSystemLoader. All *.html and *.kidafiles are scanned recursively. |
Flags:
| Flag | Default | Description |
|---|---|---|
-o, --output FILE |
stdout | Write manifest JSON to a file. |
--data FILE |
none | JSON object mapping template names to context dictionaries. |
--search |
off | Output a search manifest instead of the raw capture manifest. |
kida diff
Compare two render manifests and report added, removed, and changed fragment content hashes.
kida diff <old_manifest> <new_manifest>
Positional arguments:
| Argument | Description |
|---|---|
old_manifest |
Path to the previous manifest JSON file. |
new_manifest |
Path to the new manifest JSON file. |
kida readme
Auto-generate a README from project metadata. Detects project structure frompyproject.toml, filesystem, and git, then renders a styled markdown README using Kida's own template engine.
kida readme [root] [flags]
Positional argument:
| Argument | Default | Description |
|---|---|---|
root |
.(current directory) |
Project root directory to scan. |
Flags:
| Flag | Default | Description |
|---|---|---|
-o, --output FILE |
stdout | Write to file instead of stdout. |
--preset {default,minimal,library,cli} |
auto-detected | Built-in template preset. Auto-detected from project type if not specified. |
--template FILE |
none | Path to a custom Kida template (overrides--preset). |
--set KEY=VALUE |
none | Override detected values (repeatable). Value is parsed as JSON, falls back to string. |
--depth INT |
2 |
Directory tree depth for project scanning. |
--json |
off | Dump auto-detected context as JSON instead of rendering. |
Examples
Generate a README for the current project:
kida readme
Write to a file with a specific preset:
kida readme -o README.md --preset library
Override detected values:
kida readme --set description="A fast template engine" --set license=MIT
Inspect detected metadata:
kida readme --json
Use a custom template:
kida readme --template .github/readme.kida -o README.md
Presets
| Preset | Best For |
|---|---|
default |
General projects with standard structure |
minimal |
Small projects or packages |
library |
Python libraries with API documentation focus |
cli |
CLI tools with command documentation focus |
Python API
from kida.readme import detect_project, render_readme
# Auto-detect metadata
ctx = detect_project(root_path, depth=2)
# Render with a preset
md = render_readme(root_path, preset="library")
# Render with custom template and overrides
md = render_readme(
root_path,
template=Path("custom.kida"),
context={"description": "Override"},
)
kida extract
Extract translatable messages from templates into a.pot(PO Template) file for internationalization workflows.
kida extract <template_dir> [flags]
Positional argument:
| Argument | Description |
|---|---|
template_dir |
Root directory to scan for templates. |
Flags:
| Flag | Default | Description |
|---|---|---|
-o, --output FILE |
stdout | Write output to file instead of stdout. |
--ext .EXT |
.html .kida .txt .xml |
File extensions to scan (repeatable). |
Examples
Extract messages to stdout:
kida extract templates/
Write to a .potfile:
kida extract templates/ -o messages.pot
Scan only .html and .kidafiles:
kida extract templates/ --ext .html --ext .kida
Exit Codes
| Code | Meaning |
|---|---|
0 |
Success. No errors or formatting drift. |
1 |
One or more problems found (check), render failure, or formatting drift (fmt --check). |
2 |
Invalid input: path not found, bad JSON data, or unknown command. |
See Also
- Configuration Reference — environment and loader options
- Filters Reference — built-in filters
- API Reference — Python API for
Environment,FileSystemLoader, and templates