Files
pi-extensions/README.md
T
shahondin1624 5a1d738892 feat(scripts): install-client.sh component selection + update-only mode
Two new top-level flags:

  --components LIST     Comma-separated subset of:
                        certs, ssh, ai-server, dark-mechanicus, themes,
                        local-llama, ai-complete, shared, all
                        Default: all (matches previous behavior).
                        'shared' is auto-added when 'dark-mechanicus' is
                        selected (it imports from ../shared/).

  --update-only         Non-destructive: rsync with --ignore-existing, so
                        no file in $PI_DIR gets replaced. Add only.
                        Useful after a 'git pull' when you have local
                        edits in ~/.pi/agent/extensions/.

Three new components added to the rsync set:

  dark-mechanicus       The new theme TUI bundle (banner, footer, etc.).
                        Wasn't synced before because the legacy script
                        only copied ai-server/ + local-llama.ts.
  shared                Shared TS utils that dark-mechanicus imports.
                        Auto-included whenever dark-mechanicus is.
  ai-complete           Standalone shell CLI; installed to
                        --ai-complete-dir (default ~/bin/) and PATH'd
                        via .bashrc/.zshrc if missing.

Backward-compat:
  --no-certs / --no-ssh-setup still work (translated to component
  removal). --force still controls cert overwriting.

Cert handling unchanged in spirit: certs are NEVER overwritten unless
--force is passed, regardless of --update-only. (A working client
identity is more valuable than a fresh one.)

Verification step (mTLS /health probe) skipped if certs weren't part
of this run, or via new --skip-verify.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 14:55:06 +02:00

6.5 KiB

pi-extensions

Personal collection of extensions, themes, and scripts for pi — Mario Zechner's CLI coding agent.

The anchor of the repo is ai-server, a multi-file pi extension that lets pi talk to a self-hosted llama.cpp router behind mTLS. Everything else (theme, banner, custom footer, working indicator, session-name generator, etc.) is Warhammer 40k "Dark Mechanicum" flavoring on top of pi's interactive TUI.

Installed extensions

Extension What it does
ai-server/ Remote llama.cpp provider over mTLS. Dynamic model discovery. Admin slash commands (load / unload / ctx / preset / restart / refresh). Custom SSE stream implementation with tool calls, reasoning, cache token reporting. See ai-server/README.md for the full setup.
dark-mechanicus/ TUI customization bundle for the dark-mechanicus theme — loaded as one extension via index.ts. Includes: indicator.ts (working indicator: ⚙ <quote> · <elapsed>, pulsing cog, 45-quote pool), banner.ts (cog-and-skull header art), footer.ts (custom context+compaction+tok/s footer), status-line.ts (third footer line with rotating flavor text), session-names.ts (auto <adj>-<noun> · <NNN> session names + tab title), thinking-label.ts (Cogitating... for folded thinking blocks), markdown-body-color.ts (forces lavender body text).
local-llama.ts Tiny provider registration for a local llama-server (e.g. 127.0.0.1:8088).

Theme

File Palette
themes/dark-mechanicus.json Dark purple aubergine background (#16101e), AdMech blood-red accents (#a8232c), burnished brass borders (#b8803d), nurgle-green syntax strings (#5a6b2e), cognitor-pink syntax types (#c75a8a). All 51 color tokens defined.

Activate with /settings inside pi (or set "theme": "dark-mechanicus" in ~/.pi/agent/settings.json). Pi hot-reloads on edits to the active theme file.

Setup scripts

Script Runs on Purpose
scripts/install-client.sh New pi client Provisions or updates a client. --components LIST picks parts (ai-server, dark-mechanicus, themes, local-llama, ai-complete, certs, ssh, shared, or all). --update-only is non-destructive — only adds missing files, never overwrites existing ones. Verifies mTLS /health at the end.
scripts/issue-client-cert.sh Caddy host Generates a new client identity (key + cert + modern + legacy p12) for a named device. Use for each new machine.
scripts/install-browser-certs.sh New client Imports client cert + root CA into Brave Flatpak NSS, system NSS, Firefox profiles, and optionally the system trust store. Mostly obsolete since the Caddy switch to Let's Encrypt but still useful for the mTLS client cert side.
scripts/ai-complete (docs) Any pi client Minimal shell CLI for direct llama-server router access. Wraps https://ai.shahondin1624.de/v1/chat/completions with mTLS, with retries, prompt-from-file, streaming, and model load/status helpers. Useful for scripts and agents (Claude Code, etc.) that want to delegate generation.

Tests

Twenty-eight tests total, no external dependencies. Runs with Node 22+'s built-in test runner + --experimental-strip-types:

node --experimental-strip-types --test tests/*.test.ts
File Coverage
tests/messages.test.ts 13 unit tests over ai-server/messages.ts — pi Context → OpenAI payload conversion (system prompts, user/assistant/tool-result roles, tool calls, image-only messages).
tests/router-utils.test.ts 9 unit tests over ai-server/router-utils.tsextractCtxSize, isShardArtefact (the filter that hides GGUF multi-shard phantoms from the model picker).
tests/integration.test.ts 6 live-endpoint tests: /health, /models, model-entry shape, mTLS enforcement, publicly-trusted cert (Let's Encrypt contract), chat completion usage shape including prompt_tokens_details.cached_tokens. Auto-skip if the server is unreachable.

Stream-parsing edge cases (SSE framing, tool-call splits across chunks, reasoning deltas, abort mid-stream) remain deferred — they need a mock HTTPS server harness, not worth the complexity for a one-user setup.

Quick onboarding for another machine

# 1. Mint a new client identity (on the Caddy host)
ssh shahondin1624@192.168.2.2 '~/pi-extensions/scripts/issue-client-cert.sh laptop-alice'

# 2. On the new pi client
git clone https://git.shahondin1624.de/shahondin1624/pi-extensions.git ~/pi-extensions
cd ~/pi-extensions
scripts/install-client.sh

# 3. Activate the theme
#    /settings in pi, pick "dark-mechanicus"

Layout

pi-extensions/
├── ai-server/                  the core mTLS provider (multi-file extension)
│   ├── index.ts                entry — provider + admin commands
│   ├── config.ts               URLs, SSH host, cert loading, MODELS[]
│   ├── messages.ts             Context → OpenAI messages
│   ├── stream.ts               custom SSE stream, mTLS HTTPS, pi-ai events
│   ├── admin.ts                router HTTP client + SSH helpers
│   ├── router-utils.ts         pure helpers (test-friendly)
│   └── README.md               full mTLS + systemd + Caddy setup notes
├── dark-mechanicus/            theme TUI bundle (one extension, multi-file)
│   ├── index.ts                entry — sequences each module's registrar
│   ├── indicator.ts            working indicator (cog + quote + timer)
│   ├── banner.ts               TUI header art
│   ├── footer.ts               custom footer layout
│   ├── status-line.ts          rotating flavor status line
│   ├── session-names.ts        auto-name generator + tab title
│   ├── thinking-label.ts       "Cogitating..." for folded thinking blocks
│   └── markdown-body-color.ts  forces body text color for chat + editor
├── local-llama.ts              local llama-server provider
├── themes/
│   └── dark-mechanicus.json    51-token theme
├── scripts/                    install helpers
├── tests/                      node:test suites
└── README.md                   this file

License

Personal use. No license declared; the repo is private.