opencode: handle string store paths in skill sources
Add support for store directory paths provided as strings, in addition to the existing path type check for directories. Context: certain project will include a `SKILL.md` file, and instead of managing them via some 3rd party manager or manually, why not include them from the source itself! I implemented this in my setup, since I wanted to include the `SKILL.md` file from the [beads](https://github.com/steveyegge/beads) project.
This commit is contained in:
parent
db9cf9232f
commit
63ecc7d495
3 changed files with 43 additions and 2 deletions
|
|
@ -230,7 +230,13 @@ in
|
|||
};
|
||||
|
||||
skills = lib.mkOption {
|
||||
type = lib.types.either (lib.types.attrsOf (lib.types.either lib.types.lines lib.types.path)) lib.types.path;
|
||||
type = lib.types.either (lib.types.attrsOf (
|
||||
lib.types.oneOf [
|
||||
lib.types.lines
|
||||
lib.types.path
|
||||
lib.types.str
|
||||
]
|
||||
)) lib.types.path;
|
||||
default = { };
|
||||
description = ''
|
||||
Custom agent skills for opencode.
|
||||
|
|
@ -245,6 +251,9 @@ in
|
|||
- A path to a file (creates `opencode/skill/<name>/SKILL.md`)
|
||||
- A path to a directory (creates `opencode/skill/<name>/` with all files)
|
||||
|
||||
This also accepts Nix store paths (e.g., source from a package), allowing you to
|
||||
reference subdirectories within a package source.
|
||||
|
||||
If a path is used, it is expected to contain one folder per skill name, each
|
||||
containing a {file}`SKILL.md`. The directory is symlinked to
|
||||
{file}`$XDG_CONFIG_HOME/opencode/skill/`.
|
||||
|
|
@ -268,6 +277,9 @@ in
|
|||
|
||||
# A skill can also be a directory containing SKILL.md and other files.
|
||||
data-analysis = ./skills/data-analysis;
|
||||
|
||||
# A skill can also be a subdirectory within a package source (store path)
|
||||
beads = "''${pkgs.beads.src}/claude-plugin/skills/beads";
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
|
@ -443,7 +455,11 @@ in
|
|||
)
|
||||
// lib.mapAttrs' (
|
||||
name: content:
|
||||
if lib.isPath content && lib.pathIsDirectory content then
|
||||
if
|
||||
(lib.isPath content && lib.pathIsDirectory content)
|
||||
|| (builtins.isString content && lib.hasPrefix builtins.storeDir content)
|
||||
|
||||
then
|
||||
lib.nameValuePair "opencode/skill/${name}" {
|
||||
source = content;
|
||||
recursive = true;
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
opencode-mixed-content = ./mixed-content.nix;
|
||||
opencode-skills-inline = ./skills-inline.nix;
|
||||
opencode-skills-path = ./skills-path.nix;
|
||||
opencode-skills-store-path = ./skills-store-path.nix;
|
||||
opencode-skills-directory = ./skills-directory.nix;
|
||||
opencode-skills-bulk-directory = ./skills-bulk-directory.nix;
|
||||
opencode-themes-inline = ./themes-inline.nix;
|
||||
|
|
|
|||
24
tests/modules/programs/opencode/skills-store-path.nix
Normal file
24
tests/modules/programs/opencode/skills-store-path.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{ pkgs, ... }:
|
||||
|
||||
let
|
||||
src = pkgs.writeTextDir "skills/external-skill/SKILL.md" ''
|
||||
# Mock Skill
|
||||
This content simulates a skill living inside a package source.
|
||||
'';
|
||||
in
|
||||
{
|
||||
programs.opencode = {
|
||||
enable = true;
|
||||
skills = {
|
||||
# We reference the specific subfolder inside the store path
|
||||
internal-skill = "${src}/skills/external-skill";
|
||||
};
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileExists home-files/.config/opencode/skill/internal-skill/SKILL.md
|
||||
|
||||
assertFileContent home-files/.config/opencode/skill/internal-skill/SKILL.md \
|
||||
"${src}/skills/external-skill/SKILL.md"
|
||||
'';
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue