12 KiB
Agent Skills Repository
Configuration repository for AI Agent Skills, canonical agent definitions, context files, and agent configurations. Deployed via Nix home-manager to ~/.config/opencode/ (or equivalent paths for other tools).
Quick Commands
# Skill validation
./scripts/test-skill.sh --validate # Validate all skills
./scripts/test-skill.sh <skill-name> # Validate specific skill
./scripts/test-skill.sh --run # Test interactively
# Skill creation
python3 skills/skill-creator/scripts/init_skill.py <name> --path skills/
# Verify agent TOML parses
for f in agents/*/agent.toml; do nix eval --impure --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null && echo "OK: $f"; done
Directory Structure
.
├── skills/ # Agent skills (15 modules)
│ └── skill-name/
│ ├── SKILL.md # Required: YAML frontmatter + workflows
│ ├── scripts/ # Executable code (optional)
│ ├── references/ # Domain docs (optional)
│ └── assets/ # Templates/files (optional)
├── rules/ # AI coding rules (languages, concerns, frameworks)
│ ├── languages/ # Python, TypeScript, Nix, Shell
│ ├── concerns/ # Testing, naming, documentation, etc.
│ └── frameworks/ # Framework-specific rules (n8n, etc.)
├── agents/ # Canonical agent definitions (harness-agnostic)
│ ├── SCHEMA.md # Canonical agent.toml schema definition
│ └── <name>/
│ ├── agent.toml # Agent metadata, permissions, references
│ └── system-prompt.md # Agent system prompt (markdown)
├── context/ # User profiles
├── commands/ # Custom commands
└── scripts/ # Repo utilities (test-skill.sh, validate-agents.sh)
Code Conventions
File naming: hyphen-case (skills), snake_case (Python), UPPERCASE/sentence-case (MD)
SKILL.md structure:
---
name: skill-name
description: "Use when: (1) X, (2) Y. Triggers: a, b, c."
compatibility: opencode
---
## Overview (1 line)
## Core Workflows (step-by-step)
## Integration with Other Skills
Python: #!/usr/bin/env python3 + docstrings + emoji feedback (✅/❌)
Bash: #!/usr/bin/env bash + set -euo pipefail
Markdown: YAML frontmatter, ATX headers, - lists, language in code blocks
Anti-Patterns (CRITICAL)
Frontend Design: NEVER use generic AI aesthetics, NEVER converge on common choices
Excalidraw: NEVER use label property (use boundElements + text element pairs instead)
Debugging: NEVER fix just symptom, ALWAYS find root cause first
Excel: ALWAYS respect existing template conventions over guidelines
Structure: NEVER place scripts/docs outside scripts/references/ directories
Testing Patterns
Unique conventions (skill-focused, not CI/CD):
- Manual validation via
test-skill.sh, no automated CI - Tests co-located with source (not separate test directories)
- YAML frontmatter validation = primary quality gate
- Mixed formats: Python unittest, markdown pressure tests, A/B prompt testing
Known deviations:
systematic-debugging/test-*.md- Academic/pressure testing in wrong locationpdf/forms.md,pdf/reference.md- Docs outside references/
Canonical Agent Format
Agent definitions live in agents/<name>/agent.toml + agents/<name>/system-prompt.md.
This is a harness-agnostic format — renderers in m3ta-nixpkgs generate tool-specific configs.
See agents/SCHEMA.md for the full schema definition.
Adding a new agent
- Create
agents/<name>/agent.tomlwith required fields (name,description) and optional fields (mode,permissions, etc.) - Create
agents/<name>/system-prompt.mdwith the agent's system prompt - Verify:
nix eval --impure --expr 'builtins.fromTOML (builtins.readFile ./agents/<name>/agent.toml)' --json - Add the agent to renderers by updating the consuming flake inputs
How renderers work
Renderers live in m3ta-nixpkgs (not this repo). They consume lib.loadAgents and produce:
| Tool | Output | Path |
|---|---|---|
| OpenCode | .opencode/agents/*.md |
~/.config/opencode/agents/ |
| Claude Code | .claude/agents/*.md + settings.json |
~/.claude/ |
| Pi | AGENTS.md + SYSTEM.md |
~/.pi/agent/ |
Project-level usage
# In project flake.nix
m3taLib.agents.shellHookForTool {
inherit pkgs;
agentsInput = inputs.agents;
tool = "opencode";
modelOverrides = { chiron = "anthropic/claude-sonnet-4"; };
};
Deployment
Nix flake pattern:
agents = {
url = "git+https://code.m3ta.dev/m3tam3re/AGENTS";
inputs.nixpkgs.follows = "nixpkgs"; # Optional but recommended
};
Exports:
lib.loadAgents— loads all canonicalagents/*/agent.toml+system-prompt.mdinto an attrsetlib.mkOpencodeSkills— compose custom + external skills.sh skills into one directorylib.agentsJson— backward-compat bridge producing legacy agents.json shape (temporary, will be removed)packages.skills-runtime— composable runtime with all skill dependenciesdevShells.default— dev environment for working with skills
Mapping (via home-manager + m3ta-nixpkgs renderers):
agents/→ rendered per-tool vialib.agents.renderForToolin m3ta-nixpkgsskills/→ composed viamkOpencodeSkills(custom + external merged)context/,commands/→ symlinks- Agent changes via file-based agents: visible on next tool restart (no
home-manager switchneeded for prompt changes)
External Skills (skills.sh)
This repo supports composing skills from external skills.sh repositories
alongside custom skills. External repos follow the Agent Skills
standard (same SKILL.md format).
lib.mkOpencodeSkills parameters:
pkgs(required) — nixpkgs package setcustomSkills(optional) — path to custom skills directory (e.g.,"${inputs.agents}/skills")externalSkills(optional) — list of external sources, each with:src— flake input or path to repo rootskillsDir— subdirectory containing skills (default:"skills")selectSkills— list of skill names to include (default: all)
Collision handling: Custom skills always win. Among externals, earlier entries take priority.
Home-manager example:
inputs = {
agents.url = "git+https://code.m3ta.dev/m3tam3re/AGENTS";
skills-anthropic = { url = "github:anthropics/skills"; flake = false; };
};
xdg.configFile."opencode/skills".source =
inputs.agents.lib.mkOpencodeSkills {
pkgs = nixpkgs.legacyPackages.${system};
customSkills = "${inputs.agents}/skills";
externalSkills = [
{ src = inputs.skills-anthropic; }
];
};
Project flake example (selective):
".agents/skills".source =
inputs.agents.lib.mkOpencodeSkills {
pkgs = nixpkgs.legacyPackages.${system};
externalSkills = [
{ src = inputs.skills-anthropic; selectSkills = [ "mcp-builder" ]; }
];
};
Migration Guide (for the repo owner)
This section documents how to complete the migration from the legacy agents.json + prompts/*.txt format to the canonical agent.toml + system-prompt.md format. The canonical files already exist; what remains is updating the consumer configs and removing legacy files.
Current state
- ✅ All 6 agents exist in canonical format:
agents/{name}/agent.toml+agents/{name}/system-prompt.md - ✅
lib.loadAgentsloads canonical agents from TOML - ✅
lib.agentsJsonbackward-compat bridge produces the old JSON shape from TOML - ⏳ Legacy files still present:
agents/agents.json,prompts/*.txt - ⏳ Consumer (home-manager) still reads
agents.jsondirectly via the oldcoding.opencodemodule
Step 1: Update home-manager config in your NixOS/HM flake
Change from the old coding.opencode agent options to the new coding.agents.opencode module:
# BEFORE (legacy — agents embedded in config.json):
coding.opencode = {
enable = true;
agentsInput = inputs.agents;
externalSkills = [ ... ];
ohMyOpencodeSettings = { ... };
extraSettings = { ... };
};
# AFTER (new — file-based agents from canonical TOML):
coding.opencode = {
enable = true; # handles theme, plugins, formatter, oh-my-opencode
ohMyOpencodeSettings = { ... };
extraSettings = { ... };
};
coding.agents.opencode = {
enable = true;
agentsInput = inputs.agents;
externalSkills = [ ... ];
modelOverrides = {
chiron = "zai-coding-plan/glm-5";
"chiron-forge" = "zai-coding-plan/glm-5";
};
};
Key changes:
agentsInputandexternalSkillsmove fromcoding.opencodetocoding.agents.opencodemodelOverridesis new — per-agent model selection (previously hardcoded in agents.json)- Skills, context, commands are now handled by the agents module
- Agents are deployed as file-based
~/.config/opencode/agents/*.mdinstead of embedded in config.json
Step 2: Run home-manager switch
home-manager switch --flake .
Verify that ~/.config/opencode/agents/ contains 6 .md files with the correct frontmatter.
Step 3: Remove legacy files from AGENTS repo
After confirming everything works with the new setup:
cd /home/m3tam3re/p/AI/AGENTS
# Remove legacy agent definition
rm agents/agents.json
# Remove legacy prompt files (now in agents/*/system-prompt.md)
rm prompts/chiron.txt prompts/chiron-forge.txt prompts/hermes.txt \
prompts/athena.txt prompts/apollo.txt prompts/calliope.txt
rmdir prompts/ # if empty
# Remove backward-compat bridge from flake.nix
# Delete the lib.agentsJson section from flake.nix
After removing lib.agentsJson, update flake.nix to remove the bridge function. The lib.loadAgents and lib.mkOpencodeSkills exports remain.
Step 4: Verify
# AGENTS repo: all TOML files parse
cd /home/m3tam3re/p/AI/AGENTS
for f in agents/*/agent.toml; do
nix eval --impure --expr "builtins.fromTOML (builtins.readFile ./$f)" --json > /dev/null && echo "OK: $f"
done
nix flake check
# nixpkgs: flake check passes
cd /home/m3tam3re/p/NIX/nixpkgs
nix flake check
# Home-manager: agents deployed correctly
ls ~/.config/opencode/agents/
Optional: Enable other tool renderers
To also deploy agents for Claude Code or Pi, add to your home-manager config:
# Claude Code agents
coding.agents.claude-code = {
enable = true;
agentsInput = inputs.agents;
modelOverrides = { };
};
# Pi agents
coding.agents.pi = {
enable = true;
agentsInput = inputs.agents;
};
Rules System
Centralized AI coding rules consumed via mkCodingRules from m3ta-nixpkgs
(mkOpencodeRules still works as backward-compat alias):
# In project flake.nix
m3taLib.coding-rules.mkCodingRules {
inherit agents;
languages = [ "python" "typescript" ];
frameworks = [ "n8n" ];
};
See rules/USAGE.md for full documentation.
Notes for AI Agents
- Config-only repo - No compilation, no build, manual validation only
- Skills are documentation - Write for AI consumption, progressive disclosure
- Consistent structure - All skills follow 4-level deep pattern (skills/name/ + optional subdirs)
- Cross-cutting concerns - Standardized SKILL.md, workflow patterns, delegation rules
- Always push - Session completion workflow: commit + git push
Quality Gates
Before committing:
./scripts/test-skill.sh --validate- Python shebang + docstrings check
- No extraneous files (README.md, CHANGELOG.md in skills/)
- If skill has scripts with external dependencies → verify
flake.nixis updated (see skill-creator Step 4) - Git status clean