2026-02-17 20:11:13 +01:00
|
|
|
{
|
|
|
|
|
runCommand,
|
|
|
|
|
nodejs,
|
|
|
|
|
writeShellApplication,
|
|
|
|
|
lib,
|
|
|
|
|
jq,
|
|
|
|
|
cacert,
|
|
|
|
|
pi-llm,
|
|
|
|
|
}:
|
|
|
|
|
let
|
|
|
|
|
# Pre-install pi plugins into a fake npm global prefix
|
|
|
|
|
pluginPrefixRaw =
|
|
|
|
|
runCommand "pi-plugins-raw"
|
|
|
|
|
{
|
|
|
|
|
nativeBuildInputs = [
|
|
|
|
|
nodejs
|
|
|
|
|
cacert
|
|
|
|
|
];
|
|
|
|
|
outputHashMode = "recursive";
|
|
|
|
|
outputHashAlgo = "sha256";
|
2026-02-18 18:17:45 +01:00
|
|
|
outputHash = "sha256-ruCukrbH89/uZHhxYSmrcs5NUi2ZG8nuwTEuJKHP2rw=";
|
2026-02-17 20:11:13 +01:00
|
|
|
impureEnvVars = [
|
|
|
|
|
"http_proxy"
|
|
|
|
|
"https_proxy"
|
|
|
|
|
];
|
|
|
|
|
SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
|
|
|
|
}
|
|
|
|
|
''
|
|
|
|
|
export HOME=$TMPDIR
|
|
|
|
|
export npm_config_prefix=$out
|
|
|
|
|
npm install -g pi-hooks shitty-extensions
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
# Remove the resistance extension (annoying terminator quote widget)
|
|
|
|
|
pluginPrefix = runCommand "pi-plugins" { } ''
|
|
|
|
|
cp -a ${pluginPrefixRaw} $out
|
|
|
|
|
chmod -R u+w $out
|
|
|
|
|
pkg=$out/lib/node_modules/shitty-extensions/package.json
|
|
|
|
|
${lib.getExe jq} '.pi.extensions |= map(select(contains("resistance") | not))' "$pkg" > "$pkg.tmp"
|
|
|
|
|
mv "$pkg.tmp" "$pkg"
|
|
|
|
|
'';
|
|
|
|
|
in
|
|
|
|
|
writeShellApplication {
|
2026-02-17 22:28:56 +01:00
|
|
|
name = "pi";
|
2026-02-17 20:11:13 +01:00
|
|
|
runtimeInputs = [ nodejs ];
|
2026-02-17 22:28:56 +01:00
|
|
|
text = ''
|
|
|
|
|
set -efu
|
|
|
|
|
export npm_config_prefix="${pluginPrefix}"
|
2026-02-17 20:11:13 +01:00
|
|
|
|
2026-02-17 22:28:56 +01:00
|
|
|
# Ensure settings.json has our plugins listed
|
|
|
|
|
SETTINGS_DIR="''${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
|
|
|
|
|
SETTINGS_FILE="$SETTINGS_DIR/settings.json"
|
|
|
|
|
mkdir -p "$SETTINGS_DIR"
|
2026-02-17 20:11:13 +01:00
|
|
|
|
2026-02-17 22:28:56 +01:00
|
|
|
# Add packages to settings if not already present
|
|
|
|
|
if [ ! -f "$SETTINGS_FILE" ]; then
|
|
|
|
|
echo '{"packages":["npm:pi-hooks","npm:shitty-extensions"]}' > "$SETTINGS_FILE"
|
|
|
|
|
else
|
|
|
|
|
for pkg in "npm:pi-hooks" "npm:shitty-extensions"; do
|
|
|
|
|
if ! grep -q "$pkg" "$SETTINGS_FILE"; then
|
|
|
|
|
${lib.getExe jq} --arg p "$pkg" '.packages = ((.packages // []) + [$p] | unique)' "$SETTINGS_FILE" > "$SETTINGS_FILE.tmp"
|
|
|
|
|
mv "$SETTINGS_FILE.tmp" "$SETTINGS_FILE"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
fi
|
2026-02-17 20:11:13 +01:00
|
|
|
|
2026-02-17 22:28:56 +01:00
|
|
|
exec ${lib.getExe pi-llm} "$@"
|
|
|
|
|
'';
|
2026-02-17 20:11:13 +01:00
|
|
|
}
|