2026-04-13 16:53:17 +02:00
# Agent Skills Repository
2026-01-06 05:52:07 +01:00
2026-04-13 16:53:17 +02:00
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).
2026-01-06 05:52:07 +01:00
2026-01-26 20:42:05 +01:00
## Quick Commands
2026-01-06 05:52:07 +01:00
```bash
2026-01-27 20:09:05 +01:00
# Skill validation
2026-01-26 20:42:05 +01:00
./scripts/test-skill.sh --validate # Validate all skills
./scripts/test-skill.sh <skill-name> # Validate specific skill
2026-01-27 20:09:05 +01:00
./scripts/test-skill.sh --run # Test interactively
2026-01-26 20:42:05 +01:00
2026-01-27 20:09:05 +01:00
# Skill creation
python3 skills/skill-creator/scripts/init_skill.py <name> --path skills/
2026-04-13 16:53:17 +02:00
# 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
2026-01-06 05:52:07 +01:00
```
2026-01-26 20:42:05 +01:00
## Directory Structure
2026-01-06 05:52:07 +01:00
2026-01-26 20:42:05 +01:00
```
.
2026-03-03 19:38:48 +01:00
├── skills/ # Agent skills (15 modules)
2026-01-27 20:09:05 +01:00
│ └── skill-name/
│ ├── SKILL.md # Required: YAML frontmatter + workflows
│ ├── scripts/ # Executable code (optional)
│ ├── references/ # Domain docs (optional)
2026-03-03 19:38:48 +01:00
│ └── 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.)
2026-04-13 16:53:17 +02:00
├── 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)
2026-01-27 20:09:05 +01:00
├── context/ # User profiles
├── commands/ # Custom commands
2026-02-10 20:00:42 +01:00
└── scripts/ # Repo utilities (test-skill.sh, validate-agents.sh)
2026-01-26 20:42:05 +01:00
```
2026-01-06 05:52:07 +01:00
2026-01-27 20:09:05 +01:00
## Code Conventions
2026-01-06 05:52:07 +01:00
2026-01-27 20:09:05 +01:00
**File naming**: hyphen-case (skills), snake_case (Python), UPPERCASE/sentence-case (MD)
**SKILL.md structure**:
```yaml
---
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
2026-03-03 19:38:48 +01:00
**Excalidraw**: NEVER use `label` property (use boundElements + text element pairs instead)
2026-01-27 20:09:05 +01:00
**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 location
- `pdf/forms.md` , `pdf/reference.md` - Docs outside references/
2026-04-13 16:53:17 +02:00
## 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
1. Create `agents/<name>/agent.toml` with required fields (`name` , `description` ) and optional fields (`mode` , `permissions` , etc.)
2. Create `agents/<name>/system-prompt.md` with the agent's system prompt
3. Verify: `nix eval --impure --expr 'builtins.fromTOML (builtins.readFile ./agents/<name>/agent.toml)' --json`
4. 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
```nix
# In project flake.nix
m3taLib.agents.shellHookForTool {
inherit pkgs;
agentsInput = inputs.agents;
tool = "opencode";
modelOverrides = { chiron = "anthropic/claude-sonnet-4"; };
};
```
2026-01-27 20:09:05 +01:00
## Deployment
2026-03-03 19:38:48 +01:00
**Nix flake pattern**:
2026-01-06 05:52:07 +01:00
```nix
2026-01-11 13:06:32 +01:00
agents = {
url = "git+https://code.m3ta.dev/m3tam3re/AGENTS";
2026-03-03 19:38:48 +01:00
inputs.nixpkgs.follows = "nixpkgs"; # Optional but recommended
2026-01-06 05:52:07 +01:00
};
```
2026-03-03 19:38:48 +01:00
**Exports:**
2026-04-13 16:53:17 +02:00
- `lib.loadAgents` — loads all canonical `agents/*/agent.toml` + `system-prompt.md` into an attrset
2026-03-27 14:23:55 +01:00
- `lib.mkOpencodeSkills` — compose custom + external [skills.sh ](https://skills.sh ) skills into one directory
2026-04-13 16:53:17 +02:00
- `lib.agentsJson` — backward-compat bridge producing legacy agents.json shape (temporary, will be removed)
2026-03-03 19:38:48 +01:00
- `packages.skills-runtime` — composable runtime with all skill dependencies
2026-04-13 16:53:17 +02:00
- `devShells.default` — dev environment for working with skills
2026-03-03 19:38:48 +01:00
2026-04-13 16:53:17 +02:00
**Mapping** (via home-manager + m3ta-nixpkgs renderers):
- `agents/` → rendered per-tool via `lib.agents.renderForTool` in m3ta-nixpkgs
2026-03-27 14:23:55 +01:00
- `skills/` → composed via `mkOpencodeSkills` (custom + external merged)
2026-04-13 16:53:17 +02:00
- `context/` , `commands/` → symlinks
- Agent changes via file-based agents: visible on next tool restart (no `home-manager switch` needed for prompt changes)
2026-01-06 05:52:07 +01:00
2026-03-27 14:23:55 +01:00
### External Skills (skills.sh)
This repo supports composing skills from external [skills.sh ](https://skills.sh ) repositories
alongside custom skills. External repos follow the [Agent Skills ](https://agentskills.io )
standard (same `SKILL.md` format).
**`lib.mkOpencodeSkills` parameters:**
- `pkgs` (required) — nixpkgs package set
- `customSkills` (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 root
- `skillsDir` — 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:**
```nix
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):**
```nix
".agents/skills".source =
inputs.agents.lib.mkOpencodeSkills {
pkgs = nixpkgs.legacyPackages.${system};
externalSkills = [
{ src = inputs.skills-anthropic; selectSkills = [ "mcp-builder" ]; }
];
};
```
2026-04-13 16:53:17 +02:00
## 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.loadAgents` loads canonical agents from TOML
- ✅ `lib.agentsJson` backward-compat bridge produces the old JSON shape from TOML
- ⏳ Legacy files still present: `agents/agents.json` , `prompts/*.txt`
- ⏳ Consumer (home-manager) still reads `agents.json` directly via the old `coding.opencode` module
### 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:
```nix
# 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:
- `agentsInput` and `externalSkills` move from `coding.opencode` to `coding.agents.opencode`
- `modelOverrides` is 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/*.md` instead of embedded in config.json
### Step 2: Run home-manager switch
```bash
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:
```bash
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
```bash
# 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:
```nix
# Claude Code agents
coding.agents.claude-code = {
enable = true;
agentsInput = inputs.agents;
modelOverrides = { };
};
# Pi agents
coding.agents.pi = {
enable = true;
agentsInput = inputs.agents;
};
```
2026-03-03 19:38:48 +01:00
## Rules System
2026-04-13 16:53:17 +02:00
Centralized AI coding rules consumed via `mkCodingRules` from m3ta-nixpkgs
(`mkOpencodeRules` still works as backward-compat alias):
2026-03-03 19:38:48 +01:00
```nix
# In project flake.nix
2026-04-13 16:53:17 +02:00
m3taLib.coding-rules.mkCodingRules {
2026-03-03 19:38:48 +01:00
inherit agents;
languages = [ "python" "typescript" ];
frameworks = [ "n8n" ];
};
```
See `rules/USAGE.md` for full documentation.
2026-01-27 20:09:05 +01:00
## Notes for AI Agents
1. **Config-only repo ** - No compilation, no build, manual validation only
2. **Skills are documentation ** - Write for AI consumption, progressive disclosure
3. **Consistent structure ** - All skills follow 4-level deep pattern (skills/name/ + optional subdirs)
4. **Cross-cutting concerns ** - Standardized SKILL.md, workflow patterns, delegation rules
2026-03-03 19:38:48 +01:00
5. **Always push ** - Session completion workflow: commit + git push
2026-01-06 05:52:07 +01:00
## Quality Gates
2026-01-26 20:42:05 +01:00
Before committing:
2026-01-27 20:09:05 +01:00
1. `./scripts/test-skill.sh --validate`
2. Python shebang + docstrings check
3. No extraneous files (README.md, CHANGELOG.md in skills/)
2026-03-03 19:38:48 +01:00
4. If skill has scripts with external dependencies → verify `flake.nix` is updated (see skill-creator Step 4)
5. Git status clean