- Transform tufte-press from reference guide to conversation-aware generator - Add JSON generation from conversation context following strict schema - Create build automation scripts with Nix environment handling - Integrate CUPS printing with duplex support - Add comprehensive workflow documentation Scripts added: - skills/tufte-press/scripts/generate-and-build.sh (242 lines) - skills/tufte-press/scripts/build-card.sh (23 lines) Documentation: - Updated SKILL.md with complete workflow instructions (370 lines) - Updated README.md with usage examples (340 lines) - Created SKILL-DEVELOPMENT-STRATEGY-tufte-press.md (450 lines) - Added worklog: 2025-11-10-tufte-press-skill-evolution.org Features: - Agent generates valid JSON from conversation - Schema validation before build (catches errors early) - Automatic Nix shell entry for dependencies - PDF build via tufte-press toolchain - Optional print with duplex support - Self-contained margin notes enforced - Complete end-to-end testing Workflow: Conversation → JSON → Validate → Build → Print Related: niri-window-capture, screenshot-latest, worklog skills
9.5 KiB
Using the AI Skills Nix Flake
This repository provides a Nix flake that makes it easy to deploy AI agent skills to Claude Code and OpenCode in other repositories.
Quick Start
In Your Flake-Based Repository
Add the skills flake as an input:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
ai-skills.url = "path:/home/dan/proj/skills"; # Or use git URL when published
# Or: ai-skills.url = "github:yourusername/skills";
};
outputs = { self, nixpkgs, ai-skills, ... }: {
homeConfigurations.youruser = home-manager.lib.homeManagerConfiguration {
# ... your config ...
modules = [
ai-skills.homeManagerModules.ai-skills
{
services.ai-skills = {
enable = true;
skillsPath = "${ai-skills}/skills"; # Use flake's skills
skills = [
"worklog"
"screenshot-latest"
# "niri-window-capture" # Optional
];
enableClaudeCode = true;
enableOpenCode = true;
installOpencodePlugin = true;
};
}
];
};
};
}
Using Local Skills Path
If you've cloned the skills repo locally:
{
services.ai-skills = {
enable = true;
skillsPath = /home/dan/proj/skills/skills; # Point to local path
skills = [ "worklog" "screenshot-latest" ];
};
}
Using Individual Skill Packages
You can also use the packaged skills directly:
{
inputs.ai-skills.url = "path:/home/dan/proj/skills";
outputs = { ai-skills, ... }: {
homeConfigurations.youruser = {
home.file.".claude/skills/worklog" = {
source = "${ai-skills.packages.x86_64-linux.worklog}";
recursive = true;
};
};
};
}
Module Options
services.ai-skills.enable
Type: bool
Default: false
Enable AI skills deployment.
services.ai-skills.skills
Type: list of strings
Default: []
List of skills to deploy.
Available skills:
niri-window-capture- Invisibly capture window screenshots (security-sensitive)screenshot-latest- Find latest screenshotstufte-press- Generate study card JSONworklog- Create org-mode worklogsupdate-spec-kit- Update spec-kit ecosystem
services.ai-skills.skillsPath
Type: path
Required: yes
Path to the skills directory (e.g., ${ai-skills}/skills or /home/user/proj/skills/skills).
services.ai-skills.enableClaudeCode
Type: bool
Default: true
Deploy skills to ~/.claude/skills/.
services.ai-skills.enableOpenCode
Type: bool
Default: true
Deploy skills to ~/.config/opencode/skills/.
services.ai-skills.installOpencodePlugin
Type: bool
Default: true
Automatically install the opencode-skills npm plugin and configure it.
Complete Example
# flake.nix in your dotfiles repo
{
description = "My system configuration";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
home-manager.url = "github:nix-community/home-manager";
ai-skills.url = "github:yourusername/skills";
};
outputs = { self, nixpkgs, home-manager, ai-skills }: {
homeConfigurations.dan = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs { system = "x86_64-linux"; };
modules = [
# Import the ai-skills module
ai-skills.homeManagerModules.ai-skills
# Your home configuration
{
home.username = "dan";
home.homeDirectory = "/home/dan";
# Enable and configure AI skills
services.ai-skills = {
enable = true;
skillsPath = "${ai-skills}/skills";
skills = [
"worklog" # Org-mode worklogs
"screenshot-latest" # Find latest screenshots
"tufte-press" # Generate study cards
# "niri-window-capture" # Uncomment if using niri
];
enableClaudeCode = true;
enableOpenCode = true;
installOpencodePlugin = true;
};
# Optional: Configure OpenCode with additional settings
home.file.".config/opencode/config.json".text = builtins.toJSON {
plugin = [ "opencode-skills" ];
# ... other OpenCode config ...
};
}
];
};
};
}
Development Workflow
Testing Local Changes
When developing new skills:
-
Work in the skills repo:
cd ~/proj/skills # Create/edit skills in skills/your-skill/ -
Point your config at local path:
services.ai-skills = { skillsPath = /home/dan/proj/skills/skills; # Local path skills = [ "your-skill" ]; }; -
Rebuild:
home-manager switch --flake .#youruser # or sudo nixos-rebuild switch --flake .#yourhostname -
Restart agents to load new skills:
- OpenCode: Exit and restart
- Claude Code: Restart application
Publishing Skills
When ready to share:
-
Push to git:
cd ~/proj/skills git add . git commit -m "Add new skill" git push -
Update flake input in consuming repo:
inputs.ai-skills.url = "github:yourusername/skills/main"; -
Update flake lock:
nix flake update ai-skills
Flake Outputs
The skills flake provides:
homeManagerModules.ai-skills
Home Manager module for deploying skills.
packages.<system>.<skill-name>
Individual packaged skills:
packages.x86_64-linux.worklogpackages.x86_64-linux.screenshot-latestpackages.x86_64-linux.niri-window-capture- etc.
packages.<system>.all-skills
Combined package with all skills.
lib.availableSkills
List of available skill names.
lib.getSkillPath
Helper function: getSkillPath "worklog" → ./skills/worklog
devShells.default
Development shell for working on skills.
OpenCode Plugin Installation
The module automatically:
- Creates
~/.config/opencode/package.jsonwithopencode-skillsdependency - Runs
bun installornpm installto fetch the plugin - Verifies the plugin is listed in
config.json
If automatic installation fails, manually install:
cd ~/.config/opencode
bun add opencode-skills
# or
npm install opencode-skills
Then ensure config.json includes:
{
"plugin": ["opencode-skills"]
}
Troubleshooting
Skills not appearing in OpenCode
-
Check plugin is installed:
ls ~/.config/opencode/node_modules/opencode-skills -
Verify config:
jq '.plugin' ~/.config/opencode/config.json # Should output: ["opencode-skills"] -
Check skills are deployed:
ls -la ~/.config/opencode/skills/ -
Restart OpenCode completely (exit and reopen)
Skills not appearing in Claude Code
-
Check deployment:
ls -la ~/.claude/skills/ -
Verify SKILL.md exists:
cat ~/.claude/skills/worklog/SKILL.md -
Restart Claude Code application
Module evaluation errors
If you get Nix evaluation errors:
-
Check skillsPath is valid:
skillsPath = "${ai-skills}/skills"; # Good # NOT: skillsPath = ai-skills; # Wrong -
Verify flake input is correct:
nix flake metadata path:/home/dan/proj/skills
Plugin installation fails
If bun install or npm install fails during activation:
-
Manually install:
cd ~/.config/opencode bun add opencode-skills -
Disable automatic installation:
services.ai-skills.installOpencodePlugin = false;
Advanced Usage
Custom Skills Path Per Agent
{
# Deploy different skills to different agents
home.file.".claude/skills/worklog".source = "${ai-skills}/skills/worklog";
home.file.".config/opencode/skills/tufte-press".source = "${ai-skills}/skills/tufte-press";
}
Conditional Deployment
{
services.ai-skills = {
enable = true;
skillsPath = "${ai-skills}/skills";
# Only deploy worklog on work machines
skills = if config.networking.hostName == "work-laptop"
then [ "worklog" "screenshot-latest" ]
else [ "screenshot-latest" ];
};
}
Override Skill Files
{
services.ai-skills.enable = true;
# Override specific skill with custom version
home.file.".config/opencode/skills/worklog" = lib.mkForce {
source = /path/to/custom/worklog;
recursive = true;
};
}
Example: tufte-press Repository
To use the tufte-press skill in the tufte-press repository:
# ~/proj/tufte-press/flake.nix
{
inputs = {
ai-skills.url = "path:/home/dan/proj/skills";
};
outputs = { ai-skills, ... }: {
# Make tufte-press skill available in this repo
devShells.default = pkgs.mkShell {
shellHook = ''
# Create project-local opencode skills
mkdir -p .opencode/skills
ln -sf ${ai-skills}/skills/tufte-press .opencode/skills/tufte-press
echo "📚 Tufte-press skill loaded in .opencode/skills/"
'';
};
};
}
Or use Home Manager to install it globally as shown above.
See Also
- skills/README.md - Overview of available skills
- skills/AGENTS.md - Development guidelines for skills
- skills/DEPLOYMENT.md - Deployment strategy details
- Home Manager Manual