Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .kimi-plugin/commands/ponytail-audit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
description: Audit the whole repo for over-engineering, what can be deleted
---

Audit the entire repository for over-engineering only, not correctness. Scan the whole tree, not a diff. One line per finding, ranked biggest cut first: <tag> <what to cut>. <replacement>. [path]. Tags: delete (dead code/speculative feature), stdlib (reinvented standard library), native (dependency doing what the platform does), yagni (abstraction with one implementation), shrink (same logic, fewer lines). End with the net lines and dependencies removable. If nothing to cut: 'Lean already. Ship.'
5 changes: 5 additions & 0 deletions .kimi-plugin/commands/ponytail-debt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
description: "Harvest ponytail: comments into a tracked debt ledger"
---

Harvest every `ponytail:` comment in this repository into a debt ledger so deferrals do not rot into 'later means never'. Grep the whole tree for comment markers (grep -rnE '(#|//) ?ponytail:' ., skipping node_modules/.git/build output). One row per marker, grouped by file: <file>:<line>, <what was simplified>. ceiling: <the limit named in the comment>. upgrade: <the trigger to revisit>. Tag any marker that names no upgrade path or trigger as no-trigger, those rot silently. End with the count of markers and how many lack a trigger. If none: 'No ponytail: debt. Clean ledger.' Report only, change nothing.
5 changes: 5 additions & 0 deletions .kimi-plugin/commands/ponytail-gain.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
description: Show ponytail's measured impact scoreboard (less code, cost, time)
---

Show the ponytail gain scoreboard. One shot, change nothing: do not switch mode, write flag files, or persist anything. Render the published benchmark medians (5 everyday tasks; models Haiku, Sonnet, Opus; source benchmarks/ and the README) as plain ASCII bars: Lines of code, no-skill 100% vs ponytail 6-20% (down 80-94%); Cost, no-skill 100% vs ponytail 23-53% (down 47-77%); Speed, ponytail 3-6x faster. The bar length shows the measured range, the label carries the exact figure. These are benchmark medians, not this repo. NEVER print a per-repo savings number: the unbuilt version was never written, so there is no real baseline to subtract from in a live repo. For real per-repo figures, point to /ponytail-debt (the counted shortcut ledger) and /ponytail-audit (what is still cuttable). Report only.
5 changes: 5 additions & 0 deletions .kimi-plugin/commands/ponytail-help.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
description: Quick reference for ponytail levels, skills, and commands
---

Show the ponytail quick reference. One shot, change nothing: do not switch mode, write flag files, or persist anything. Levels: /ponytail lite (build what's asked, name the lazier alternative in one line), /ponytail (full, the default ladder: YAGNI then stdlib then native then one line then minimum), /ponytail ultra (deletion before addition, challenges the requirement before building). Commands: /ponytail-review (over-engineering review of the current changes), /ponytail-audit (whole-repo over-engineering audit), /ponytail-debt (harvest ponytail: comments into a tracked ledger), /ponytail-gain (measured-impact scoreboard from the benchmark), /ponytail-help (this card). Deactivate with 'stop ponytail', 'normal mode', or /ponytail off; resume anytime with /ponytail. Default mode is full; change it with the PONYTAIL_DEFAULT_MODE environment variable (off|lite|full|ultra) or a config file at ~/.config/ponytail/config.json (Windows: %APPDATA%\ponytail\config.json) with {"defaultMode": "lite"}. Resolution order: env var, then config file, then full.
5 changes: 5 additions & 0 deletions .kimi-plugin/commands/ponytail-review.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
description: Review changes for over-engineering, what can be deleted
---

Review the current code changes for over-engineering only, not correctness. One line per finding: L<line>: <tag> <what to cut>. <replacement>. Tags: delete (dead code/speculative feature), stdlib (reinvented standard library), native (dependency doing what the platform does), yagni (abstraction with one implementation), shrink (same logic, fewer lines). End with the net lines removable. If nothing to cut: 'Lean already. Ship.'
5 changes: 5 additions & 0 deletions .kimi-plugin/commands/ponytail.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
description: Switch ponytail intensity level (lite/full/ultra/off)
---

Switch to ponytail $ARGUMENTS mode. If no level specified, use full. Lazy senior dev mode, before any code: does it need to exist at all (YAGNI)? Does the standard library do it? A native platform feature? Can it be one line? Build the minimum that works. No unrequested abstractions, no avoidable dependencies, no boilerplate. Mark deliberate simplifications that cut a real corner with a known ceiling using a ponytail: comment that names the ceiling and upgrade path.
22 changes: 22 additions & 0 deletions .kimi-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "ponytail",
"version": "4.8.4",
"description": "Lazy senior dev mode. Forces the simplest, shortest solution that actually works: YAGNI, stdlib first, no unrequested abstractions.",
"keywords": ["yagni", "minimalism", "code-review", "productivity"],
"author": {
"name": "Dietrich Gebert",
"url": "https://github.com/DietrichGebert"
},
"homepage": "https://github.com/DietrichGebert/ponytail",
"license": "MIT",
"interface": {
"displayName": "Ponytail",
"shortDescription": "Lazy senior dev mode: YAGNI, stdlib first, the least code that works."
},
"skills": "./skills/",
"commands": "./.kimi-plugin/commands/",
"systemPromptPath": "./AGENTS.md",
"sessionStart": {
"skill": "ponytail"
}
}
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,16 @@ Qoder auto-loads `AGENTS.md` from the repo root as always-on context, so running

For full plugin-tier support (automatic mode activation + ruleset injection on every prompt), add the hooks from [`hooks/qoder-hooks.json`](hooks/qoder-hooks.json) to your `.qoder/settings.json`. Replace `PONYTAIL_DIR` with the path to your ponytail checkout. Qoder's `UserPromptSubmit` hook activates the default mode on first prompt and injects the ruleset every turn; `PreToolUse` with `task|Task` matcher injects the ruleset into subagents. Level switches (`/ponytail lite|full|ultra|off`) work automatically.

### Kimi Code

```
/plugins install https://github.com/DietrichGebert/ponytail
```

Or run `/plugins`, switch to the **Custom** tab, and paste the repo URL. Run `/reload` (or `/new`) after installing.

The plugin manifest ([`.kimi-plugin/plugin.json`](.kimi-plugin/plugin.json)) ships the six skills, registers the commands from [`.kimi-plugin/commands/`](.kimi-plugin/commands/) as `/ponytail:ponytail`, `/ponytail:ponytail-review`, and so on, injects `AGENTS.md` into the system prompt, and session-starts the ponytail skill — always-on with zero setup. Level switches (`/ponytail:ponytail ultra`) last for the session. The adapter declares no hooks: Kimi Code's hook payload differs from the Claude/Codex event shapes ponytail's lifecycle hooks emit, and the system prompt plus session-start skill already cover always-on behavior.

### Antigravity CLI

Google is renaming Gemini CLI to Antigravity CLI (the `agy` binary); the same extension installs there:
Expand Down Expand Up @@ -292,6 +302,7 @@ Which files map to which agent: [Agent portability](docs/agent-portability.md).
| Host | Command |
|------|---------|
| Claude Code | `/plugin remove ponytail` |
| Kimi Code | `/plugins remove ponytail` |
| Codex | `codex plugin remove ponytail` |
| Devin CLI | `devin plugins remove ponytail` |
| Grok Build | `grok plugin uninstall ponytail` |
Expand All @@ -311,7 +322,8 @@ These remove the plugin's own files. They leave behind a small amount of state p
| `/ponytail-gain` | Show the measured impact scoreboard (less code, less cost, more speed) from the benchmark. |
| `/ponytail-help` | Quick reference for the commands above. |

Commands need a skill-capable host (Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival, Hermes Agent, Qoder, Grok Build). In Codex they're skills, invoke with `@` (`@ponytail-review`). The instruction-only adapters (Cursor, Windsurf, Cline, Copilot, Kiro, Antigravity) load the always-on ruleset without the commands.

Commands need a skill-capable host (Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival, Hermes Agent, Qoder, Grok Build, Kimi Code). In Codex they're skills, invoke with `@` (`@ponytail-review`). The instruction-only adapters (Cursor, Windsurf, Cline, Copilot, Kiro, Antigravity) load the always-on ruleset without the commands.

## Development

Expand Down
1 change: 1 addition & 0 deletions docs/agent-portability.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ to load in a given agent.
| Jules (Google) | `AGENTS.md` | Jules automatically reads `AGENTS.md` from the repository root. Instruction-tier. |
| Kiro | `.kiro/steering/ponytail.md` | Steering rule; copy globally or into a project. |
| Qoder | `.qoder/rules/ponytail.md`, `.qoder-plugin/plugin.json`, `hooks/qoder-hooks.json`, `skills/`, `AGENTS.md` | Qoder auto-loads `AGENTS.md` as always-on context; `.qoder/rules/ponytail.md` provides per-project rules; the plugin manifest points at `skills/` for the six ponytail skills (invoked as `/ponytail`, `/ponytail-review`, etc. via the Skill system). Full plugin-tier: `hooks/qoder-hooks.json` template registers `UserPromptSubmit` (mode activation + ruleset injection) and `PreToolUse` with `task|Task` matcher (subagent injection). Instruction-tier works from repo root with zero setup via `AGENTS.md`. |
| Kimi Code | `.kimi-plugin/`, `skills/`, `AGENTS.md` | Full plugin-tier install (`/plugins install https://github.com/DietrichGebert/ponytail`): the manifest in `.kimi-plugin/` reuses the six `skills/`, registers its own command copies (`.kimi-plugin/commands/*.md`, kept in sync with the OpenCode set by test) as `/ponytail:<command>`, injects `AGENTS.md` via `systemPromptPath`, and session-starts the ponytail skill. No hooks — Kimi Code's hook payload differs from the Claude/Codex event shapes ponytail's lifecycle hooks emit, so level switches live for the session. |
| Zed | `AGENTS.md` | Auto-includes `AGENTS.md` from the worktree root as one of its default rule files for the Agent Panel. Instruction-tier. |
| Generic agents | `AGENTS.md` or `skills/*/SKILL.md` | Copy the compact rule file or load the skill files directly. |

Expand Down
5 changes: 3 additions & 2 deletions scripts/check-versions.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
// Version-consistency guard. Ponytail declares its version in seven files across
// five host ecosystems, and every release bumps all of them by hand.
// Version-consistency guard. Ponytail declares its version in nine files across
// seven host ecosystems, and every release bumps all of them by hand.
//
// tests/gemini-extension.test.js already checks the four plugin manifests agree
// with each other, but that can't catch the failure mode that shipped in v4.8.0:
Expand All @@ -25,6 +25,7 @@ const VERSION_FILES = [
'.github/plugin/plugin.json', // Copilot plugin
'.qoder-plugin/plugin.json', // Qoder plugin
'gemini-extension.json', // Gemini CLI extension
'.kimi-plugin/plugin.json', // Kimi Code plugin
'package.json', // pi-package / repo root
'ponytail-mcp/package.json', // MCP server (private, internal-only)
];
Expand Down
16 changes: 13 additions & 3 deletions tests/commands.test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#!/usr/bin/env node
// Every ponytail command the pi extension registers must also ship as a
// file-based command for the hosts that need one: Claude Code (commands/*.toml,
// which Gemini CLI reuses) and OpenCode (.opencode/command/*.md). /ponytail-help
// was advertised in the README and the help card but missing both files; this
// guards that drift -- a registered command with no adapter file fails here.
// which Gemini CLI reuses), OpenCode (.opencode/command/*.md), and Kimi Code
// (.kimi-plugin/commands/*.md). /ponytail-help was advertised in the README and
// the help card but missing both files; this guards that drift -- a registered
// command with no adapter file fails here.

const test = require('node:test');
const assert = require('node:assert/strict');
Expand Down Expand Up @@ -37,3 +38,12 @@ test('every registered command ships an OpenCode .opencode/command/*.md', () =>
);
}
});

test('every registered command ships a Kimi Code .kimi-plugin/commands/*.md', () => {
for (const name of commands) {
assert.ok(
fs.existsSync(path.join(root, '.kimi-plugin', 'commands', `${name}.md`)),
`missing .kimi-plugin/commands/${name}.md`,
);
}
});
Loading