Repository navigation
feat: install Kimi Code from the GitHub URL via a root manifest [DITTO-1799] - #19
Conversation
✅ Ditto reviewed
|
There was a problem hiding this comment.
Ditto Review
No blocking issues found · risk: medium · 140fac0
File coverage: 2 fully reviewed, 0 reviewed briefly, 0 not reviewed.
Enable Kimi Code installs from the repository’s GitHub URL — Adds a repository-root Kimi manifest that points to Ditto’s skills under
plugins/ditto, enabling installation directly from the GitHub URL, and updates the Kimi installation guidance. Extends package validation and shared-skill generation so the root manifest stays aligned with the plugin manifest and is versioned with it; reviewers should look closely at that synchronization and validation logic. Also bumps Ditto’s host-manifest versions and updates the shared-skills lock metadata.
Walkthrough (8 files)
| File | Change |
|---|---|
.kimi-plugin/plugin.json |
Adds a root-level Kimi manifest that exposes Ditto’s hosted MCP server and points to plugins/ditto/skills. |
CONTRIBUTING.md |
Documents how Kimi’s root-manifest installation differs from other plugins. |
README.md |
Replaces the local-only Kimi instructions with GitHub installation steps and explains the root manifest. |
plugins/ditto/.{antigravity-plugin,claude-plugin,codex-plugin,cursor-plugin,.github/plugin,.grok-plugin,.kimi-plugin}/plugin.json |
Bumps Ditto’s version to 0.3.7 across its host-specific manifests. |
plugins/ditto/shared-skills.lock.json |
Updates the shared-skills source commit and generator digest. |
scripts/shared_skills.py |
Adds support for registered root host manifests and includes them in manifest version bumps during skill generation. |
scripts/validate_package.py |
Validates that the root Kimi manifest matches the plugin manifest except for its rebased skills path, and rejects missing or linked inputs. |
tests/test_package.py |
Adds coverage for root Kimi manifest consistency, missing files, and symlink rejection. |
Review details
- Models: review
z-ai/glm-5.3-flash· verifyopenai/gpt-6-luna - Findings: 0 candidates → 0 verified → 0 posted
- Context index: 38 files · 15 changed symbols · 74 references
- Tokens: 219726 in / 14310 out · $0.02
- Incremental since
51d16bb - Run:
b85e2394-195a-4fd8-9e24-872949e79543· engine v2.0.0 · details - Ditto approves or requests changes in a separate review (blocking: 🟠 High and above). Inference is billed through your Ditto Router endpoint.
Open in Ditto · reply @ditto review to re-run · @ditto fix to push fixes
✅ Ditto reviewed
|
|
Ditto Review follow-up. The generator fixes are in ditto-assistant/ditto-skills#15 at
|
The base branch was changed.
…O-1799] Kimi Code reads a GitHub URL only from the repository root (kimi.plugin.json or .kimi-plugin/plugin.json). Its documented URL forms take a ref (tree/<ref>, releases/tag, commit) but no subdirectory, and a marketplace entry's source is again a repository, zip or local path. Add a root .kimi-plugin/plugin.json that is the plugin's own Kimi manifest with `skills` rebased to ./plugins/ditto/skills. No other host reads that path. The validator requires the root manifest to equal plugins/ditto/.kimi-plugin/plugin.json apart from that one path, so the two cannot drift. The vendored generator comes from ditto-skills 47d6b32, which versions root manifests listed under "root_manifests" in scripts/plugins.json with their plugin. README documents the GitHub install. All manifests move to 0.3.7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Picks up the Ditto Review fixes in ditto-skills#15: non-string root manifests are a registry error, and an unclaimed root manifest fails the build instead of keeping its version. No skill bytes change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
07559a7 to
6fcbbd4
Compare
✅ Ditto reviewed
|
Path.is_file() follows links, and the root manifest sits outside the plugin-tree scan that already refuses them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
✅ Ditto reviewed
|
… [DITTO-1799] Check every path component under the repository root, not only the manifest file, so a symlinked .kimi-plugin directory is refused too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
✅ Ditto reviewed
|
Summary
/plugins install https://github.com/ditto-assistant/ditto-pluginsnow works in Kimi Code. It finds 3 skills and the MCPplugin-ditto:ditto, which shows as needing auth. Onmainthe same command fails withNo manifest at kimi.plugin.json or .kimi-plugin/plugin.json(reproduced with Kimi Code 2.4.1).Change: a root
.kimi-plugin/plugin.json. It is the plugin's ownplugins/ditto/.kimi-plugin/plugin.jsonwith one change:skillsis["./plugins/ditto/skills"]. The MCP server stays declared inline. The README now gives the GitHub install, replacing the clone-only note. All manifests bump to 0.3.7.Why a root manifest
Kimi's plugin docs give no subdirectory option:
<plugin_root>/kimi.plugin.jsonor<plugin_root>/.kimi-plugin/plugin.json./tree/<ref>,/releases/tag/<tag>and/commit/<sha>. They take a ref but no subdirectory.sourceis again a local path, a zip URL or a GitHub URL, so it doesn't help either.That leaves the ticket's fallback, a root manifest. Kimi copies the whole checkout to
plugins/managed/dittoand loads skills from the rebased path. The repository has no releases or tags, so the bare URL resolves to the default branch.The root manifest doesn't change the other hosts. None of them reads
.kimi-plugin/, and every install below still behaves as on DITTO-1800: Antigravity still reports "Found bulk plugins directory" andsource: antigravity.Validator and generator
validate_package.pyrequires the root manifest to equal the plugin's Kimi manifest apart from the rebasedskillspath. A drifted version, MCP URL or skills path fails, and so does a missing file. 13 tests (was 12).scripts/shared_skills.pyis the byte-identical copy from ditto-assistant/ditto-skills#15 (headb65d94a, which includes the Ditto Review fixes). That version bumpsroot_manifestsfromscripts/plugins.jsonalong with the plugin.shared-skills.lock.jsonwas regenerated withbuild --source <ditto-skills@b65d94a>; onlysource_commitandgenerator_sha256changed, and no skill bytes changed.Repo checks: unittest 13 OK.
validate_package.py: 19 files.shared_skills.py verify --host plugins --repo .: 3 skills (also with--source).Host results
Each CLI ran in its own throwaway HOME, with no host sign-in and no Ditto OAuth. Branch head
af845df. After the generator re-vendor (07559a7), I re-ran Kimi (GitHub and local), agy and Claude: same results.…/ditto-plugins/tree/<branch>("Installed Ditto 0.3.7 from github …@")plugin-ditto:dittoneeds authplugins/dittofrom a fresh clonevalidate --strictpasses…/tree/<branch>source: antigravity--strict+ marketplace pass#<branch>--ref <branch>.git#<branch>mcp get ditto: Source: Pluginplugin validatepassesgemini-extension.json(unchanged; DITTO-1798)Limitations
/tree/<branch>. The barehttps://github.com/ditto-assistant/ditto-pluginsreadsmain, so it only works after merge./plugins install, choose "Trust and install", then run/plugins listand/mcp.dittoonly. A second plugin installs in Kimi from a clone, as CONTRIBUTING.md now says.Stack: based on #18 (DITTO-1800). Related: ditto-assistant/ditto-skills#15.
🤖 Generated with Claude Code