feat(lib): add agents.nix with loadCanonical and renderer stubs

This commit is contained in:
m3tm3re
2026-04-10 16:47:55 +02:00
parent 1a9a60b0db
commit 8dfe6a8356
2 changed files with 85 additions and 0 deletions

82
lib/agents.nix Normal file
View File

@@ -0,0 +1,82 @@
# Harness-agnostic agent management utilities
#
# This module provides functions to load canonical agent definitions and
# render them for different AI coding tools (OpenCode, Claude Code, Pi).
#
# Usage in your configuration:
#
# # In your flake or configuration:
# let
# m3taLib = inputs.m3ta-nixpkgs.lib.${system};
#
# # Load canonical agents from the AGENTS flake input
# canonical = m3taLib.agents.loadCanonical { agentsInput = inputs.agents; };
#
# # Render for a specific tool
# agentFiles = m3taLib.agents.renderForTool {
# inherit pkgs;
# agentsInput = inputs.agents;
# tool = "opencode";
# };
# in { ... }
#
# Renderers are stubs for now (Tasks 9-11 will provide real implementations).
{lib}: let
agentsLib = {
# Load canonical agent definitions from the AGENTS flake input.
# agentsInput: the AGENTS flake (e.g., inputs.agents in a consuming flake)
# Returns the canonical attrset from lib.loadAgents (keyed by slug).
loadCanonical = {agentsInput}: agentsInput.lib.loadAgents;
# Stub: OpenCode renderer — produces .opencode/agents/*.md files.
# To be implemented in Task 9.
renderForOpencode = {
pkgs,
canonical,
modelOverrides ? {},
}:
pkgs.runCommand "opencode-agents" {} "echo stub > $out";
# Stub: Claude Code renderer — produces .claude/agents/*.md files.
# To be implemented in Task 10.
renderForClaudeCode = {
pkgs,
canonical,
modelOverrides ? {},
}:
pkgs.runCommand "claude-code-agents" {} "echo stub > $out";
# Stub: Pi renderer — produces AGENTS.md + SYSTEM.md.
# To be implemented in Task 11.
renderForPi = {
pkgs,
canonical,
}:
pkgs.runCommand "pi-agents" {} "echo stub > $out";
# Dispatch renderer by tool name.
# tool: "opencode" | "claude-code" | "pi"
renderForTool = {
pkgs,
agentsInput,
tool,
modelOverrides ? {},
}: let
canonical = agentsInput.lib.loadAgents;
in
if tool == "opencode"
then
agentsLib.renderForOpencode {
inherit pkgs canonical modelOverrides;
}
else if tool == "claude-code"
then
agentsLib.renderForClaudeCode {
inherit pkgs canonical modelOverrides;
}
else if tool == "pi"
then agentsLib.renderForPi {inherit pkgs canonical;}
else throw "lib.agents.renderForTool: unknown tool '${tool}'. Must be opencode, claude-code, or pi.";
};
in
agentsLib

View File

@@ -9,4 +9,7 @@
# OpenCode rules injection utilities
opencode-rules = import ./opencode-rules.nix {inherit lib;};
# Agent configuration management utilities
agents = import ./agents.nix {inherit lib;};
}