plif 0.2.0
91 files across packages/, +5 805 / -1 454, 490 tests passing.
Added
- Modular prompt compiler. The single instruction blob became
packages/core/src/harness/prompts/: a compiler plus per-mode instructions for the primary agent, subagents, explore, review and compaction, with separate modules for environment, project, tools, skills and MCP context. curltool. HTTP requests without going through the shell — methods, query parameters, headers, JSON or text bodies, manual redirect handling with a fresh host approval per hop, and a byte ceiling on the response. Credentials are stripped when a redirect crosses origins, and secret headers are never echoed back.update_plantool. A short execution plan for genuinely multi-step work, rendered as a live checklist rather than repeated in prose.get_configandupdate_config. The agent can read its own configuration with credentials redacted, and change the active model, vision model, theme, auto-approve, or add an OpenAI-compatible provider — behind a confirmation panel unless Auto Approve is on.- Vision tools.
inspect_imageandlist_vision_modelsdelegate an image to a vision-capable model without changing the main model. create_skill, and three built-in skills. Skills can now be written from inside a session and loaded without a restart. Ships withskill-creator,anti-ai-slopanddme-eclipse-design.- User themes. Theme documents in
~/.plif/*.themewith a published JSON schema atpackages/cli/schema/theme.schema.json. - Discovery panel. Batched reads and directory listings collapse into one row instead of flooding the timeline.
- Shell highlighting for commands in the timeline, and a terminal title that tracks the session.
- More language servers. Shell (shellcheck) and PowerShell Editor Services, with resolution that survives npm
.cmdshims.
Fixed
- Typing is no longer mistaken for a paste. Ink hands over whatever
stdin.read()had buffered, so an auto-repeated space or two keystrokes landing in the same frame arrived as one chunk — and any chunk longer than one grapheme was being turned into a[Pasted Content]attachment mid-sentence. plif now enables bracketed paste and reads the terminal's own markers; the fallback for terminals that ignore it requires more than one line of content. - Each turn keeps its own paragraph. Assistant text from consecutive turns was concatenated with no separator, so the last word of one turn ran into the first word of the next in the recorded session and on resume.
- Resizing the window no longer duplicates the session. Ink handles
SIGWINCHbefore React can render at the new size, and its intermediate frame can be taller than the restored window — which triggersclearTerminalplus a full static replay, and on Windows that puts a second copy of the whole session on screen. plif owns resize itself and now detaches only the listener Ink registered, leaving application listeners alone.
Security
get_configredacts by location, not by key name. The previous denylist matchedapiKey,token,secretandpassword, which misses the two places a credential actually lives: an HTTP MCP server keeps its bearer token inheaders.Authorization, and a stdio server keeps it inenvunder whatever the vendor named the variable. Both were returned verbatim to the model and therefore to the model's endpoint. Everything insideheadersandenvis now redacted wherever it appears, while the model keeps what it needs to manage configuration.
Changed
- The startup mark is redrawn.
@plif/cli,@plif/coreand@plif/sandboxare published as compiled output only. Source stays in this repository.