Skip to content

Commit cd76519

Browse files
authored
feat: add Kimi Code plugin (#657)
Native Kimi Code plugin: systemPromptPath puts AGENTS.md into the system prompt every turn, and the six skills double as slash commands. No hooks and no Kimi-specific runtime code. Verified with Kimi Code 2.1.1 over ACP.
1 parent 926589f commit cd76519

4 files changed

Lines changed: 47 additions & 0 deletions

File tree

‎.kimi-plugin/plugin.json‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "ponytail",
3+
"description": "Lazy senior dev mode. Forces the simplest, shortest solution that actually works: YAGNI, stdlib first, no unrequested abstractions.",
4+
"author": {
5+
"name": "Dietrich Gebert",
6+
"url": "https://github.com/DietrichGebert"
7+
},
8+
"homepage": "https://github.com/DietrichGebert/ponytail",
9+
"license": "MIT",
10+
"interface": {
11+
"displayName": "Ponytail",
12+
"shortDescription": "Lazy senior dev mode: YAGNI, stdlib first, the least code that works."
13+
},
14+
"skills": "./skills/",
15+
"systemPromptPath": "./AGENTS.md"
16+
}

‎INSTALL.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ Copilot CLI namespaces plugin commands by plugin name. For example:
5656
pi install git:github.com/DietrichGebert/ponytail
5757
```
5858

59+
## Kimi Code
60+
61+
In Kimi Code, run `/plugins install https://github.com/DietrichGebert/ponytail`, then `/reload` or start a new session. The plugin puts [`AGENTS.md`](AGENTS.md) into the system prompt every turn and adds the six skills, which Kimi also offers as `/ponytail`, `/ponytail-review`, `/ponytail-audit`, `/ponytail-debt`, `/ponytail-gain` and `/ponytail-help`. Level switching (`/ponytail lite`) loads the skill for that turn; there is no persistent mode flag in Kimi.
62+
5963
## Oh My Pi (omp)
6064

6165
```bash
@@ -235,6 +239,7 @@ Jules (Google) reads `AGENTS.md` from the repository root, which this repo ships
235239
| Devin CLI | `devin plugins remove ponytail` |
236240
| Grok Build | `grok plugin uninstall ponytail` |
237241
| Pi agent | `pi uninstall ponytail` |
242+
| Kimi Code | `/plugins` in Kimi Code, then remove ponytail |
238243
| Skills CLI | `npx skills remove ponytail ponytail-audit ponytail-debt ponytail-gain ponytail-help ponytail-review` (same `--agent` / `--global` flags as the install) |
239244
| Oh My Pi (omp) | `omp plugin uninstall ponytail@ponytail`, then `omp plugin marketplace remove ponytail` |
240245
| OpenCode | `opencode plugin remove @dietrichgebert/ponytail` |

‎docs/agent-portability.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ to load in a given agent.
1818
| Kilo Code | `.opencode/plugins/ponytail.mjs` (npm), `AGENTS.md` | Kilo is built on OpenCode and runs ponytail's OpenCode plugin unchanged: add `{ "plugin": ["@dietrichgebert/ponytail"] }` to `kilo.jsonc` (project) or `~/.config/kilo/kilo.jsonc` (global). That injects the ruleset every turn, keeps `/ponytail` level switches, and registers `/ponytail-review` and the other commands. Without the plugin, Kilo still loads `AGENTS.md` from the project root or `~/.config/kilo/AGENTS.md` (instruction-tier). Verified with Kilo CLI 7.8.3, which shares its core with the VS Code extension. |
1919
| pi | `pi-extension/`, `skills/`, `hooks/` | Package extension: injects the ruleset each turn through the shared instruction builder and registers the `/ponytail` commands. |
2020
| Oh My Pi (omp) | `.claude-plugin/marketplace.json`, `pi-extension/`, `skills/` | Installs through the marketplace and runs the pi extension unchanged (omp reads the `pi` key in `package.json`). Verified with omp 18.6.1: the ruleset arrives every turn and the skills are listed. |
21+
| Kimi Code | `.kimi-plugin/plugin.json`, `AGENTS.md`, `skills/` | Native Kimi plugin: `systemPromptPath` puts `AGENTS.md` into the system prompt every turn, and the six skills double as slash commands. No hooks. Verified with Kimi Code 2.1.1 over ACP: the ruleset is in the system prompt and `/ponytail-review staged` activates the skill with its target. |
2122
| Hermes Agent | `plugin.yaml`, `__init__.py`, `skills/` | Native Hermes plugin: injects active mode through `pre_llm_call`, rewrites gateway `/ponytail-*` skill commands into agent prompts, registers `/ponytail` mode switching, and exposes bundled skills as `ponytail:<skill>`. |
2223
| Gemini CLI | `gemini-extension.json`, `AGENTS.md`, `commands/`, `skills/` | Extension manifest points `contextFileName` at `AGENTS.md` for always-on rules, and reuses the existing `commands/*.toml` and `skills/`, which Gemini CLI auto-discovers. The Claude/Codex hook map is not placed at Gemini's auto-discovered `hooks/hooks.json` path. |
2324
| Qwen Code | `gemini-extension.json`, `AGENTS.md`, `commands/`, `skills/` | `qwen extensions install DietrichGebert/ponytail:ponytail` installs through Qwen's Gemini CLI compatibility: `AGENTS.md` becomes always-on context, the six `/ponytail` commands are migrated, and the six skills are registered. The Claude/Codex lifecycle hooks are not used, so levels don't persist. Verified with Qwen Code 0.24.7 and ponytail 4.11.0 (needs 4.11.0 or later, see #1021). |

‎tests/kimi-plugin.test.js‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/env node
2+
// Kimi Code plugin manifest: AGENTS.md goes into the system prompt every turn,
3+
// skills/ gives the six skills, which Kimi also exposes as /ponytail,
4+
// /ponytail-review and so on. No hooks and no command copies: Kimi turns skills
5+
// into slash commands itself. Kimi does not read a version field, so the
6+
// manifest has none and stays out of the release bump.
7+
8+
const test = require('node:test');
9+
const assert = require('node:assert/strict');
10+
const fs = require('fs');
11+
const path = require('path');
12+
13+
const root = path.join(__dirname, '..');
14+
15+
test('Kimi manifest points at AGENTS.md and the six skills', () => {
16+
const manifest = JSON.parse(fs.readFileSync(path.join(root, '.kimi-plugin', 'plugin.json'), 'utf8'));
17+
assert.equal(manifest.name, 'ponytail');
18+
// Kimi ignores a systemPromptPath file over 32 KB.
19+
assert.ok(fs.statSync(path.join(root, manifest.systemPromptPath)).size < 32 * 1024);
20+
assert.match(fs.readFileSync(path.join(root, manifest.systemPromptPath), 'utf8'), /lazy senior/);
21+
const skills = path.join(root, manifest.skills);
22+
for (const name of ['ponytail', 'ponytail-review', 'ponytail-audit', 'ponytail-debt', 'ponytail-gain', 'ponytail-help']) {
23+
assert.ok(fs.existsSync(path.join(skills, name, 'SKILL.md')), `${name} must ship`);
24+
}
25+
});

0 commit comments

Comments
 (0)