skills: pi_wake_agent skill definition (YAML + JSON)

- pi_wake_agent.skill.yaml: Full skill definition with all capabilities, parameters, examples, error handling, testing
- pi_wake_agent.skill.json: OpenAI function calling compatible schema
This commit is contained in:
Codex
2026-07-08 16:15:59 +02:00
parent 722ead5384
commit 5607bfcc2c
2 changed files with 293 additions and 0 deletions

242
pi_wake_agent.skill.yaml Normal file
View File

@@ -0,0 +1,242 @@
# pi_wake_agent Skill Definition
# Universal Agent Skill Format (YAML)
# Compatible with: Anthropic, LangChain, OpenAI Functions, Custom Agents
skill:
name: "pi_wake_agent"
version: "1.1.0"
description: |
Multi-agent wake-up timer with self-cron/daemon/succession modes.
Sends doorbell injections via zellij and durable messages via h5i bus.
Designed for the DOLPHIN fleet (pi_nvnemo, cmd, mimo, codex, etc.).
author: "pi_nvnemo"
repository: "https://github.com/dolphinng5/pi_wake_agent"
branch: "tools/pi_wake_agent"
license: "MIT"
# ─── Installation ─────────────────────────────────────────────────────
installation:
method: "script"
path: "/mnt/dolphinng5_predict/pi_wake_agent.py"
requirements:
- python >= 3.8
- zellij (for terminal injections)
- h5i (for bus messaging, optional)
test_command: "python3 -m pytest test_pi_wake_agent.py -v"
# ─── Capabilities ─────────────────────────────────────────────────────
capabilities:
- name: "install_cron"
description: "Install recurring wake-up timer via system cron"
modes: ["install"]
- name: "once"
description: "One-shot wake after interval (no cron)"
modes: ["once"]
- name: "daemon"
description: "Long-lived process, no cron needed"
modes: ["daemon"]
- name: "succession"
description: "Run N times at interval, then self-clean (remove cron)"
modes: ["succession"]
- name: "run_wake"
description: "Internal: execute wake action (called by cron)"
modes: ["run"]
- name: "remove_cron"
description: "Remove cron timer entry"
modes: ["remove"]
- name: "list_cron"
description: "List active cron timers"
modes: ["list"]
- name: "status"
description: "Show cron + one-shot timer status"
modes: ["status"]
- name: "validate_sessions"
description: "Validate zellij sessions exist"
modes: ["validate"]
# ─── Parameters ───────────────────────────────────────────────────────
parameters:
mode:
type: "string"
enum: ["install", "once", "daemon", "succession", "run", "run", "remove", "list", "status", "validate"]
required: true
default: "install"
description: "Operation mode"
interval:
type: "string"
pattern: "^\\d+[hms]$"
default: "1h"
description: "Interval duration. Formats: 30m, 1h, 90m, 2h, 10s"
examples: ["1h", "30m", "90m", "2h", "10s"]
session:
type: "array"
items:
type: "string"
description: "Zellij session name(s). Repeatable flag."
examples: [["cc_UV_dev0_Fb"], ["cc_UV_dev0_Fb", "cc_UV_dev1_48"]]
sessions:
type: "string"
description: "Comma-separated list of sessions (alternative to --session)"
examples: ["cc_UV_dev0_Fb,cc_UV_dev1_48"]
message:
type: "string"
default: "Operator says CONTINUE. pi_nvnemo here, saying hi!"
description: "Wake message sent to agent(s)"
count:
type: "integer"
minimum: 1
default: 1
description: "Number of runs for succession mode"
dry_run:
type: "boolean"
default: false
description: "Show what would be done without executing"
debug:
type: "boolean"
default: false
description: "Enable debug logging"
json:
type: "boolean"
default: false
description: "Output JSON for machine parsing"
config:
type: "string"
description: "Path to config file (JSON/YAML)"
# ─── Returns ──────────────────────────────────────────────────────────
returns:
type: "object"
properties:
exit_code:
type: "integer"
description: "0 = success, non-zero = error"
cron_entry:
type: "string"
description: "Installed cron line (for install mode)"
log_file:
type: "string"
value: "/tmp/pi_wake_agent.log"
message_sent:
type: "boolean"
description: "Whether wake message was sent"
# ─── Side Effects ─────────────────────────────────────────────────────
side_effects:
- "Modifies system crontab (install/remove modes)"
- "Injects text into zellij sessions (zellij write-chars)"
- "Sends h5i bus message to Fable (fire-and-forget)"
- "Writes to /tmp/pi_wake_agent.log (rotated at 10MB)"
- "Creates PID files in /tmp/pi_wake_agent_*.pid (once mode)"
# ─── h5i Bus Protocol ─────────────────────────────────────────────────
bus_protocol:
agent_id: "pi_nvnemo"
target: "Fable"
message_format: "[pi_nvnemo via zellij] {message} Run: h5i-bus msg inbox"
keypresses: 5
keypress_delay_ms: 1000
bus_message: "{message} (timer wakeup)"
timeout_ms: 5000
fire_and_forget: true
silently_ignore_failures: true
# ─── Zellij Integration ───────────────────────────────────────────────
zellij:
command_check: "zellij list-sessions"
injection_method: "zellij --session {session} action write-chars"
enter_keypress: "zellij --session {session} action write 13"
ansi_strip: true
session_exists_check: true
# ─── Cron Format ──────────────────────────────────────────────────────
cron:
comment_format: "pi_wake_agent:{sessions}:{interval}"
session_delimiter: ","
command_template: "cd /mnt/dolphinng5_predict && export H5I_AGENT=pi_nvnemo && /mnt/dolphinng5_predict/pi_wake_agent.py --run --sessions '{sessions}' --msg '{message}'"
# ─── Logging ──────────────────────────────────────────────────────────
logging:
file: "/tmp/pi_wake_agent.log"
rotation_mb: 10
max_files: 5
format: "[YYYY-MM-DD HH:MM:SS] [LEVEL] message"
levels: ["DEBUG", "INFO", "WARN", "ERROR"]
# ─── Examples ─────────────────────────────────────────────────────────
examples:
- name: "Recurring 1-hour wake for one session"
command: "pi_wake_agent.py --install --interval 1h --session cc_UV_dev0_Fb"
- name: "Multi-session 30-minute wake"
command: 'pi_wake_agent.py --install --interval 30m --sessions "cc_UV_dev0_Fb,cc_UV_dev1_48" --msg "Wake up!"'
- name: "One-shot in 2 hours"
command: 'pi_wake_agent.py --once --interval 2h --session cc_UV_dev0_Fb --msg "Time\'s up!"'
- name: "Run 3 times at 1-hour intervals, then self-clean"
command: 'pi_wake_agent.py --succession --count 3 --interval 1h --session cc_UV_dev0_Fb --msg "Scheduled wake"'
- name: "Daemon mode (long-lived process, no cron)"
command: 'pi_wake_agent.py --daemon --interval 1h --session cc_UV_dev0_Fb'
- name: "Remove timer"
command: 'pi_wake_agent.py --remove --session cc_UV_dev0_Fb --interval 1h'
- name: "List / status"
command: "pi_wake_agent.py --list"
command: "pi_wake_agent.py --status"
- name: "Validate sessions exist"
command: 'pi_wake_agent.py --validate --session cc_UV_dev0_Fb'
- name: "Dry run (show what would happen)"
command: 'pi_wake_agent.py --install --interval 1h --session test --msg "test" --dry-run'
# ─── Error Handling ───────────────────────────────────────────────────
error_handling:
- condition: "missing_session"
action: "return_error"
message: "--session or --sessions required"
exit_code: 1
- condition: "invalid_interval"
action: "return_error"
message: "Invalid interval format. Use like 1h, 30m, 90m, 2h"
exit_code: 1
- condition: "invalid_count"
action: "return_error"
message: "--count must be >= 1 for succession mode"
exit_code: 1
- condition: "cron_failure"
action: "log_warning_continue"
description: "Cron install/remove logs warning but continues"
- condition: "zellij_not_found"
action: "log_warning_continue"
description: "Session injection fails silently, bus message still sent"
- condition: "h5i_timeout"
action: "silent_ignore"
description: "h5i bus message failures are silently ignored (fire-and-forget)"
# ─── Testing ──────────────────────────────────────────────────────────
testing:
test_file: "test_pi_wake_agent.py"
test_count: 38
coverage:
- unit_interval_parsing
- unit_cron_comments
- unit_session_parsing
- integration_install_remove_list
- integration_once_short
- integration_succession_short
- edge_cases_invalid_intervals
- edge_cases_missing_sessions
- edge_cases_invalid_counts
run_command: "python3 -m pytest test_pi_wake_agent.py -v"
# ─── Metadata ─────────────────────────────────────────────────────────
metadata:
created: "2026-07-08"
updated: "2026-07-08"
maintainer: "pi_nvnemo"
tags: ["wake-timer", "cron", "zellij", "h5i", "multi-agent", "doorbell", "self-cleaning"]