- 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
418 lines
9.5 KiB
Markdown
418 lines
9.5 KiB
Markdown
# 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:
|
|
|
|
```nix
|
|
{
|
|
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:
|
|
|
|
```nix
|
|
{
|
|
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:
|
|
|
|
```nix
|
|
{
|
|
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 screenshots
|
|
- `tufte-press` - Generate study card JSON
|
|
- `worklog` - Create org-mode worklogs
|
|
- `update-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
|
|
|
|
```nix
|
|
# 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:
|
|
|
|
1. **Work in the skills repo**:
|
|
```bash
|
|
cd ~/proj/skills
|
|
# Create/edit skills in skills/your-skill/
|
|
```
|
|
|
|
2. **Point your config at local path**:
|
|
```nix
|
|
services.ai-skills = {
|
|
skillsPath = /home/dan/proj/skills/skills; # Local path
|
|
skills = [ "your-skill" ];
|
|
};
|
|
```
|
|
|
|
3. **Rebuild**:
|
|
```bash
|
|
home-manager switch --flake .#youruser
|
|
# or
|
|
sudo nixos-rebuild switch --flake .#yourhostname
|
|
```
|
|
|
|
4. **Restart agents** to load new skills:
|
|
- OpenCode: Exit and restart
|
|
- Claude Code: Restart application
|
|
|
|
### Publishing Skills
|
|
|
|
When ready to share:
|
|
|
|
1. **Push to git**:
|
|
```bash
|
|
cd ~/proj/skills
|
|
git add .
|
|
git commit -m "Add new skill"
|
|
git push
|
|
```
|
|
|
|
2. **Update flake input** in consuming repo:
|
|
```nix
|
|
inputs.ai-skills.url = "github:yourusername/skills/main";
|
|
```
|
|
|
|
3. **Update flake lock**:
|
|
```bash
|
|
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.worklog`
|
|
- `packages.x86_64-linux.screenshot-latest`
|
|
- `packages.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:
|
|
|
|
1. **Creates** `~/.config/opencode/package.json` with `opencode-skills` dependency
|
|
2. **Runs** `bun install` or `npm install` to fetch the plugin
|
|
3. **Verifies** the plugin is listed in `config.json`
|
|
|
|
If automatic installation fails, manually install:
|
|
|
|
```bash
|
|
cd ~/.config/opencode
|
|
bun add opencode-skills
|
|
# or
|
|
npm install opencode-skills
|
|
```
|
|
|
|
Then ensure `config.json` includes:
|
|
|
|
```json
|
|
{
|
|
"plugin": ["opencode-skills"]
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Skills not appearing in OpenCode
|
|
|
|
1. **Check plugin is installed**:
|
|
```bash
|
|
ls ~/.config/opencode/node_modules/opencode-skills
|
|
```
|
|
|
|
2. **Verify config**:
|
|
```bash
|
|
jq '.plugin' ~/.config/opencode/config.json
|
|
# Should output: ["opencode-skills"]
|
|
```
|
|
|
|
3. **Check skills are deployed**:
|
|
```bash
|
|
ls -la ~/.config/opencode/skills/
|
|
```
|
|
|
|
4. **Restart OpenCode** completely (exit and reopen)
|
|
|
|
### Skills not appearing in Claude Code
|
|
|
|
1. **Check deployment**:
|
|
```bash
|
|
ls -la ~/.claude/skills/
|
|
```
|
|
|
|
2. **Verify SKILL.md exists**:
|
|
```bash
|
|
cat ~/.claude/skills/worklog/SKILL.md
|
|
```
|
|
|
|
3. **Restart Claude Code** application
|
|
|
|
### Module evaluation errors
|
|
|
|
If you get Nix evaluation errors:
|
|
|
|
1. **Check skillsPath** is valid:
|
|
```nix
|
|
skillsPath = "${ai-skills}/skills"; # Good
|
|
# NOT: skillsPath = ai-skills; # Wrong
|
|
```
|
|
|
|
2. **Verify flake input** is correct:
|
|
```bash
|
|
nix flake metadata path:/home/dan/proj/skills
|
|
```
|
|
|
|
### Plugin installation fails
|
|
|
|
If `bun install` or `npm install` fails during activation:
|
|
|
|
1. **Manually install**:
|
|
```bash
|
|
cd ~/.config/opencode
|
|
bun add opencode-skills
|
|
```
|
|
|
|
2. **Disable automatic installation**:
|
|
```nix
|
|
services.ai-skills.installOpencodePlugin = false;
|
|
```
|
|
|
|
## Advanced Usage
|
|
|
|
### Custom Skills Path Per Agent
|
|
|
|
```nix
|
|
{
|
|
# 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
|
|
|
|
```nix
|
|
{
|
|
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
|
|
|
|
```nix
|
|
{
|
|
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:
|
|
|
|
```nix
|
|
# ~/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](README.md) - Overview of available skills
|
|
- [skills/AGENTS.md](AGENTS.md) - Development guidelines for skills
|
|
- [skills/DEPLOYMENT.md](DEPLOYMENT.md) - Deployment strategy details
|
|
- [Home Manager Manual](https://nix-community.github.io/home-manager/)
|