buddymon/skills/buddymon/SKILL.md
pyr0ball 99ebfbfac4 feat: language mascot system + script-first architecture (v0.2.0)
Language mascots:
- 11 mascots across common/uncommon/rare/legendary tiers (Pythia, Asynclet,
  Bashling, Goroutling, Typeling, Vueling, Querion, Ferrix, Perlius,
  Cobolithon, Lispling)
- Full evolution chains for all mascots (16 evolutions total in catalog)
- Spawn via PostToolUse after language affinity milestones; probability
  scales with affinity level; only fires with no active encounter
- Passive strength reduction: each Write/Edit in the mascot's language
  ticks current_strength down (floor 5%, triggers re-announcement)
- Mascot-aware catch formula: base_rate + affinity_bonus (6% per level) +
  weakness_bonus + soft element gating via existing player_elements
- Language-themed weakening menu and catch failure messages in CLI
- Caught mascots stored as type="caught_language_mascot"; assignable as buddy
- UserPromptSubmit uses distinct 🦎 announcement with language context

Roster display:
- New "Language Mascots" section between core buddymon and caught bug monsters
- Language affinity table marks languages with spawnable mascots (🦎)
- Discovery counter now tracks both bug monsters and mascots separately

Veritarch (third evolution):
- Debuglin → Verifex (Lv.100) → Veritarch (Lv.200)
- TYPE FORTRESS / INVARIANT PROOF / ZERO FLAKE challenges
- xp_multiplier 1.7, catch_rate 0.90

Script-first architecture:
- All game logic extracted to lib/cli.py (~850 lines); SKILL.md is now
  a ~55-line relay — 88% token reduction per invocation
- CLI emits [INPUT_NEEDED] and [HAIKU_NEEDED] markers for interactive flows
- PostToolUse hook re-emits CLI stdout as additionalContext for inline display

Session XP fix:
- statusline.sh and session state now read from sessions/<pgrp>.json
  (per-window) with fallback to active.json; fixes stale XP in statusline
2026-04-10 01:31:51 -07:00

2.5 KiB

name description argument-hint allowed-tools
buddymon Buddymon companion game — status, roster, encounters, and session management
start|assign <name>|fight|catch|roster|evolve|statusline|help
Bash
Agent

/buddymon

Run the CLI:

python3 ~/.claude/buddymon/cli.py $ARGUMENTS

The PostToolUse hook automatically surfaces the output as an inline system-reminder — no need to echo it yourself. After running, respond with one short line of acknowledgement at most (e.g. "Done." or nothing). Do not repeat the output.


Interactive Markers

[INPUT_NEEDED: <prompt>]

Ask the user the exact prompt. Then re-run with their answer appended:

  • fight + user says "yes" → python3 ~/.claude/buddymon/cli.py fight --confirmed
  • evolve + user says "y" → python3 ~/.claude/buddymon/cli.py evolve --confirm
  • start + user says "2" → python3 ~/.claude/buddymon/cli.py start 2
  • assign <name> + user says "accept" → python3 ~/.claude/buddymon/cli.py assign <name> --accept
  • assign <name> + user says "reroll" → python3 ~/.claude/buddymon/cli.py assign <name> --reroll
  • statusline + user says "y" → delete existing statusLine key from settings.json, re-run statusline
  • catch + user gives weakening input → see catch flow below

[HAIKU_NEEDED: <json>]

Spawn a Haiku subagent to parse ambiguous natural language. Pass the JSON task as the prompt, get a single-line response, then re-run the CLI with the result.

Example — fuzzy match resolution:

Agent(model="haiku", prompt=<json>.instruction + "\n\nRespond with ONLY the matching name.")
→ re-run: python3 ~/.claude/buddymon/cli.py assign <haiku_result> --resolved <haiku_result>

Catch Flow

When [INPUT_NEEDED] fires during catch, the user describes which weakening actions they've done.

If input is numeric (e.g. "1 3"): calculate inline — 1→-20, 2→-20, 3→-10. Sum reductions. Re-run:

python3 ~/.claude/buddymon/cli.py catch --strength <100 - total_reduction>

If input is natural language (e.g. "wrote a failing test and documented it"): spawn Haiku:

Agent(model="haiku", prompt="""
The user described their catch weakening actions: "<user input>"
Actions available: 1=failing_test (-20%), 2=isolation (-20%), 3=comment (-10%)
Reply with ONLY valid JSON: {"actions": [<numbers>], "reduction": <total_percent>}
""")

Parse Haiku's JSON → compute remaining strength → re-run:

python3 ~/.claude/buddymon/cli.py catch --strength <100 - reduction>