Build portable dynamic Espanso forms using runtime-generated layouts, a shared env contract, reusable scaffolding, and latency-safe output patterns. Use when the task involves: (1) Creating or modifying Espanso form triggers or match files, (2) Building dynamic Espanso forms where a script generates form layouts at runtime, (3) Scaffolding a new Espanso form provider pattern, (4) Configuring Espanso YAML for runtime-generated choices or fields, (5) Debugging or linting Espanso form configurations, (6) Implementing latency-safe clipboard or output patterns for Espanso, or (7) Any task involving Espanso text expansion with dynamic or scripted form UIs.
Resources
4Install
npx skillscat add devguyrash/agent-skills/espanso-dynamic-forms Install via the SkillsCat registry.
Espanso Dynamic Forms
Use this skill when building or maintaining dynamic Espanso forms where a script/binary generates form layout text at runtime.
This skill is implementation-language agnostic: the generator can be Rust, Python, shell, or another runtime as long as it follows the contract.
What this skill gives you
- A portable runtime contract for dynamic form generators.
- Reusable scaffold generation for provider-based layouts.
- YAML linting for contract consistency.
- Patterns and anti-patterns for dynamic forms.
- Latency-safe output/clipboard behavior guidance.
Runtime contract
Required keys:
ESPANSO_FORM_OPERATIONESPANSO_FORM_PROVIDER
Optional provider inputs:
ESPANSO_FORM_FIELD_<name>
Rule:
- layout generator prints only layout text to stdout.
Read first:
Workflow
- Design provider contract and field names.
- Scaffold starter snippets:
python3 scripts/scaffold_dynamic_form.py \
--provider html-trunc \
--fields html_text,max_items \
--operation layout \
--format all- Implement provider logic in your chosen language.
- Wire YAML
layout_generatorargs to contract keys. - Lint YAML contract usage:
python3 scripts/lint_dynamic_form_yaml.py path/to/match-file.yml --strict- Run skill smoke checks:
bash scripts/validate-skill-examples.shOutput and clipboard policy
For low-latency expansions:
- prefer
print_onlywhen replacement payload is already emitted by the script output - if clipboard side effects are needed, do best-effort writes outside the critical path
- do not replace user payload with status text like
Copied to clipboard
Read:
Reference map
- Contract and key naming:
references/dynamic-form-contract.md - Good/bad architecture decisions:
references/patterns-and-antipatterns.md - End-to-end examples:
references/examples.md - Latency behavior:
references/clipboard-latency.md