Skill: sirkovz/audio-command-executor (version 1.0.1)

--- name: audio-command-executor description: Processes inbound audio files, transcribes them, and answers to resulting texts. Converts non-WAV inputs to WAV before transcription. version: 1.0.3 author: Marvin (via skill-creator) --- Body Trigger - Inbound Audiodateien, die im Verzeichnis /home/sirko/.openclaw/media/inbound/ landen (z. B. .ogg, .mp3, etc.) Input - Eingabe: Pfad zur Audiodatei (z. B. /home/sirko/.openclaw/media/inbound/aufnahme.ogg) Workflow 1) Normalize Format - Wenn Input nicht .wav ist, konvertiere zu WAV: /usr/bin/ffmpeg -i {input_file} -ar 16000 -ac 1 -c:a pcm_s16le {input_file}.wav Hinweis: Die Zieldatei heißt input_file.wav (Beispiel: /.../aufnahme.ogg → /.../aufnahme.wav) 2) Transkription - Transkribiere die WAV-Datei: /home/sirko/.openclaw/workspace/whisper.cpp/build/bin/whisper-cli -l DE -np -m /home/sirko/.openclaw/workspace/whisper.cpp/models/ggml-small.bin -f {input_wav_file} - Fange die Transkription als Text ab (stdout) 3) Ausführung - aus dem transkribierten Text entstandene Fragen oder Anweisungen einfach so in deutsch beantworten, als wäre es ein normaler Text, eingegeben über den Chat Output - Einfach den Text verarbeiten, als wäre er als Text-DM eingegangen - Bei Fehlern: klare Fehlermeldung mit Ursachen (z. B. Datei nicht gefunden, Transkript leer, Ausführung fehlschlägt) Beispiel-Ablauf - inbound/file.ogg → convert → /tmp/file.wav → whisper → "Was ist die Hauptstadt von Frankreich" → ermittele Antwort und zeige sie Notes - immer auf deutsch antworten Tests/Testszenarien - Test mit file.ogg (4 Sekunden) → Transkription prüfen - Test mit bereits WAV-Datei → direkte Transkription - Test mit fehlerhafter Datei → ordentliche Fehlermeldung

path: scripts/package_skill.py
content: #!/usr/bin/env python3
"""
Simple skill packaging script.
Creates a .skill file (ZIP) from the skill directory.
"""

import os
import sys
import zipfile
from pathlib import Path

def package_skill(skill_path, output_dir=None):
    """Package a skill directory into a .skill file."""
    
    skill_path = Path(skill_path)
    
    if not skill_path.exists():
        print(f"Error: Skill directory '{skill_path}' not found")
        sys.exit(1)
    
    if not (skill_path / "SKILL.md").exists():
        print(f"Error: SKILL.md not found in '{skill_path}'")
        sys.exit(1)
    
    # Check for symlinks (security)
    for root, dirs, files in os.walk(skill_path):
        for f in files:
            filepath = Path(root) / f
            if filepath.is_symlink():
                print(f"Error: Symlinks are not allowed. Found: {filepath}")
                sys.exit(1)
    
    # Determine output directory
    if output_dir is None:
        output_dir = skill_path.parent / "dist"
    else:
        output_dir = Path(output_dir)
    
    output_dir.mkdir(parents=True, exist_ok=True)
    
    # Create .skill file
    skill_name = skill_path.name
    skill_file = output_dir / f"{skill_name}.skill"
    
    print(f"Packaging skill: {skill_name}")
    print(f"Output: {skill_file}")
    
    with zipfile.ZipFile(skill_file, 'w', zipfile.ZIP_DEFLATED) as zf:
        for filepath in skill_path.rglob('*'):
            if filepath.is_file():
                # Store with relative path from skill directory
                arcname = filepath.relative_to(skill_path)
                zf.write(filepath, arcname)
                print(f"  Added: {arcname}")
    
    print(f"\n✅ Skill packaged successfully: {skill_file}")
    return skill_file

if __name__ == "__main__":
    # Default: package current directory
    skill_path = "."
    output_dir = None
    
    # Parse arguments
    if len(sys.argv) > 1:
        skill_path = sys.argv[1]
    if len(sys.argv) > 2:
        output_dir = sys.argv[2]
    
    package_skill(skill_path, output_dir)


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)