feat: add RSC plugin framework and audiobook curator example - #1
Merged
Conversation
The design commits an authenticated callback download for the bounded Flight preview and HMR-preserved expanded trace IDs, but the download button's callback was never passed and trace.toggle had a reducer with no dispatcher - both finished capabilities without a UI entry point. RuntimeClient gains the bounded octet-stream Flight read; the Playground wires the download through the controller with a visible failure alert and dispatches trace.toggle from per-span disclosure buttons that render details collapsed until expanded, real-Chrome coverage included. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
Both hosts document discovering hooks/hooks.json at the plugin root, Codex documents running hook commands through a real shell with CLAUDE_PLUGIN_ROOT exported as a compatibility alias, and its hook envelope and hookSpecificOutput contract match Claude's - so the bundle emits one Claude-format hook document and one wrapper per hook. The new Universal wrapper codec detects the calling host at runtime (PLUGIN_ROOT is Codex-only; AGENT_BUNDLE_HOOK_HOST pins a host for simulation), and the matcher table unions Codex's documented apply_patch aliases with Claude's, which never emits them. The on-disk test compiles the wrapper and proves all three detection modes against the real process boundary. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
Applies the quality review to the bundle seams. Host adapters now export their conventional document paths and Codex derives the widened manifest validator from the requested MCP relocation itself, so the pointer and its validator cannot be configured apart. The bundle reuses each host's compiled validation schemas and metadata descriptors instead of recompiling seven ajv schemas at module load (a measured 50-80ms on every CLI command), emits the shared skill and asset copies once instead of planning them twice and discarding half, asserts at load that the two capability tables agree on every hook matcher it does not explicitly reconcile, and reports hook-document schema issues through the house schemaDiagnostics shape. The inert nativeHookTargetNames option is gone. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
Cursor documents .cursor-plugin/plugin.json with explicit pointers, so the bundle adds a third host to the same root: shared skills/ as-is, a Cursor-format MCP document (its auto-discovery reads mcp.json, never the Claude-convention .mcp.json, and it interpolates CURSOR_PLUGIN_ROOT rather than Claude's token), and - because Cursor auto-discovers hooks/hooks.json with an incompatible schema - an explicit pointer to a Cursor-format hooks document that stays empty until Cursor's hook stdin contract is pinned. Schemas are pinned from the published reference with provenance like the other hosts, compiled lazily so ordinary CLI loads pay nothing, and a non-kebab plugin name diagnoses instead of emitting an invalid manifest. flutter/agent-plugins ships this exact layout in production. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
A long-lived dev server accumulated every settled session's full event history in the in-memory map forever. Settled, subscriber-free, owner-released sessions beyond the eight newest now evict from memory only - their durable records stay on disk - and every by-id operation transparently restores an evicted session through the same load path reopen uses, preserving each error contract and the synchronous admission ordering close() depends on. The session GET route reopens before reporting not-found so eviction is invisible at the API surface. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
The quick start now leads with the plugin target: one agent plugin bundle whose root installs into Claude Code, Codex, and Cursor, with the per-host targets kept for host-specific layouts. The documented config was built verbatim through the packaged CLI and its artifact passes validate --artifact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
The universal wrapper is sound only because the Claude and Codex codec bodies stay byte-identical apart from identifier naming and the baked target constant; the new test normalizes both and asserts equality, and proves the Universal variant differs from that shared body by exactly its host-detection block. The generator's docs now state the invariant. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
Every pinned claim was re-verified against the current documentation and the installed 2.1.250 binary's own strict plugin validator, including a negative control proving the validator actually reads the documents: hook events and matchers, document shapes, transports, and path tokens all hold. The capability table, schema $ids, provenance, fixtures, and the native evaluator's expected version move to 2.1.250; the separate minimum-supported floor stays at 2.1.232 so older hosts remain covered. All five emitted example bundles pass claude plugin validate --strict on the new version. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMWczsXAkj7fC5ssSxGK43
4 tasks
This was referenced Sep 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Real-world acceptance
Verification