agentleFS
autonomous-aiautonomous-ai/lampOS/skills/music/SKILL.md

music

Skill535 starsChanged 7 months agoApache-2.0View on GitHub

Play and stop music from YouTube through the device's speaker on user request.

We split this skill into the rules it gives an agent

8 rules. 0 are common, 3 are distinctive, and 5 are very specific to this project.

  • 0

    Common

    Most of the 10 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If music_patterns exists and current hour is within peak_hour ± 1 → use preferred_genre to pick a song, no need to ask.

    line 19
  2. Very specific:

    Do NOT use track, artist, title, song — those return 422.

    line 35
  3. Distinctive:

    The marker is passive text, NOT a command to run: Write it directly in your reply and stop — the OS runs it for you.

    line 73
  4. Very specific:

    Never put [HW:...] inside echo, exec, bash, printf, or any tool argument.

    line 84
  5. Distinctive:

    No results → tell user and suggest a different query.

    line 90
  6. Very specific:

    Emotion marker is mandatory: after every /audio/play.

    line 94
  7. Very specific:

    Don't recite lyrics or "sing" via TTS — call /audio/play and let real music play.

    line 96
  8. Distinctive:

    If user specifies genre or mood (*"play something relaxing"*), pick a well-known song — no need to ask further.

    line 98

“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Music

Play music through the device's speaker by searching YouTube. Use this when the user asks to play, sing, or listen to music.

Spoken output: Everything outside HW markers in your reply is read aloud. For a play/stop request, start with the HW markers, then give one short confirmation and end the reply. Keep song-selection reasoning, transcript interpretation, and speaker attribution in the provider's native thinking channel (omit analysis if unavailable), without a text summary before/after tools or in the final answer; do not add a preamble, a draft confirmation, or a second confirmation.

Workflow

  1. Specific song / artist → play directly. When [voice-instruction] is present, use that request; a conflicting noisy [transcript] does not replace the song title. No habit or identity lookup is needed. Use a known speaker for person; otherwise omit the field silently.
  2. Vague request ("play music", "sing something") → check habit patterns first:
    cat /root/local/users/{name}/habit/patterns.json 2>/dev/null
    If music_patterns exists and current hour is within peak_hour ± 1 → use preferred_genre to pick a song, no need to ask. Otherwise → ask: "What are you in the mood for?". The file is bootstrapped lazily by wellbeing on its first threshold nudge; do not invoke habit Flow A from here.
  3. Reply format:
    [HW:/audio/play:{"query":"Bohemian Rhapsody Queen","person":"{name}"}][HW:/emotion:{"emotion":"excited","intensity":0.8}] Playing Bohemian Rhapsody!
    {name} is the speaker identified in the injected context. If nobody is identified, drop the field entirely — [HW:/audio/play:{"query":"Bohemian Rhapsody Queen"}]. Never invent a name or reuse one from an example.
  4. Stop: [HW:/audio/stop:{}] Music stopped.

API schema (/audio/play)

FieldRequiredDescription
queryYESYouTube search string (include artist for better match)
personnoThe identified speaker's label, lowercase ({name} from the injected context) — omit the field when nobody is identified. Unmatched names are logged under the shared unknown bucket, so a made-up name buys nothing.

Do NOT use track, artist, title, song — those return 422.

Genre → Emotion (pair with every /audio/play)

Genre keywordsEmotion
jazz, blues, soul, funk, swinghappy
classical, orchestra, piano, violincurious
hip hop, rap, trap, r&b, rock, metalexcited
anything elsehappy

Examples

InputOutput
"Play Bohemian Rhapsody"[HW:/audio/play:{"query":"Bohemian Rhapsody Queen","person":"{name}"}][HW:/emotion:{"emotion":"excited","intensity":0.8}] Playing Bohemian Rhapsody!
"Sing me a song"[HW:/emotion:{"emotion":"curious","intensity":0.6}] What kind of vibe — chill, upbeat, or something specific?
"Something chill"[HW:/audio/play:{"query":"chill acoustic playlist","person":"{name}"}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Here's some chill vibes!
"Something chill" (no identified speaker)[HW:/audio/play:{"query":"chill acoustic playlist"}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Here's some chill vibes!
"Stop the music"[HW:/audio/stop:{}] Music stopped.

Delegated request with an unknown speaker and noisy transcript:

Input:

[voice-instruction] Play Eternal Flame
[transcript] Uh, my favorite song, uh, Ethan of Lamb.

Reply:

[HW:/audio/play:{"query":"Eternal Flame The Bangles"}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Playing Eternal Flame by The Bangles.

How HW markers work

The Go server intercepts [HW:/audio/play:...] / [HW:/audio/stop:...] in your reply text and forwards to HAL. This is the ONLY way to play music — never use exec, mpv, vlc, yt-dlp, or curl /audio/play.

The marker is passive text, NOT a command to run. Write it directly in your reply and stop — the OS runs it for you. Do NOT try to "execute" or "invoke" it.

  • ❌ WRONG — echoing/wrapping the marker in a shell tool. echo only prints to stdout inside your sandbox; the OS never sees it, so no music plays:
    echo '[HW:/audio/play:{"query":"Gymnopedie No 1 Satie"}]'
  • ✅ RIGHT — the marker IS your reply text (no tool call at all):
    [HW:/audio/play:{"query":"Gymnopedie No 1 Satie"}][HW:/emotion:{"emotion":"curious","intensity":0.6}] Here's some Satie. 🎹

Never put [HW:...] inside echo, exec, bash, printf, or any tool argument. If you find yourself reaching for a tool to play music, stop — just emit the marker as text.

Error handling

  • 503 → "Music playback is not available right now."
  • 409 → music already playing; stop first, then play new song.
  • No results → tell user and suggest a different query.

Rules

  • Emotion marker is mandatory after every /audio/play.
  • person MUST be lowercase.
  • Don't recite lyrics or "sing" via TTS — call /audio/play and let real music play.
  • Volume control belongs to the Audio skill, not this one.
  • If user specifies genre or mood ("play something relaxing"), pick a well-known song — no need to ask further.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.