feat(plugin): publish kbagent through keboola/ai-kit, deprecate this repo's marketplace - #627
Draft
claude[bot] wants to merge 2 commits into
Draft
feat(plugin): publish kbagent through keboola/ai-kit, deprecate this repo's marketplace#627claude[bot] wants to merge 2 commits into
claude[bot] wants to merge 2 commits into
Conversation
…repo's marketplace Keboola had two Claude Code plugin marketplaces. This leaves one. The plugin SOURCE stays here in plugins/kbagent/ -- four CI gates in this repo generate and validate it against the live command tree (make skill-gen / skill-check, scripts/sync_version.py, scripts/check_command_sync.py, make version-check) and none of them exist in ai-kit. What moves is PUBLICATION: keboola/ai-kit's keboola-claude-kit marketplace carries an external git-subdir entry pointing at plugins/kbagent here, pinned to a release tag. - New `ai-kit-marketplace` release job (release-kbagent.yml), gated exactly like `homebrew` (stable tag + environment: release): jq-rewrites the kbagent entry's version + source.ref in ai-kit and opens a PR there with `gh pr create`. A PR, not a push, so ai-kit's evals see the change. No-op safe -- an entry already at this version opens nothing, and a re-run of the same tag reuses its branch. Requires a new write-scoped PAT, secrets.AI_KIT_TOKEN. - .claude-plugin/marketplace.json stays as a deprecated shim so existing installs keep resolving updates; its entry description now leads with the migration notice, which is the only in-product channel that reaches those users. Mechanically untouched otherwise (sync_version.py still round-trips it). - doctor's claude_plugin check probes both cache dirs, keboola-claude-kit first. A legacy-only install still passes, with reinstall instructions appended. - Install commands updated in AGENT_CONTEXT, README, TUTORIAL, use-cases, CLAUDE.md, CONTRIBUTING (sync-map rows + a post-tag release step), SKILL.md and the plugin's CLAUDE.md. Before: /plugin marketplace add keboola/cli + /plugin install kbagent@keboola-agent-cli After: /plugin marketplace add keboola/ai-kit + /plugin install kbagent@keboola-claude-kit
v0.87.0 was tagged and released from main (PR #626, the `data-app create` --workspace flag), so this branch's own 0.87.0 changelog entry collided with a published, immutable release. Resolved by moving the ai-kit publication entry to 0.88.0 and bumping pyproject.toml accordingly; main's 0.87.0 entry is kept verbatim. Conflict: src/keboola_agent_cli/changelog.py -- both sides added a "0.87.0" key. Kept both sets of bullets, under the versions the repo's one-entry-per- release convention implies. CONTRIBUTING.md's "planned removal ~3 releases after 0.87.0" note follows the shim's actual ship version to 0.88.0. plugin.json / marketplace.json / uv.lock regenerated with `make version-sync`; SKILL.md re-checked with `make skill-gen` (no change -- the command tree did not move). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RiYtKRNF8XDx3dDZAAeBGV
claude Bot
pushed a commit
that referenced
this pull request
Aug 21, 2026
The next-steps hint hardcoded the Claude Code marketplace and plugin names (`keboola/cli` / `kbagent@keboola-agent-cli`). #627 moves the marketplace listing to keboola/ai-kit and does not touch install.sh, so the hardcoded pair would merge silently and then advertise deprecated names. Point at `kbagent doctor` instead, which already prints the current `/plugin` commands and is updated by #627 -- correct under either merge order.
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.
Requested by Jordan Burger · Slack thread
What it does
Keboola had two Claude Code plugin marketplaces; this leaves one —
keboola-claude-kitinkeboola/ai-kit— and turns this repo's marketplace into a deprecated shim that still serves existing installs.Before / After
Before. Installing the kbagent plugin meant adding this repo as a marketplace. Keboola therefore advertised two competing marketplaces, and a user had no way to tell which was the real one.
After. One marketplace,
keboola-claude-kit, published fromkeboola/ai-kit. The old commands keep working for now; the new ones are what every doc,kbagent context, andkbagent doctortell you.How
The plugin source stays here, in
plugins/kbagent/. Four CI gates in this repo generate and validate those files against the live command tree —make skill-gen/make skill-check,scripts/sync_version.py,scripts/check_command_sync.py,make version-check— and none of them exist in ai-kit, so moving the files would trade one marketplace for a permanent drift risk. What moves is publication: ai-kit's marketplace carries an externalgit-subdirentry pointing atplugins/kbagentin this repo, pinned to a release tag, and a new release job repoints that entry on every stable tag.The syncing mechanism
.github/workflows/release-kbagent.ymlgains anai-kit-marketplacejob, gated exactly like the existinghomebrewjob (needs: [version, freeze, publish-s3], non-prerelease,refs/tags/,environment: release). It checks outkeboola/ai-kitwith a new write-scoped PAT,jq-rewrites thekbagententry'sversionandsource.ref, and opens a PR withgh pr createrather than pushing tomain, so ai-kit's Tier 0 / Tier 1 evals see the change before it ships.Properties worth knowing:
version+source.refvalues before touching the file (jq re-emits the whole document with its own indentation, so agit diffalone would open empty PRs), and exits 0 when they already match. Re-running a tag is free.kbagententry is missing in ai-kit — that means the entry was never registered or was reverted, and silently publishing nothing would be worse.CONTRIBUTING.md's release checklist grows a step 13 saying so, and the sync map grows a row.The deprecation shim, and how long it lives
.claude-plugin/marketplace.jsonis kept, mechanically intact, so existing installs keep resolving updates. The only change is that thekbagententry'sdescriptionnow leads with the migration notice:That description string is what
/pluginlistings show, which makes it the only in-product channel that reaches people already installed from here.scripts/sync_version.pystill round-trips the file (it only writesversion; verified), somake version-checkstays green and the file is untouched in thegit diff --exit-codepath lists in theMakefileand this workflow.Intended lifetime: about three releases. Then drop the entry and leave a
renames: {"kbagent": null}tombstone. Note thatrenamescannot redirect across marketplaces — it only renames within one — so there is no mechanism that migrates an installed user automatically. The migration is necessarily a manual two-line user action, which is exactly why the notice lives in the description and whydoctornags.doctorand the docsdoctor'sclaude_plugincheck now probes both cache dirs, new first:~/.claude/plugins/cache/keboola-claude-kit/kbagent, then the legacy~/.claude/plugins/cache/keboola-agent-cli/kbagent. A plugin found only under the legacy dir still passes — it works and it updates — but the message appends reinstall-from-ai-kit instructions. Thewarnmessage for a missing plugin prints the two new/pluginlines. Three new tests cover the legacy-dir pass, the both-dirs-present preference, and an empty legacy root.AGENT_CONTEXT(kbagent context),README.md,docs/TUTORIAL.md(including the cache path),docs/use-cases.md,plugins/kbagent/skills/kbagent/SKILL.md,plugins/kbagent/.claude-plugin/CLAUDE.md.CLAUDE.md's "This repo doubles as a Claude Code plugin marketplace" framing is rewritten to "the plugin lives here and is published throughkeboola/ai-kit", including why the source stays and why the shim must not be deleted.Version bump
Bumped
0.86.0→0.87.0with a changelog entry, viamake version-sync(no hand-edits to__init__.py/plugin.json). Reasoning:CONTRIBUTING.mddefines a release as "whenever you bumppyproject.toml's version", and the merged history shows user-facing code changes bumping (#615, #616) while CI-only and docs-only changes do not (#610, #617). This changes user-visibledoctorandcontextoutput and the install command every user types, so it is on the bump side. The changelog entry leads withChange (install path):— deliberately notBREAKING:, because nothing breaks today.Coordination
kbagententry inkeboola-claude-kit. Until it lands, the commands this PR documents do not resolve, and theai-kit-marketplacejob would fail its missing-entry guard.secrets.AI_KIT_TOKENmust be provisioned in thereleaseenvironment before the next release, scoped to contents + pull-requests onkeboola/ai-kitonly. Without it the new job fails (the rest of the release still ships, and no ai-kit PR appears — which is the symptom to look for).Overlap with #625
Draft PR #625 (
feat/kbagent-setup-slash-command, adds/kbagent:setup) touches six of the same files in the same hunks:README.md,docs/TUTORIAL.md,src/keboola_agent_cli/commands/context.py,install.sh,plugins/kbagent/skills/kbagent/SKILL.md,plugins/kbagent/.claude-plugin/CLAUDE.md. I read its diff and kept the edits here surgical — in those six files this PR changes the marketplace/install command lines and nothing adjacent, and the two additions that are not command-line swaps (SKILL.md, pluginCLAUDE.md) are appended clear of #625's hunks.#625 landing first is fine and preferred. Two notes for whoever rebases second:
install.shon currentmaindoes not mention the marketplace, so this PR leaves it alone. feat(plugin): add /kbagent:setup one-command first-run setup #625 adds a/plugin marketplace add keboola/cli, /plugin install kbagent@keboola-agent-cliline to its "Next steps" output — that line needs the new marketplace/plugin names, whether it is fixed in feat(plugin): add /kbagent:setup one-command first-run setup #625 or in a follow-up here.CLAUDE.mdwill conflict: feat(plugin): add /kbagent:setup one-command first-run setup #625 edits the surfaces sentence in the section this PR rewrites wholesale. Keep both — the rewritten framing plus feat(plugin): add /kbagent:setup one-command first-run setup #625's updated surface list.Validation
make checkminuschangelog-check(that target shells out togh, which is not installed in the environment this was authored in): lint, format-check, typecheck,skill-check,version-check,command-sync-check,check-error-codes,check-sentinel-guardsandloc-checkall green. Unit suite: 5690 passed; the only two remaining failures aretest_config_store.py::TestPermissionDenied, which fail identically with pristinemainfiles because the authoring environment runs as uid 0 and root ignores thechmodthose tests rely on. Workflow YAML parses; everyrun:block passesbash -n; the bump step's four branches (already-current, new version, missing entry, missing file) were executed against a simulated ai-kit marketplace file.jq . .claude-plugin/marketplace.jsonis valid andscripts/sync_version.pyround-trips it byte-for-byte.Not in this PR
.claude-plugin/marketplace.jsonor itskbagententry, and therenamestombstone — deliberately deferred ~3 releases.keboola/ai-kit(companion PR) or to feat(plugin): add /kbagent:setup one-command first-run setup #625.doctor's JSON output; the signal is prose inmessageonly. Worth adding if anything wants to act on it programmatically.