[0.31.0] - 2026-06-24
Added
- Added
subagents.disableThinkingso bundled builtin agents can drop thinking suffix defaults for providers that do not accept them. Thanks to Joshua Harding (@jhstatewide) for #212. - Discover nested grouped skills such as
.pi/skills/group/name/SKILL.mdso subagents match the host runtime's recursive skill lookup. Thanks to Weaxs (@Weaxs) for #262. - Follow Pi's configured project config directory for project-local agents, chains, skills, packages, settings, direct MCP config, and intercom package discovery instead of hardcoding
.pi, while retaining.pias the fallback for older Pi versions.
Changed
- Hardened npm installs by tracking
package-lock.json, pinning direct dependencies, and usingnpm ci --ignore-scriptsin CI and release workflows. Thanks to Modestas Vainius (@modax) for #234. - List configured subagent skills by name, description, and file path instead of inlining full skill bodies, and ensure tool-restricted children can read those skill files on demand. Thanks to Ruben Paz (@Istar-Eldritch) for #183.
Fixed
- Resolve the async result watcher directory with
fs.realpathSync.native()beforefs.watch()so Windows profiles with 8.3 temp paths do not crash Pi when async subagent results arrive. Thanks to kerushidao (@kerushidao) for #254. - Accept structured acceptance reports emitted in JSON-family fences when the fenced body has the acceptance-report shape. Thanks to Suleiman Tawil (@stawils) for #253.
- Report field-level acceptance-report validation errors instead of a generic parse failure, and clarify array element types in the acceptance prompt. Thanks to Whisperfall (@Whisperfall) for #264 and josephkEA (@josephkEA) for the follow-up reproduction.
- Simplified the public
acceptanceand chain tool schemas so Kimi/Moonshot-style parsers can loadsubagent, while runtime validation still rejects malformed acceptance config and dynamic fanout steps. Thanks to Sergio Agosti (@sergio-agosti) for #249. - Reject duplicate concurrent
subagentexecution calls while a prior subagent dispatch is still in progress, keeping intentional parallel mode within a single call unchanged. Thanks to desideratum (@desideratum) for #247. - Bound async
events.jsonlgrowth by dropping noisy childmessage_updatesnapshots, capping persisted child diagnostics, and scanning control events in chunks during status polling. Thanks to Tri Van Pham (@pvtri96) for #246. - Keep crowded async subagent widgets at a stable collapsed height in short terminals, reducing destructive full-screen TUI redraws and flicker. Thanks to ssyram (@ssyram) for #186.
- Actually wire the previously documented foreground-only
timeoutMs/maxRuntimeMsaliases through single, parallel, chain, and dynamic fanout runs, including stabletimedOut: trueresults, preserved partial output, manual-interrupt precedence, and skipped acceptance verification after timeout. - Apply
subagents.agentOverrides.<name>to matching user-scope and project-scope custom agents, while keeping explicit agent frontmatter authoritative per field. Thanks to Jacek Juraszek (@jjuraszek) for #218. - Preserve compact foreground
write/edittool-call evidence in prompt-template delegation responses so convergence checks do not stop loops early. Thanks to Hans Schnedlitz (@hschne) for #207. - Respect each agent's
defaultContextin mixed parallel and chain subagent calls when no explicitcontextis provided, so fresh-default scouts no longer inherit forked parent transcripts just because another agent in the same invocation defaults to fork. Thanks to Mitch Fultz (@fitchmultz) for #228. - Make runtime
outputoverrides authoritative in child task and system prompts, and remove stale static filenames from bundled output-format instructions. Thanks to youngshine (@smithyyang) for #223. - Keep top-level parallel
defaultProgressfiles in run-scoped artifact storage instead of the parent working directory. Thanks to youngshine (@smithyyang) for #224.