Commit Graph
147 Commits
Author SHA1 Message Date
DietrichGebertandClaude Opus 4.8 e733c6b40b docs: commands reference + portability accuracy (#41)
* docs: add a Commands reference to the README

The commands were only mentioned scattered through prose, and two install
blurbs had gone stale (OpenCode omitted /ponytail-debt, Gemini omitted audit
and debt). Add one canonical Commands table (all five commands + what each
does + which hosts support them) and point the install blurbs at it so they
stop drifting as commands are added.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: add pi to the portability table, de-stale the Gemini row

pi was a supported integration (pi-extension, README install, registers all
the commands) but had no row in the Supported Adapters table. The Gemini row
also enumerated an outdated command list; point it at commands/*.toml
generically so it stops drifting.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 02:44:43 +02:00
DietrichGebertandClaude Opus 4.8 d9e1480c74 feat: add ponytail-debt skill (#40)
Closes the last gap from the field review: deferral creep. /ponytail-debt
greps the repo for `ponytail:` comment markers and prints a ledger
(file:line, what was simplified, ceiling, upgrade trigger), flagging any
marker with no trigger as the rot risk. One-shot, reports only.

Full parity like ponytail-audit: skill + commands/.toml + .opencode/.md + pi
registerCommand (+ test) + agent-portability + README.

Verified: tests 32/32 (pi command list updated), rule check green, the scan
finds the repo's real markers, and a live end-to-end run produced a correct
ledger (2 markers, 1 no-trigger, prose/examples excluded).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 02:32:45 +02:00
DietrichGebertandClaude Opus 4.8 f3da910b4f feat: refine ruleset from a full-project field review (#39)
* feat: refine ruleset from a full-project field review

A reviewer ran ponytail across a 9-phase rewrite (protocol, PC app, simulator,
RPi daemon, ESP32 firmware) and flagged three gaps. All three land in SKILL.md
and propagate to AGENTS.md + the rule copies:

- Promote the one-runnable-check rule to a headline ("Lazy code without its
  check is unfinished"), enforced as a check-rule-copies invariant.
- Hardware carve-out in "When NOT to be lazy": a real device is never the spec
  ideal (clock drift, sensor offset), leave the calibration knob.
- Clarify the Output rule: explanation the user explicitly asked for is not
  debt, only unrequested prose is.

Fallback instructions kept in sync. Rule-copy check + tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: add a behavior gate proving the refinements actually fire

The refinements were verified as injected text, but injected != behavioral.
This adds a behavior eval that probes each refined rule on a task that should
trigger it:

- hardware    -> does the output leave a calibration knob?
- explanation -> when a write-up is explicitly requested, is it given in full?
- onecheck    -> is a runnable check left behind?

benchmarks/behavior.yaml runs the probes (baseline vs ponytail arm); the
grader benchmarks/behavior.js is proven by tests/behavior.test.js (8 cases,
RED/GREEN, no API key, runs in CI). Live-confirmed: the model under the
current ruleset passes all three gates, graded by the same grader.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 02:02:50 +02:00
DietrichGebertandClaude Opus 4.8 b545f1536a chore: bump version to 4.3.0 (#38)
Release-prep bump across the Claude Code, Codex, and Gemini manifests.
Cutting v4.3.0 also fixes #33: gemini extensions install pulls the latest
GitHub release, and gemini-extension.json was added after v4.2.0, so it
was missing from the release tarball. Shipping it in a release fixes the
plain install command.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v4.3.0
2026-06-15 00:01:51 +02:00
DietrichGebertandClaude Opus 4.8 01578c0cd4 fix: honor CLAUDE_CONFIG_DIR in hooks (#37)
ponytail-activate.js and ponytail-runtime.js hardcoded ~/.claude for the
flag file and settings lookup, ignoring CLAUDE_CONFIG_DIR. Add a shared
getClaudeDir() to ponytail-config.js and use it in both. Regression test
added to hooks.test.js.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 00:00:01 +02:00
at384 6d990f8c54 feat(benchmarks): add correctness assertion (#31)
* feat(benchmarks): add correctness assertion - proves less code is not broken code

The existing benchmark measures lines-of-code (loc.js) but never checks
whether the generated code actually works. This adds a functional
correctness gate (correctness.js) that extracts code from fenced blocks
and runs per-task checks:

- email validator: spawns Python, asserts accept/reject on 5 inputs
- debounce: spawns Node, asserts delayed execution + reset on re-call
- csv sum: spawns Python with a test CSV, asserts correct total (351)
- countdown (React): structural check (useState + useEffect + decrement)
- rate limiter (FastAPI): structural check (limit logic + framework usage)

12 unit tests (node:test) cover good/bad outputs for every task plus the
unknown-task edge case. Existing tests and rule-copy checks unaffected.

* fix: address review feedback

- csv check: use regex lookaround instead of substring match to prevent
  false positives (e.g. 13510 containing '351')
- ratelimit: fix operator precedence in block finder by adding parens
  around the || inside the !b.lang guard
- README: note that React/FastAPI checks are structural only, add
  prerequisites section (Python 3, pandas, Node.js 18+)
- test: add regression test for csv substring false positive
2026-06-14 23:42:01 +02:00
DietrichGebertandClaude Opus 4.8 94d231cd32 docs: document Antigravity and VS Code Codex extension support (#36)
Both read AGENTS.md, which the repo already ships, so ponytail works
from the repo root with no extra setup. Add agent-portability rows and a
README note. Instruction-tier (no /ponytail levels or hooks).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 23:40:53 +02:00
DietrichGebertandClaude Opus 4.8 16319c7bc9 docs: document GitHub Copilot CLI support (#30)
Copilot CLI already reads AGENTS.md and .github/copilot-instructions.md
(both shipped), plus a global ~/.copilot/copilot-instructions.md. Add an
agent-portability row and a README note. Instruction-tier only: no
/ponytail levels or hooks.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 18:27:21 +02:00
Ben YounesandClaude Opus 4.8 e01aa900f7 feat: add Gemini CLI support (#25)
* feat: add Gemini CLI support

Add a thin Gemini CLI extension adapter (closes #22). The manifest points
contextFileName at the existing AGENTS.md for always-on rules and reuses the
repo's commands/*.toml (/ponytail, /ponytail-review) and skills/, which Gemini
CLI auto-discovers — no rule text is duplicated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: read manifest inside cases for a clean RED

The manifest was parsed at module scope, so reverting the adapter crashed the
whole test file at load (ENOENT) and collapsed all four cases into one
unreadable failure. Read it inside each case via a helper that asserts existence
first, so a missing or malformed manifest surfaces as clear per-case assertion
failures instead of a stack trace.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 17:50:02 +02:00
Ben YounesandClaude Opus 4.8 147bcfd621 fix: use PowerShell $env: syntax for Windows hook paths (#26)
On Windows the lifecycle hooks run via PowerShell, which does not expand
cmd.exe-style %CLAUDE_PLUGIN_ROOT%. The path was passed literally, so the hook
launcher could not find the script and both SessionStart and UserPromptSubmit
failed with exit code 1 (issue #19). Switch the two commandWindows entries to
$env:CLAUDE_PLUGIN_ROOT, keeping the working node + .js invocation.

Add a regression test that rejects cmd.exe %VAR% syntax in commandWindows and
asserts every hook command points at a script that actually ships in hooks/.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 17:39:59 +02:00
92efc4a648 feat: add ponytail-audit skill (#20)
* Add ponytail-audit skill

Whole-codebase audit for over-engineering. Scans a repository and produces a
ranked report of things to delete, simplify, or replace with stdlib/native
equivalents.

* Drop counting-by-number heuristics: remove Phase 5 (structural audit) and TODO-age heuristic per review

* feat: slim ponytail-audit and add cross-platform parity

Rewrite the ponytail-audit skill to ponytail-review's lean shape (35 lines,
was 111): same five tags, repo-wide scope, ranked output. Drop the
prescriptive phase walkthrough, sampling rules, report template, and the
license frontmatter that no other skill carries.

Add the adapters the skill was missing so it ships on every supported
platform the way ponytail-review does:
- commands/ponytail-audit.toml
- .opencode/command/ponytail-audit.md
- pi-extension registerCommand (+ test)
- agent-portability and README entries

Co-authored-by: Alexander Brandt <github@a13x.de>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Emeriko <dietrich.gebert@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 17:35:45 +02:00
EmerikoandClaude Opus 4.8 0882e2d256 docs: correct ponytail-help update steps to match Claude Code docs
Use auto-update or marketplace refresh + /reload-plugins (not reinstall), and
note that an unrecognized /plugin means Claude Code itself needs updating.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 14:18:42 +02:00
EmerikoandClaude Opus 4.8 82cff4bcd2 docs: add Update section to ponytail-help
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 14:14:34 +02:00
EmerikoandClaude Opus 4.8 004256cdc6 chore: add FUNDING.yml for GitHub Sponsors
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 06:35:00 +02:00
EmerikoandClaude Opus 4.8 88431defba docs: replace em dashes with plain punctuation across prose
Swap em dashes for commas/colons/periods in the README, skills, AGENTS.md and
its five rule copies, examples, command files, and benchmark README. Rule
copies stay in sync (same edit applied to all) and the invariant guard passes.

Left untouched on purpose: the vendored caveman SKILL.md (verbatim third-party
text), the dated benchmark writeups in results/ (historical records), and
.js code comments.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 06:06:03 +02:00
EmerikoandClaude Opus 4.8 6abc9f0acc fix(examples): keep response schema in API example, do not leak ORM fields
The ponytail API example returned the raw ORM model, which exposes every
column. Restore a response_model whitelist (the trust boundary) while still
cutting the repository/service/exception ceremony. Matches the skill's own
'never cut security' rule.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 05:33:30 +02:00
EmerikoandClaude Opus 4.8 321a59c82f feat: reproducible promptfoo benchmark + 3-model results
Commit a promptfoo harness (config + arm prompts + LOC metric + vendored
caveman SKILL) so anyone can re-run the comparison: no-skill vs caveman vs
ponytail, across Haiku / Sonnet / Opus, 10 runs per cell, median reported.

Replace the old unreproducible 6-task chart with assets/benchmark-3model.svg
from this run, and reframe the README to the reproducible numbers: ponytail
writes 80-94% less code, costs 47-77% less, and runs 3-6x faster than a
no-skill agent on every model. benchmarks/README.md carries the median tables
and the reproduce command. Drops nothing that is not measured.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 05:08:55 +02:00
EmerikoandClaude Opus 4.8 93f3ac1d76 docs: add badge row and proof bar to README top
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 03:43:32 +02:00
EmerikoandClaude Opus 4.8 24b0b98e16 chore: release v4.2.0
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
v4.2.0
2026-06-13 03:28:33 +02:00
DietrichGebert 46c5c28b35 feat: add OpenCode adapter
Thin OpenCode plugin injecting the ponytail ruleset via experimental.chat.system.transform, reusing the shared instruction builder. Verified end-to-end on OpenCode 1.17.4. Supersedes #15.
2026-06-13 03:20:44 +02:00
Abbas Pardawala 1556f10bc6 fix: use CLAUDE_PLUGIN_ROOT in hooks.json, drop duplicate manifest hooks
hooks/hooks.json used ${PLUGIN_ROOT}, which Claude Code never defines, so the literal resolved against the hook process cwd and SessionStart/UserPromptSubmit failed with 'Cannot find module'. Switch to ${CLAUDE_PLUGIN_ROOT} (and %CLAUDE_PLUGIN_ROOT% for the Codex commandWindows variant); Codex aliases CLAUDE_PLUGIN_ROOT so both hosts resolve. Drop the duplicate inline hooks block from .claude-plugin/plugin.json so hooks load from a single canonical source.
2026-06-13 01:53:53 +02:00
Paul Ogier c15db8d3c9 fix: stop mode filter stripping rule bullets with a colon
filterSkillBodyForMode only filters lines whose label is a real mode (lite/full/ultra). Rule bullets like 'No unrequested abstractions:' and the 'ponytail:' comment convention were being stripped from injected instructions in every mode. Adds regression test.
2026-06-13 01:43:26 +02:00
Hannes 8c279cbfb3 feat: add pi extension (#1) v4.1.0 2026-06-12 17:55:24 +02:00
DietrichGebertandClaude Opus 4.8 de318b9457 docs: link agent-portability from README (#10)
The doc landed in #2 but was unlinked. Point to it from the adapters section.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 17:41:45 +02:00
Chindanai Jaiman 784e8bfd1c Document agent adapters (#2) 2026-06-12 17:39:15 +02:00
DietrichGebertandClaude Opus 4.8 bce2162025 chore: tighten rule-copy drift check; align Kiro copy (#9)
Cover the Kiro steering file in the equality check (the stripper is now shared, renamed to stripFrontmatter), and align its body with AGENTS.md: the 'Not lazy about' and 'Non-trivial logic' sentences were split into two paragraphs where the canonical body and the other four copies keep them as one. The improved check caught this on the freshly merged #6.

Also add a small invariant canary: four load-bearing rule phrases must appear verbatim in both SKILL.md (the runtime source of truth) and AGENTS.md, catching a rule that lands in one but not the other even though the two files are intentionally different lengths.

Verified: passes on main, exits 1 when a copy diverges or an invariant goes missing.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 17:39:11 +02:00
dgebertandClaude Opus 4.8 515fb4c5a4 fix: make hook compatibility test cross-platform (USERPROFILE for Windows os.homedir)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 17:11:05 +02:00
dgebertandClaude Opus 4.8 e37b823b92 Merge PR #7: Codex support (avidspartan1)
Adds the Codex adapter: marketplace.json, .codex-plugin/plugin.json,
declarative hooks.json with Windows command variants, and a shared
hooks/ponytail-runtime.js that switches state path and output format
between Claude and Codex (gated on PLUGIN_DATA, so the Claude path is
unchanged). Bumps plugin version to 4.1.0 and ships tests/hooks.test.js.

README adapters block resolved to keep the Codex @ponytail invocation note
together with Kiro (#6) and the drift-check Development section (#3).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 17:09:21 +02:00
Chindanai Jaiman e89a4e9863 Add rule copy drift check (#3) 2026-06-12 17:05:09 +02:00
Mark Ingalls 2f2a0d33e0 feat: add Kiro steering file support (#6) 2026-06-12 17:03:55 +02:00
Paul c16f967d37 feat: codex support 2026-06-12 08:49:33 -04:00
dgebertandClaude Fable 5 cf97ccc509 chore: plugin.json version 4.0.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v4.0.0
2026-06-12 12:53:15 +02:00
dgebertandClaude Fable 5 2d91f6a957 docs: move benchmark chart up, right after Before / after
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 12:45:43 +02:00
dgebertandClaude Fable 5 9c99843725 docs: same-model control arm, refresh numbers and chart
Six no-skill control arms re-run through the same harness so all three
arms share one model. README Numbers section and chart now cite the
complete dataset: -47% tokens, 3x faster, 490 vs 3,629 LOC, extension
96 vs 1,115 lines, probes green everywhere. Em dashes removed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 12:44:30 +02:00
dgebertandClaude Fable 5 b609e019a0 docs: benchmark chart — ponytail vs caveman vs control
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 12:18:18 +02:00
dgebertandClaude Fable 5 983255e2a1 docs: A-F benchmark — v4 beats caveman on every axis
Probes 8/8 + 6/6 both arms, LOC 490 vs 1440, extension cost 41/55 vs
156/257, all six v4 arms ship a runnable check with no bloat creep.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 12:11:48 +02:00
dgebertandClaude Fable 5 cbb8859f39 feat: skill v4 — test reflex, ceiling comments, robust-variant rule
Hardening per the A-F benchmark brief: non-trivial logic leaves one
runnable check; ponytail: comments on ceiling-bearing shortcuts name
the ceiling and upgrade path; prefer the edge-case-correct stdlib
option at equal size. Applied to SKILL.md, all cross-agent rule
copies, the hook fallback, and a guard line in ponytail-review.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 12:11:47 +02:00
Emeriko 95ba2bafcb docs: add social preview image v1.0.0 2026-06-12 04:32:55 +02:00
Emeriko 24644d4cfa docs: readme grows a sense of humor 2026-06-12 04:23:40 +02:00
Emeriko c7a62ec779 docs: update logo 2026-06-12 04:20:19 +02:00
Emeriko 3a8ed4fc36 docs: readme practices what it preaches 2026-06-12 04:05:20 +02:00
Emeriko 243a28f1dd feat: skill v3 — compress SKILL.md 115 to 95 lines
Skill preaching minimalism was 2x caveman length. Smaller file cuts
per-read and per-session-injection cost. Benchmark: beats caveman on
all areas now — 135.7k vs 138.4k tokens, 127s vs 136s, 47 vs 117 loc.
2026-06-12 03:58:44 +02:00
Emeriko 3b4626a987 feat: skill v2 — output cap, reflex ladder, benchmarks
v1 lost to caveman on tokens/time despite minimal code: it wrote
essays defending each simplification. v2 caps explanation at three
lines and ships the lazy version instead of stalling on necessity
questions. Benchmark: 136.6k tok vs caveman 138.4k, code 47 vs 117
lines across 5 tasks.
2026-06-12 03:54:06 +02:00
Emeriko 7a3475c0f4 feat: full plugin integration + cross-agent rules 2026-06-12 03:25:15 +02:00
Emeriko 2c8c175b4f docs: add logo 2026-06-12 03:13:52 +02:00
Emeriko ef604945d8 feat: add ponytail skill, examples, README 2026-06-12 03:05:59 +02:00
DietrichGebert 3a3d78d1b9 Initial commit 2026-06-12 02:52:37 +02:00