Personal extensions, skills, and themes for Pi Coding Agent
Files
README.md

agent-stuff #

My shared agent skills and Pi extensions.

Skills #

Skill What it does
babysit Watches a PR through CI and review rounds, fixes findings, and merges it with full-send.
bro Restates the last response in plain language.
frontend-design Guides distinctive visual design for frontend work.
git-forges Inspects Git forges with Git, raw file requests, and forge-native CLIs.
sol-loop Works through a review or discussion in rounds with a GPT-6.1 Sol subagent.
unslop Removes stock AI phrasing and rewrites prose in a human voice.

Updating vendored skills #

frontend-design, bro, and unslop are copied from upstream repositories. Their source paths and imported commits live in upstreams/skills.json.

npm run skills:check   # report available upstream changes
npm run skills:update  # import the latest versions

The updater copies each skill and its license from a shallow clone. It then applies any local patch under upstreams/patches. This repository enables unslop by default and adds a guard for factual writing, so those changes are kept as a small patch instead of editing the vendored source silently.

Pi extensions #

Extension What it does
firecrawl Adds web_search and web_extract tools backed by Firecrawl.
image-placeholders Shows pasted and dropped images as [Image #N] and attaches them to the prompt.

web_search returns titles, URLs, and snippets. It can filter by domain and by recency. web_extract reads one page as markdown, 12,000 characters per call by default. The model pages on with offset, or passes query to get only the passages around a literal match. Pi keeps scraped pages for 10 minutes, so paging does not spend more credits.

The tools call Firecrawl's REST API with fetch and have no runtime dependencies. They stay off until FIRECRAWL_API_KEY is set, and Pi warns at startup when it is missing. Set FIRECRAWL_URL to use a self-hosted instance, where the key is optional.

Stock Pi saves a Ctrl+V image to a temp file and types that path into the prompt. The model then has to call read on the path to see the image. image-placeholders puts [Image #1] in the editor instead and attaches the image to the prompt when you send it, so the model sees it right away. Dropping an image file into the terminal works the same way, whether the terminal sends a plain path, a quoted or escaped path, or a file:// URI. Numbers keep counting up for the whole Pi process, so a prompt recalled from history still attaches its own image. Backspace, Delete, and the arrow keys treat a placeholder as one character, like Pi's [paste #N] markers. This wraps a private editor method, so a Pi update can quietly turn it back into character-by-character deletion. In bash mode (!) the real path is inserted. The extension replaces Pi's editor, so it conflicts with other extensions that also replace it.

Without Nix, install the package with Pi:

pi install git:github.com/zekurio/agent-stuff

This also loads the skills from the package. If you already link them into ~/.agents/skills, filter them out with "skills": [] in the package entry of ~/.pi/agent/settings.json.

To work on the extensions:

npm install
npm run check   # type-check against Pi's types and run the tests

Windows #

Run in PowerShell:

irm https://raw.githubusercontent.com/zekurio/agent-stuff/main/scripts/install-windows.ps1 | iex

This downloads the repository ZIP into %LOCALAPPDATA%\agent-stuff and links its skills into %USERPROFILE%\.agents\skills using directory junctions. No Git installation or administrator rights are needed. Rerun to download updates and link new skills; files removed upstream are not automatically pruned. Conflicting entries in your skills directory are preserved and stop the script. For a custom skills directory, save the script and run it with -Destination <path>.

To check the installer in a temporary directory:

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\test-install-windows.ps1

Nix and Home Manager #

The flake packages the skills and provides a Home Manager module.

Add the flake to your inputs and import the module:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    agent-stuff = {
      url = "github:zekurio/agent-stuff";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = inputs: {
    homeConfigurations.alice =
      inputs.home-manager.lib.homeManagerConfiguration {
        pkgs = inputs.nixpkgs.legacyPackages.x86_64-linux;
        modules = [
          inputs.agent-stuff.homeManagerModules.default
          ./home.nix
        ];
      };
  };
}

Enable it in your Home Manager configuration:

{
  programs.agent-stuff.enable = true;
}

The module links each skill at ~/.agents/skills. It also links the package at ~/.pi/agent/packages/agent-stuff and registers it in Pi's settings.json without touching other settings or packages. Pi loads the extensions from there, and the skills only from ~/.agents/skills. To skip the Pi part, set:

{
  programs.agent-stuff.pi.enable = false;
}

The next activation then removes the entry from settings.json.

The flake also exports packages.<system>.default, packages.<system>.agent-stuff, and an overlay that adds pkgs.agent-stuff.

License #

MIT