Install
$ agentstack add skill-markusleben-ha-nova-read ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
HA NOVA Read
Scope
Read only:
automation.listautomation.readscript.listscript.readautomation.tracescript.trace
Not for helpers — use ha-nova:helper for helper list/read.
Multi-target scope is inventory-only:
- use
skills/ha-nova/bulk-patterns.mdforprefix/domain/area/label - keep full YAML reads single-target only
No writes.
- MUST NOT issue
POST,PUT,PATCH, orDELETErelay requests. - MUST NOT call service endpoints or any other mutation path learned during the read flow.
- If the task becomes a config change, hand off to
ha-nova:writewith resolved IDs and current config.
Bootstrap (once per session)
Verify relay CLI: ha-nova relay health If this fails: ha-nova setup
Relay Contract
Use file-based relay requests:
- Write final JSON payloads with the client's native file-writing tool. Do not create placeholder templates and patch them later with
perl -0pi,sed -i, or similar rewrites. - Use
ha-nova relay ws --data-file. - Use
ha-nova relay core --method --path --body-filewhen a body is needed. - Use
--jq-filefor non-trivial filters and--outfor large responses.
Flow
Listing automations / scripts
Use the compact entity registry (abbreviated keys: ei=entityid, en=name, ai=areaid):
Create `` with:
{"type":"config/entity_registry/list_for_display"}
Then run:
ha-nova relay ws --data-file --jq-file
Write `` with one of:
[.data.entities[] | select(.ei | startswith("automation.")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:30]
[.data.entities[] | select(.ei | startswith("script.")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:30]
For bulk inventory by prefix, domain, area, or label, reuse skills/ha-nova/bulk-patterns.md and return the compact table only. For area scope, use the search/related area projection rules, not compact-registry ai.
Keyword search
Use short keyword stems and always limit results.
ha-nova relay ws --data-file --jq-file
Write `` with:
[.data.entities[] | select(.ei | startswith("automation.")) | select((.ei + " " + (.en // "")) | test("KEYWORD";"i")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:20]
If 0 results: try synonyms or shorter stems: test("kw1|kw2";"i").
For "automations in room X": stay inside read and follow the area-first search/related flow from skills/ha-nova/bulk-patterns.md.
Reading a single config
Resolve the config key via entity registry first; UI-created items often use numeric unique_id values.
- Resolve
unique_id:
- create `
with{"type":"config/entityregistry/get","entityid":"automation.{slug}"}` - run
ha-nova relay ws --data-file --out - then run
ha-nova relay jq -r --file '.data.unique_id'(POSIX example; on Windows/PowerShell pass the same filter with native argument quoting) - write the final
entity_idvalue directly into `; do not use placeholder tokens such asREPLACEENTITYID` - for scripts: use
script.{slug}
- Fetch config into ``:
ha-nova relay core --method GET --path /api/config/automation/config/{unique_id} --jq-file --out- for scripts:
/api/config/script/config/{unique_id} - prefer copying
skills/ha-nova/config-body-filter.jqto `` - if you must recreate it, write `` with:
``jq if .ok then .data.body else error("relay error: \(.error.message // "unknown")") end ``
- if the contents differ, overwrite the same `` with the canonical line before the first config read; do not create alternate config-filter filenames
- POSIX heredocs shown elsewhere are examples only; on Windows/PowerShell preserve the same jq body with native file writing
- Validate JSON:
ha-nova relay jq --file -e --jq-file- use
type == "object"
- For counts or follow-up transforms, use
ha-nova relay jq --filewithlengthor--jq-file.
Read the saved file with the native file-reading tool. Do not analyze configs from shell output.
Related entities
Find automations/scripts that use a specific entity:
Create `` with:
{"type":"search/related","item_type":"entity","item_id":"{entity_id}"}
Then run:
ha-nova relay ws --data-file
If id is ambiguous, ask one clarifying question. Never use raw get_states.
Output Format
After reading a config, present:
**{Automation|Script}: {alias}**
- **ID:** {id}
- **Entities:** {list all entity_ids used in triggers, conditions, and actions}
- **Triggers:** {short description of each trigger}
- **Conditions:** {short description or "none"}
- **Actions:** {short description of each action, grouped by trigger if applicable}
- **Mode:** {single|restart|queued|parallel}
Then show the full YAML config:
alias: ...
triggers: ...
actions: ...
For list operations, use a compact table:
| Entity ID | Name | Area |
|-----------|------|------|
Never show raw JSON to the user.
Trace Debugging
For trace queries:
- Resolve the
unique_id(config key).item_idrequires theunique_id, NOT the entity_id slug.
Create ` with the config/entity_registry/get request, then run: `text ha-nova relay ws --data-file --out ha-nova relay jq -r --file '.data.unique_id' `` The jq filter quoting above is a POSIX example. On Windows/PowerShell pass the same filter with native argument quoting.
- List recent traces using the resolved
unique_id:
Create ` with: `json {"type":"trace/list","domain":"automation","item_id":"{unique_id}"} ` `text ha-nova relay ws --data-file ` For scripts: "domain":"script"`.
- For a detailed trace, save
trace/getto ``:
Create ` with: `json {"type":"trace/get","domain":"automation","item_id":"{unique_id}","run_id":"{run_id}"} ` `text ha-nova relay ws --data-file --out ha-nova relay jq --file empty `` Read the file with your native file-reading tool.
- Summarize timestamp, trigger, conditions, actions, and result.
- If traces do not cover the relevant period, optionally check
last_changedvia/api/states/{entity_id}. - Before presenting conclusions, verify
item_idin trace data matches the target'sunique_id. seeskills/ha-nova/SKILL.md→ Claim-Evidence Binding.
Latency Policy
- no agent dispatch for simple reads
- no proactive
/healthpreflight - no exploratory retry loops without concrete failure
Safety
- never guess ids
- if multiple close matches, ask one selection question
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: markusleben
- Source: markusleben/ha-nova
- License: MIT
- Homepage: https://github.com/markusleben/ha-nova
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.