feat(test): host-install proof level with real Claude, Codex, and Cursor install proofs (#100 stage 3) - #242
Merged
Merged
Conversation
…sor install proofs Binary-gated real-host installs into isolated homes through the public install path, observed via each host's own CLI. Fixes emitted 'plugin marketplace add .' to './' (Claude Code 2.1.257 rejects bare '.').
Claude: opt-in real-session proof that $ARGUMENTS, ${CLAUDE_PLUGIN_ROOT},
and ${CLAUDE_SKILL_DIR} resolve in one claude -p turn with the bundle
loaded via --plugin-dir (observed 2.1.257; a real turn rewrites
.claude.json, so the guard pins settings and installed plugins).
Codex: installed cache carries a byte-identical schema-valid
agents/openai.yaml sidecar and the manifest interface block.
Cursor: installed hooks/mcp documents keep ${CURSOR_PLUGIN_ROOT}
unresolved; no non-interactive session surface exists, recorded as the
honest ceiling.
🦋 Changeset detectedLatest commit: 189f129 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
commit: |
This was referenced Sep 1, 2026
Generated plugin contract matrix: catch source→artifact→dev→installed-host drift before release
#218
Closed
Merged
ScriptedAlchemy
added a commit
that referenced
this pull request
Sep 3, 2026
…st-install proof #364 made the Codex adapter honor plugin.logo (interface.logo + shipped image). The host-install fixture declares plugin.logo, so the binary-gated Codex host-install proofs started failing on the interfaceFields key list. #368 fixed the built-bundle proof; this brings the packed-tarball proof (packed-host-install-proof.test.ts) in line. Test-expectation-only; product behavior is unchanged. Found by the #181/#242 closed-issue re-verification.
ScriptedAlchemy
added a commit
that referenced
this pull request
Sep 3, 2026
…st-install proof (#367) #364 made the Codex adapter honor plugin.logo (interface.logo + shipped image). The host-install fixture declares plugin.logo, so the binary-gated Codex host-install proofs started failing on the interfaceFields key list. #368 fixed the built-bundle proof; this brings the packed-tarball proof (packed-host-install-proof.test.ts) in line. Test-expectation-only; product behavior is unchanged. Found by the #181/#242 closed-issue re-verification.
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
Closes the stage-3 slice of #100 — real-install proofs per host, binary-gated with honest skips — and carries #108's deferred real-host token proofs. Extends #181's install machinery (#195) with a proof lane.
The
host-installproof level (label is load-bearing)One shared fixture (
tests/fixtures/host-install: 1 skill, 1 sessionStart hook, 1 MCP server, all three targets) built ONCE per run with the source-built CLI; every proof spawnsnode dist/cli.js install <host>— the exact #195 delegation path — into an isolated home. No new pack, no model calls in the default lane.install claudewith isolatedCLAUDE_CONFIG_DIR→ realclaude plugin marketplace add+plugin install --scope user; assertsplugin list --jsonrow (id, version, scope, enabled, installPath in the isolated cache, mcpServers) andplugin detailscomponent inventory Skills/Hooks/MCP = 1/1/1; cache physically containsskills/probe/SKILL.mdinstall codexwith isolatedCODEX_HOME→ realcodex plugin marketplace add+plugin add; assertscodex plugin listinstalled+enabled, cache tree, byte-identical schema-validagents/openai.yamlskill sidecar, and the manifestinterfaceblockinstall cursorwith isolatedHOME→ placement at.cursor/plugins/local/<name>, plugin/hooks/mcp documents validated against the pinned schemas,${CURSOR_PLUGIN_ROOT}kept unresolved in installed hooks/mcp documents, idempotent re-install returnsalready-installed#108 token proofs (real session, opt-in)
AGENT_BUNDLE_HOST_INSTALL_CLAUDE_SESSION=1+ claude binary gates one realclaude -pturn (sonnet,--plugin-dirinline load, ≤2 attempts hard ceiling) against a Claude-only token fixture. Observed on Claude Code 2.1.257:$ARGUMENTS→ the exact invocation arguments,${CLAUDE_PLUGIN_ROOT}→ the loaded bundle root,${CLAUDE_SKILL_DIR}→<bundle>/skills/token-probe. An always-on (model-free) test pins the lowering: canonical tokens → Claude spellings, no canonical/foreign syntax leaks. Two real-host facts recorded honestly:.claude.json; the session guard pins the settings + installed-plugins surface instead (normalClaudeSettingsAndPluginsUnchanged), andnormalClaudeHomeUnchangedis unchanged for its existing caller.targets:carries per-host extensions, not host restriction), so a token-bearing skill cannot ship in a project that also targets Codex/Cursor (AB3008) — hence the separate Claude-only fixture. Worth a follow-up issue.sessionEvidence: unavailable.Real-binary defect fixed
Claude Code 2.1.257 rejects the emitted
claude plugin marketplace add .("Invalid marketplace source format");./and absolute paths work. Emitted INSTALL.md now uses./for Claude and Codex (codex accepts both — verified), with dated capability-evidence notes;installBundle's absolute-path delegation was already correct.CI
native-host-smoke.ymlgains a host-install step per matrix host and a Claude-only session-token step.test:host-install*scripts mirror the packed-native naming. The proof test is classified in the integration pool: cursor lane runs everywhere, claude/codex lanes auto-skip where binaries are absent.Test plan
pnpm typecheck,pnpm lint(874 files, 0 errors/warnings)packed-native-smoke.test.tsClaude packed proof fails on clean main under npm 12.0.2 (npm pack --jsonshape change inshared-pack.ts) — pre-existing, unrelated, fix rides the Generate an Agent Bundle framework test harness on top of Rstest #103 s4 lane.Changeset: minor.