No description
  • TypeScript 65.1%
  • JavaScript 14.5%
  • Shell 13.5%
  • Python 6.7%
  • PowerShell 0.2%
Find a file
Carl-Friedrich Braun ee66f0601f chore(mapping-codebase): drop bdId from skeleton schema; de-stale model ref
Final beads cleanup: remove the leftover bdId property from skeleton.schema.json
(matches the de-beaded OpenQuestion type) and fix a stale '26B local model'
reference in SKILL.md (the runtime is Qwen3.6-35B) → 'small local model'.
2026-06-09 16:51:50 +02:00
.pi fix(pi-subagents): agentOverrides tools must be a JSON array, not a string 2026-06-05 13:46:26 +02:00
agents feat: merge user agent dir; migrate workflow from beads to todos 2026-05-15 14:00:19 +02:00
bin chore: remove graphify entirely (clean break) 2026-06-09 16:41:59 +02:00
docs chore: remove graphify entirely (clean break) 2026-06-09 16:41:59 +02:00
extensions feat(omlx-sampling): generalize to a family registry; defer unknown models to omlx 2026-06-09 14:22:20 +02:00
intercepted-commands chore: scaffold pi-stuff with curated extensions and extended todos 2026-05-15 13:43:11 +02:00
plumbing-commands chore: scaffold pi-stuff with curated extensions and extended todos 2026-05-15 13:43:11 +02:00
scripts chore(scripts): add idempotent skills restructure helper 2026-05-19 17:05:27 +02:00
skills chore(mapping-codebase): drop bdId from skeleton schema; de-stale model ref 2026-06-09 16:51:50 +02:00
tests feat(omlx-sampling): generalize to a family registry; defer unknown models to omlx 2026-06-09 14:22:20 +02:00
vendor chore: scaffold pi-stuff with curated extensions and extended todos 2026-05-15 13:43:11 +02:00
.gitignore chore: remove graphify entirely (clean break) 2026-06-09 16:41:59 +02:00
AGENTS.md feat(agents): add anti-sycophancy engagement register to Pi global AGENTS.md 2026-06-02 08:06:23 +02:00
LICENSE chore: scaffold pi-stuff with curated extensions and extended todos 2026-05-15 13:43:11 +02:00
package-lock.json fix(extensions): rewrite omlx overflow errors to trigger pi's overflow path 2026-05-16 13:46:00 +02:00
package.json feat: stop local-model reasoning loops (sampling + streaming breaker) 2026-06-06 13:44:23 +02:00
README.md feat(todos): TUI tree view, blocked/ready badges, filter cycle 2026-05-15 13:46:40 +02:00
THIRDPARTY.md chore: remove graphify entirely (clean break) 2026-06-09 16:41:59 +02:00
tsconfig.json chore: scaffold pi-stuff with curated extensions and extended todos 2026-05-15 13:43:11 +02:00

pi-stuff

Personal Pi Coding Agent extensions and skills, tuned for working with local LLMs. Forked and curated from mitsuhiko/agent-stuff with a heavier todos.ts that mirrors beads' epic-and-dependencies workflow.

Layout

extensions/         Pi extensions (TS, run by the agent process)
  todos.ts          Extended fork: parent + depends_on + tree action
  multi-edit.ts     Batch edits + Codex patch + preflight (Armin)
  goal.ts           Persistent objective across compaction (Armin)
  prompt-editor.ts  Per-mode model/thinking selector (Armin)
  loop.ts           Self-driving prompt loop (Armin)
  review.ts         Code-review command (Armin)
  notify.ts         Native desktop notifications (Armin)
  answer.ts         Q&A TUI (Armin)
  session-breakdown.ts Time/cost analysis (Armin)
skills/             SKILL.md skills loaded by Pi
intercepted-commands/  Shims that route pip/python through uv
plumbing-commands/  make-release wizard
vendor/             Upstream license text

The interesting bit: extended todos.ts

Upstream todos.ts gives you a file-per-todo Kanban with claim/release. This fork adds the two parts of beads I actually missed:

Field What it does
parent Single-parent tree. An "epic" is just a todo with at least one child.
depends_on Cross-cutting blocker DAG. A todo is ready only when every dep is closed.

New tool surface (the model sees these):

  • action: "tree" — flat parent-first listing with a depth field per item.
  • filter: "ready" | "blocked" | "epics" | "roots" — works on list, list-all, tree.
  • parent: "TODO-<hex>" | "" — set/detach parent (cycle-checked).
  • depends_on: ["TODO-<hex>", ...] — set blockers (cycle-checked).

The agent-facing JSON for each todo gains derived fields:

{
  "id": "TODO-deadbeef",
  "status": "open",
  "ready": false,
  "blocked_by": ["TODO-aaaaaaaa"],
  "is_epic": true,
  "epic_progress": "1/3",
  "parent": "TODO-cccccccc",
  "depends_on": ["TODO-aaaaaaaa"]
}

What's enforced

  • A todo can't be its own parent; parent chains can't cycle (max depth 32).
  • A todo can't depend on itself; dep graph can't cycle.
  • Closing a todo with open children is rejected — close the kids first or detach them with parent: "". Same guard runs on the TUI close action.
  • parent and depends_on ids must exist when set.

What's deliberately NOT here

  • No priorities — pull-based queues use ready/blocked as the priority signal.
  • No multi-parent — tree, not DAG. Cross-cutting links go in depends_on.
  • No audit log — .pi/todos/ is a git directory; git log is the audit.
  • No new TUI affordances yet — the model uses tool calls, the human can still navigate with /todos. Tree-rendering in the TUI can come later.

Local-LLM rationale

Each piece earns its spot because it helps when the model is small:

  • todos.ts + goal.ts — externalize state to disk; small contexts can't hold long task lists.
  • multi-edit.ts — preflight validation catches the failures a smaller model makes more often.
  • prompt-editor.ts — dispatch different tasks to different local models (planner vs coder).
  • Skills are prescriptive checklists, which small models follow better than open-ended instructions.

Companion extensions

pi-hermes-memory (chandra447/pi-hermes-memory)

Substantial separate extension (SQLite-backed persistent memory + session search + secret scanning). Not vendored here — it's ~250 KB of source with 368 tests and its own release cadence. Install peer-style instead:

pi install npm:pi-hermes-memory

Note on package scope: earendil-works/pi-mono is the current home of Pi. Everything in this repo imports from @earendil-works/pi-coding-agent. pi-hermes-memory still imports from the older @mariozechner/pi-coding-agent scope. Both packages are published by Mario Zechner from the same codebase (the GitHub org moved from badlogic to earendil-works) and recent versions were released the same day, so they're API-compatible — but you'll likely want to fork pi-hermes-memory and run sed -i 's/@mariozechner/@earendil-works/g' across its src/ to align it with the current Pi scope. Until upstream migrates, the unmodified package may load but won't pick up newer earendil-works features.

For local-LLM use specifically, the memory + session-search angle is high value: small models forget aggressively, so an externalized retrieval layer substantially extends effective context. Less sure about the auto-learn loop — that adds tokens to every Nth turn, and the "what's worth saving" judgment is exactly the kind of thing small models do poorly. Consider starting with the memory + search tools and disabling the auto-review until you've seen it work.

Watch-outs

  • extensions/loop.ts references claude-haiku-4-5 for its breakout-condition summary. For a strictly local setup, swap the model id in that file.
  • This repo's extensions and pi-hermes-memory use different package scopes (see above). Coexistence should work, but if not, fork and rename imports.

Install

cd ~/devel/pi-stuff
npm install
# point Pi at the directory or publish under a private name

Then either symlink each subdir into your Pi config, or add this repo as a local Pi package (see Pi docs).

Attribution

See THIRDPARTY.md. Upstream license preserved in vendor/mitsupi-LICENSE.