diff --git a/docs/plugins-maintainers.md b/docs/plugins-maintainers.md index db9d778..01cbacf 100644 --- a/docs/plugins-maintainers.md +++ b/docs/plugins-maintainers.md @@ -129,7 +129,7 @@ openclawPlugin = { Host behavior: creates `~/.config/xuezh/config.json` from `settings`; exports both envs; fails if the pointed files are missing/empty. ## Bundled Plugin Set (current) -- summarize, peekaboo, poltergeist, sag, camsnap, gogcli, goplaces, bird, sonoscli, imsg. +- summarize, discrawl, wacrawl, peekaboo, poltergeist, sag, camsnap, gogcli, goplaces, sonoscli, imsg. - Source of truth: `nix/modules/home-manager/openclaw/plugin-catalog.nix`. - Each follows the same contract: packages + skills; env/state declared via `needs`; enabled via config toggle; sources pinned via the bundled plugin catalog. diff --git a/docs/rfc/2026-01-11-plugin-system.md b/docs/rfc/2026-01-11-plugin-system.md index 6cb2b2e..bffe356 100644 --- a/docs/rfc/2026-01-11-plugin-system.md +++ b/docs/rfc/2026-01-11-plugin-system.md @@ -304,17 +304,18 @@ Install wires up Twilio creds. Binary handles webhook server. Skill teaches agen ## The Plugin Ecosystem Vision -**First-party plugins** already exist — see [nix-steipete-tools](https://github.com/openclaw/nix-steipete-tools/tree/main/tools): +**First-party plugins** already exist — see [nix-openclaw-tools](https://github.com/openclaw/nix-openclaw-tools/tree/main/tools): - `summarize` — YouTube/article summarization -- `oracle` — second-model review +- `discrawl` — Discord archive/search +- `wacrawl` — WhatsApp archive/search - `peekaboo` — screenshot capture - `camsnap` — webcam capture -- `poltergeist` — browser automation -- `sag` — web search -- `bird` — Twitter/X integration +- `poltergeist` — file watching and automation +- `sag` — text-to-speech - `sonoscli` — Sonos control - `imsg` — iMessage integration - `gogcli` — Google Calendar +- `goplaces` — Google Places All follow the same contract. All pinned in nix-openclaw. Enable with one line: ```nix diff --git a/flake.lock b/flake.lock index 9636a1a..57689fc 100644 --- a/flake.lock +++ b/flake.lock @@ -38,21 +38,21 @@ "type": "github" } }, - "nix-steipete-tools": { + "nix-openclaw-tools": { "inputs": { "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1773561580, - "narHash": "sha256-wT0bKTp45YnMkc4yXQvk943Zz/rksYiIjEXGdWzxnic=", + "lastModified": 1777976020, + "narHash": "sha256-IsgLwW0Y6JYiWXbxmzN1FDO0//Osu2YpeID1tFMbwkk=", "owner": "openclaw", - "repo": "nix-steipete-tools", - "rev": "cd4c429ff3b3aaef9f92e59812cf2baf5704b86f", + "repo": "nix-openclaw-tools", + "rev": "08955054f466e2eb55628763c1d7ee2de5af9f6d", "type": "github" }, "original": { "owner": "openclaw", - "repo": "nix-steipete-tools", + "repo": "nix-openclaw-tools", "type": "github" } }, @@ -92,7 +92,7 @@ "inputs": { "flake-utils": "flake-utils", "home-manager": "home-manager", - "nix-steipete-tools": "nix-steipete-tools", + "nix-openclaw-tools": "nix-openclaw-tools", "nixpkgs": "nixpkgs_2" } }, diff --git a/flake.nix b/flake.nix index 2502e0b..86f7373 100644 --- a/flake.nix +++ b/flake.nix @@ -13,7 +13,7 @@ flake-utils.url = "github:numtide/flake-utils"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; - nix-steipete-tools.url = "github:openclaw/nix-steipete-tools"; + nix-openclaw-tools.url = "github:openclaw/nix-openclaw-tools"; }; outputs = @@ -22,10 +22,20 @@ nixpkgs, flake-utils, home-manager, - nix-steipete-tools, + nix-openclaw-tools, }: let - overlay = import ./nix/overlay.nix; + openclawToolPkgsFor = + system: + if nix-openclaw-tools ? packages && builtins.hasAttr system nix-openclaw-tools.packages then + nix-openclaw-tools.packages.${system} + else + { }; + overlay = + final: prev: + import ./nix/overlay.nix { + openclawToolPkgs = openclawToolPkgsFor prev.stdenv.hostPlatform.system; + } final prev; sourceInfoStable = import ./nix/sources/openclaw-source.nix; systems = [ "x86_64-linux" @@ -39,15 +49,11 @@ inherit system; overlays = [ overlay ]; }; - steipetePkgs = - if nix-steipete-tools ? packages && builtins.hasAttr system nix-steipete-tools.packages then - nix-steipete-tools.packages.${system} - else - { }; + openclawToolPkgs = openclawToolPkgsFor system; packageSetStable = import ./nix/packages { pkgs = pkgs; sourceInfo = sourceInfoStable; - steipetePkgs = steipetePkgs; + openclawToolPkgs = openclawToolPkgs; }; in { diff --git a/nix/modules/home-manager/openclaw/lib.nix b/nix/modules/home-manager/openclaw/lib.nix index 34fa4fe..85fbf52 100644 --- a/nix/modules/home-manager/openclaw/lib.nix +++ b/nix/modules/home-manager/openclaw/lib.nix @@ -26,13 +26,13 @@ let bundledPluginSources = let - stepieteRev = "c110209720cbc6c87fccb6c1e1c2b79b1d719245"; - stepieteNarHash = "sha256-1Vo7rcLGdKaqj39J3HhBKh8IbljSjgCUhinCFJbDPl8="; - stepiete = + openclawToolsRev = "08955054f466e2eb55628763c1d7ee2de5af9f6d"; + openclawToolsNarHash = "sha256-IsgLwW0Y6JYiWXbxmzN1FDO0//Osu2YpeID1tFMbwkk="; + openclawTools = tool: - "github:openclaw/nix-steipete-tools?dir=tools/${tool}&rev=${stepieteRev}&narHash=${stepieteNarHash}"; + "github:openclaw/nix-openclaw-tools?dir=tools/${tool}&rev=${openclawToolsRev}&narHash=${openclawToolsNarHash}"; in - lib.mapAttrs (_name: plugin: plugin.source or (stepiete plugin.tool)) pluginCatalog; + lib.mapAttrs (_name: plugin: plugin.source or (openclawTools plugin.tool)) pluginCatalog; bundledPlugins = lib.filter (p: p != null) ( lib.mapAttrsToList ( diff --git a/nix/modules/home-manager/openclaw/plugin-catalog.nix b/nix/modules/home-manager/openclaw/plugin-catalog.nix index 555dac7..89a1a24 100644 --- a/nix/modules/home-manager/openclaw/plugin-catalog.nix +++ b/nix/modules/home-manager/openclaw/plugin-catalog.nix @@ -5,6 +5,18 @@ linux = true; }; + discrawl = { + tool = "discrawl"; + description = "Archive and search Discord history"; + linux = true; + }; + + wacrawl = { + tool = "wacrawl"; + description = "Archive and search WhatsApp Desktop history"; + linux = true; + }; + peekaboo = { tool = "peekaboo"; description = "Screenshot your screen"; @@ -13,7 +25,7 @@ poltergeist = { tool = "poltergeist"; - description = "Click, type, control macOS UI"; + description = "File watching and automation"; linux = false; }; @@ -42,12 +54,6 @@ linux = true; }; - bird = { - tool = "bird"; - description = "Twitter/X integration"; - linux = false; - }; - sonoscli = { tool = "sonoscli"; description = "Control Sonos speakers"; diff --git a/nix/overlay.nix b/nix/overlay.nix index 79a82b5..f62e5af 100644 --- a/nix/overlay.nix +++ b/nix/overlay.nix @@ -1,7 +1,17 @@ +{ + openclawToolPkgs ? { }, +}: final: prev: let - packages = import ./packages { pkgs = prev; }; - toolNames = (import ./tools/extended.nix { pkgs = prev; }).toolNames; + packages = import ./packages { + pkgs = prev; + openclawToolPkgs = openclawToolPkgs; + }; + toolNames = + (import ./tools/extended.nix { + pkgs = prev; + openclawToolPkgs = openclawToolPkgs; + }).toolNames; withTools = { toolNamesOverride ? null, @@ -9,6 +19,7 @@ let }: import ./packages { pkgs = prev; + openclawToolPkgs = openclawToolPkgs; inherit toolNamesOverride excludeToolNames; }; in diff --git a/nix/packages/default.nix b/nix/packages/default.nix index 477375a..c5eb613 100644 --- a/nix/packages/default.nix +++ b/nix/packages/default.nix @@ -1,7 +1,7 @@ { pkgs, sourceInfo ? import ../sources/openclaw-source.nix, - steipetePkgs ? { }, + openclawToolPkgs ? { }, toolNamesOverride ? null, excludeToolNames ? [ ], }: @@ -9,7 +9,7 @@ let isDarwin = pkgs.stdenv.hostPlatform.isDarwin; toolSets = import ../tools/extended.nix { pkgs = pkgs; - steipetePkgs = steipetePkgs; + openclawToolPkgs = openclawToolPkgs; inherit toolNamesOverride excludeToolNames; }; openclawGateway = pkgs.callPackage ./openclaw-gateway.nix { diff --git a/nix/tools/extended.nix b/nix/tools/extended.nix index f34c395..77a775d 100644 --- a/nix/tools/extended.nix +++ b/nix/tools/extended.nix @@ -1,6 +1,6 @@ { pkgs, - steipetePkgs ? { }, + openclawToolPkgs ? { }, toolNamesOverride ? null, excludeToolNames ? [ ], }: @@ -19,9 +19,9 @@ let pick = name: let - fromSteipete = pickFrom steipetePkgs name; + fromOpenClawTools = pickFrom openclawToolPkgs name; in - if fromSteipete != null then fromSteipete else pickFrom pkgs name; + if fromOpenClawTools != null then fromOpenClawTools else pickFrom pkgs name; ensure = names: safe (map pick names); baseNames = [ @@ -36,24 +36,13 @@ let "ripgrep" ]; - pluginCatalog = import ../modules/home-manager/openclaw/plugin-catalog.nix; - bundledToolNames = lib.unique (map (plugin: plugin.tool) (builtins.attrValues pluginCatalog)); - extraNames = [ - "go" - "uv" - "openai-whisper" - "spotify-player" - "openhue-cli" - "wacli" - "ordercli" - "blucli" - "eightctl" - "mcporter" - "qmd" - "nano-pdf" - ] - ++ bundledToolNames; + "gogcli" + "goplaces" + "summarize" + "camsnap" + "sonoscli" + ]; toolNamesBase = if toolNamesOverride != null then toolNamesOverride else baseNames ++ extraNames; toolNames = builtins.filter (name: !builtins.elem name excludeToolNames) toolNamesBase; diff --git a/scripts/allowed-flake-lock-owners.txt b/scripts/allowed-flake-lock-owners.txt index 3237e19..91e1f48 100644 --- a/scripts/allowed-flake-lock-owners.txt +++ b/scripts/allowed-flake-lock-owners.txt @@ -1,6 +1,6 @@ # Allowed GitHub inputs in flake.lock (owner/repo) NixOS/nixpkgs -openclaw/nix-steipete-tools +openclaw/nix-openclaw-tools nix-community/home-manager nix-systems/default numtide/flake-utils