Skip to content

feat(plugins): ship Agent Plugins v1.0.0 portable package - #91

Open
crmapj wants to merge 16 commits into
mainfrom
agent/agent-plugins-standard
Open

crmapj wants to merge 16 commits into
mainfrom
agent/agent-plugins-standard

Conversation

@crmapj

@crmapj crmapj commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds portable Agent Plugins v1.0.0 packaging so any conforming client can load this repo as a plugin without harness-specific manifests.

  • Portable floor: root plugin.json + root mcp.json (stdio dataikush ${PLUGIN_ROOT}/bin/launcher.sh) + existing skills/
  • Additive migration: keep .claude-plugin/, .codex-plugin/, and .mcp.json as parallel legacy packaging (not reverse-domain Agent Plugins extensions)
  • Launcher: prefer standard PLUGIN_ROOT / PLUGIN_DATA, fall back to Claude vars, then local checkout .deps/
  • Release lockstep: include portable plugin.json in Commitizen version_files (version-key selector so schema 1.0.0 URLs are not rewritten) and bump.yml verification
  • Release atomicity: bump with push: false, verify manifests + $schema URLs, then push commit/tags

How we ship plugins today vs after this PR

Surface Before After
Claude Code .claude-plugin/ unchanged + portable core available
Codex .codex-plugin/ unchanged + portable core available
Contributor dogfood .mcp.json unchanged
Agent Plugins clients n/a root plugin.json + mcp.json + skills/

Reviews

Adversarial review — GPT-5.6 Sol @ xhigh (cbrain job 414bbe8c-…)

Verdict on first pass: REQUEST CHANGES. Findings addressed in the follow-up commit:

Severity Finding Resolution
Blocker tomllib import breaks Python 3.10 CI collection Use importlib.metadata.version instead
High Manifest verify ran after remote push/tag push: false → verify → explicit push
Medium Happy-path-only tests Schema-selector sim, stricter cwd, local fallback, launcher path existence
Medium AGENTS.md stale Updated
Medium / residual Credentials still under ~/.dataiku, not PLUGIN_DATA Accepted residual — changing config location is a separate behavior change; runtime/cache already use PLUGIN_DATA
Residual Windows/sh Documented POSIX assumption for portable MCP

Spec checklist from Sol: portable manifest, skills discovery, closed stdio MCP, placeholders, reserved env names, schema-version match — Pass. Release atomicity and partial PLUGIN_DATA state were the only fail/partial items; atomicity is fixed, credential path is deferred.

Thermo-nuclear code quality review

Bar Result
File-size explosion (>1k) No — only small packaging/docs/tests
Spaghetti / special-case growth in shared paths No — launcher change is a clear precedence chain
Unnecessary abstraction No — plain JSON + stdlib tests
Code-judo opportunity Multi-harness MCP launch config remains duplicated by design (incompatible client schemas); consolidating would break Claude/Codex. Acceptable for additive migration.
Wrong-layer logic No

Thermonuclear verdict: approve structure as-is for an additive packaging PR; no restructure required before merge.

Test plan

  • uv run pytest (161 passed)
  • uv run pytest tests/test_agent_plugins.py
  • sh -n bin/launcher.sh
  • uv run ruff check tests/test_agent_plugins.py
  • uv run cz check --rev-range origin/main..HEAD
  • CI green on this PR (3.10–3.14 matrix)
  • Optional: install via a harness that supports Agent Plugins and confirm skill + MCP load

Residual risks (not blocking)

  1. Credential file location still prefers ~/.dataiku/config.json rather than ${PLUGIN_DATA}/config.json. Uninstall does not remove profiles. Follow-up if portable clients need sandboxed lifecycle-bound config.
  2. Harness manifests remain non-portable (.claude-plugin/, etc.). Intentional parallel packaging until those clients load root Agent Plugins natively.
  3. Portable stdio MCP assumes POSIX sh, matching existing Claude/Codex launchers.

crmapj added 2 commits August 6, 2026 18:08
Add root plugin.json and mcp.json so clients that implement the open
Agent Plugins standard can discover skills and the stdio MCP server
without harness-specific manifests. Keep Claude/Codex packages as
additive compatibility layers, honor PLUGIN_ROOT/PLUGIN_DATA in the
launcher, and lock the portable version into release bump verification.
Address Sol/xhigh adversarial findings: drop tomllib so 3.10 CI can
collect tests, verify manifests before pushing release tags, lock
schema URL rewrites, and cover version-selector + local-fallback cases.
@crmapj
crmapj marked this pull request as ready for review August 6, 2026 18:40
crmapj added 2 commits August 6, 2026 19:08
CI pre-commit failed because ruff-format rewrote tests/test_agent_plugins.py.
Comment thread mcp.json Outdated
"command": "sh",
"args": ["${PLUGIN_ROOT}/bin/launcher.sh"],
"env": {
"UV_CACHE_DIR": "${PLUGIN_DATA}/uv-cache"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@crmapj do we not need the env vars that are present in the Codex/Claude plugin jsons?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked - this isn't supported by the Agent Plugin standard atm.

@nmartorell

Copy link
Copy Markdown
Contributor

@hanneshapke would you be able to review the changes to bump.yml, RELEASE.md and pyproject.toml?

crmapj and others added 5 commits August 26, 2026 08:29
Add root plugin.json and mcp.json so clients that implement the open
Agent Plugins standard can discover skills and the stdio MCP server
without harness-specific manifests. Keep Claude/Codex packages as
additive compatibility layers, honor PLUGIN_ROOT/PLUGIN_DATA in the
launcher, and lock the portable version into release bump verification.
Address Sol/xhigh adversarial findings: drop tomllib so 3.10 CI can
collect tests, verify manifests before pushing release tags, lock
schema URL rewrites, and cover version-selector + local-fallback cases.
CI pre-commit failed because ruff-format rewrote tests/test_agent_plugins.py.
@ludwigehlert-gif
ludwigehlert-gif force-pushed the agent/agent-plugins-standard branch 2 times, most recently from c0e11c1 to d1cb7e2 Compare September 14, 2026 21:36
ludwigehlert-gif added a commit that referenced this pull request Sep 14, 2026
Kiro's IDE installs Agent Plugins v1.0.0 packages as powers, so make the
repository root one: root plugin.json and mcp.json alongside the existing
skills/. Kiro copies the whole package to ~/.kiro/powers/<name>/ minus .git,
so ${PLUGIN_ROOT}/runtime/run_mcp.py resolves after install. ${PLUGIN_ROOT} is
expanded in args and cwd but never in command, so the command stays a plain
PATH lookup.

Keep .kiro/settings/mcp.json for Kiro CLI, which has no power install and no
skill loader: it reads the workspace MCP config and takes context from
steering and AGENTS.md instead.

Add the portable manifest to Commitizen version_files with a "version" key
selector; the plain form rewrites the 1.0.0 schema URLs once [project].version
reaches 1.0.0.

Note: root plugin.json, mcp.json and tests/test_agent_plugins.py duplicate #91,
which ships the same portable package. Whichever lands first makes the other a
trivial resolution.
ludwigehlert-gif added a commit that referenced this pull request Sep 15, 2026
The Kiro IDE installs Agent Plugins v1.0.0 packages as powers, so make the
repository root one: root plugin.json and mcp.json alongside the existing
skills/. Kiro copies the whole package to ~/.kiro/powers/<name>/ minus .git,
so ${PLUGIN_ROOT}/runtime/run_mcp.py resolves after install. ${PLUGIN_ROOT} is
expanded in args and cwd but never in command, so the command stays a plain
PATH lookup.

Kiro CLI is out of scope: it has no power install and no skill loader.

Add the portable manifest to Commitizen version_files with a "version" key
selector; the plain form rewrites the 1.0.0 schema URLs once [project].version
reaches 1.0.0.

Note: root plugin.json, mcp.json and tests/test_agent_plugins.py duplicate #91,
which ships the same portable package. Whichever lands first makes the other a
trivial resolution.
ludwigehlert-gif added a commit that referenced this pull request Sep 15, 2026
Stacked on #91, which ships the portable Agent Plugins package. Kiro's IDE
installs that package as a power, so this adds only what is Kiro-specific.

- README: how to install the power, where Kiro puts it, and that Kiro CLI
  cannot install one. Record that Kiro passes only HOME, PATH, SHELL, TERM,
  USER and LOGNAME to an MCP subprocess, so shell exports of DKU_DSS_URL /
  DKU_API_KEY never reach the server and ~/.dataiku/config.json is the path
  that works.
- plugin.json: add displayName so the Powers panel shows a real name, and
  narrow keywords to dataiku and cobuild — Kiro activates a power on keyword
  match, and mcp/agent are broad enough to trigger it on unrelated work.
- Allow displayName in the manifest contract test; Kiro's loader accepts it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants