add pydantic-ai-skills + first skill (publish-blog)
introduces agentskills.io-format skills as a progressive-disclosure layer
between the personality file and tool docstrings. skills sit in a
bot/skills/ directory; each skill is a SKILL.md with YAML frontmatter
(name + description) and a markdown body. the preamble (skill names +
descriptions) goes into the system prompt automatically via
SkillsToolset on pydantic-ai>=1.74 — we're on 1.84. the full body only
loads when the agent calls load_skill(name).
this is the right layer for workflow-level guidance that previously had
nowhere to live:
- tool docstrings: mechanical per-tool ("what this call does")
- personality file: voice + disposition
- skill description: trigger ("when to reach for this")
- skill body: procedure ("how to do this well")
first skill: publish-blog. description does the activation gating; body
covers structure patterns that have actually worked, link-back
discipline, voice convention (caps in long-form), and gotchas (verify
any AT-URI via pdsx.get_record before citing; tag with specific topics,
not meta-categories).
changes:
- pyproject: added pydantic-ai-skills dependency
- config.Settings: added skills_dir (defaults to "skills", matching the
personality_file convention)
- agent.PhiAgent: constructs SkillsToolset once from settings.skills_dir
and passes it via Agent(toolsets=[...]). MCP toolsets still go per
agent.run() to work around the cancel-scope bug.
- Dockerfile: copies skills/ into the runtime image alongside
personalities/
ruff clean, 102 tests pass.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>