Commit Graph
189 Commits
Author SHA1 Message Date
Hamza Ali ShahjahanandEmeriko 8f32ae0f6e docs: add JetBrains Junie, Amp, and Jules support (native AGENTS.md readers) (#326)
* docs: add JetBrains Junie support (native AGENTS.md reader)

Junie reads AGENTS.md from the project root natively (per JetBrains' official docs), so ponytail works zero-config in any JetBrains IDE — like CodeWhale (#124). Adds a README note + agent-portability row, and bumps the agent badge 16 -> 17. Docs-only.

* docs: also add Amp and Jules support (native AGENTS.md readers)

Amp (Sourcegraph) reads AGENTS.md as its primary guidance file (cwd + parents up to $HOME + global config; per ampcode.com/manual). Jules (Google) auto-reads AGENTS.md from the repo root (per jules.google/docs). Both work zero-config via the AGENTS.md this repo ships. Badge 17->19. Roo Code evaluated and excluded (archived 2026-05-15).

* Merge main; correct Junie AGENTS.md note (Guidelines Path, not automatic)

---------

Co-authored-by: Emeriko <dietrich.gebert@gmail.com>
2026-07-09 12:48:17 +02:00
d5f4ffdd65 pi-extension: make startup notification opt-out via quietStartup (#308)
The status bar already shows the active ponytail mode at all times, but the
startup toast is also a deliberate trust-heartbeat for a behavior-modifying
extension (it confirms ponytail loaded, in which mode, and survives session
resume where the persisted mode may differ from the default). Default
behavior is preserved.

Users who prefer a clean startup can now silence it via:

  - config:  ~/.config/ponytail/config.json -> { "quietStartup": true }
  - env var: PONYTAIL_QUIET_STARTUP=1

Resolution order mirrors the existing defaultMode setting: env var > config
file > default (false). Added readQuietStartup export and a test covering
all three layers.

Co-authored-by: blissini <blissini@users.noreply.github.com>
Co-authored-by: Emeriko <dietrich.gebert@gmail.com>
2026-07-09 12:29:12 +02:00
Yash Yadav 9888cdf066 docs: update Claude Code Desktop install steps to match the current UI (#342) (#525)
The desktop-app note pointed at a Customize > + > "Create plugin and
add marketplace" > "Add from repository" flow (from #98) that no
longer matches the app. The unified Claude Code Desktop app's Code
tab runs real Claude Code sessions, so the same /plugin marketplace
add and /plugin install commands typed above work directly in its
prompt box; the + button also opens a Plugins browser, and
marketplaces are managed under Customize in the sidebar (per
Anthropic's current desktop app docs).

Closes #342
2026-07-09 11:52:05 +02:00
Ben Younes efa35c34f2 fix: preserve combined statusline on uninstall (#550) 2026-07-09 11:48:37 +02:00
D3VL0PRandayushere 511ddd4d62 fix(opencode): stop exporting parseCommandFile from plugin module (#301)
OpenCode's legacy plugin loader iterates every exported function in a
plugin module and tries to invoke each one with the plugin context object.
parseCommandFile was exported alongside the default plugin function, so
the loader called it with an object instead of a file path and crashed
with 'path must be a string or a file descriptor' before any hook ran,
which aborted the whole plugin load.

Move the frontmatter parser to its own .cjs sibling; the plugin module
now exposes exactly one top-level export (the default plugin function).
The plugin requires the parser via createRequire, and the existing
parseCommandFile tests now require the sibling directly.

Co-authored-by: ayushere <ayushere@users.noreply.github.com>
2026-07-09 11:44:31 +02:00
Jay shahandEmeriko 8e69b4a55f feat: report active level on bare /ponytail instead of resetting to default (#99)
* fix: report active level on bare /ponytail instead of resetting to default

* remove . ponytail-active

---------

Co-authored-by: Emeriko <dietrich.gebert@gmail.com>
2026-07-09 04:15:43 +02:00
JACKandJack 6d0c111035 Fix ponytail test coverage and metadata (#503)
Co-authored-by: Jack <jack@JackdeMacBook-Pro.local>
2026-07-09 03:35:39 +02:00
Hannes 72274181e9 fix(pi-extension): list ponytail modes (#237) 2026-07-09 03:29:35 +02:00
Hamza Ali Shahjahan fb72987fb5 fix(benchmarks): make agentic fixture path portable via PONYTAIL_TMPL (#206)
tasks.py hardcoded _TMPL to a personal absolute Windows path (D:\dev\...), which the agentic benchmark's Reproduce flow depends on. Resolve it via a PONYTAIL_TMPL env override with a relative fallback, mirroring the existing PONYTAIL_PLUGIN_DIR convention in run.py; run.py's loader resolves the relative name under fixtures/. selftest skips the open tasks that consume _TMPL, so instrument validation is unaffected (verified: all instruments valid).
2026-07-09 03:13:52 +02:00
Sangeeth Thilakarathnaandsanmaxdev a3e0169c3d fix: ignore invalid opencode mode arguments (#302)
Co-authored-by: sanmaxdev <sanmaxdev@users.noreply.github.com>
2026-07-09 03:12:14 +02:00
MrKC ca4dad252d test: run ponytail-mcp test suite under root npm test (#235) 2026-07-09 03:08:41 +02:00
Rafael PinheiroandRafaelpta bbace73bed check-rule-copies: pin the reuse rung as an invariant (#281)
The reuse rung added in #253 ("Already in this codebase? Reuse it, don't
re-write it.") is load-bearing now, but it was not in the INVARIANTS list,
so a future reword could silently drop it from SKILL.md or AGENTS.md without
tripping the check. Pin it with the substring "in this codebase", present in
both files' rung 2, the same way the safety carve-outs are pinned.

Co-authored-by: Rafaelpta <15382305+Rafaelpta@users.noreply.github.com>
2026-07-09 03:04:19 +02:00
Lakshya Sharma 187acc2add ux: make the ultra statusline badge stand out (#192)
Every mode rendered in the same green, so ultra (the high-intensity mode
that deletes and challenges requirements) looked identical to lite/full at
a glance. Give the ultra badge an amber color so it's obvious you're in it.
The level is still in the badge text, so color stays a redundant cue, not
the only one.
2026-07-09 03:01:14 +02:00
Hamza Ali Shahjahan eb3b6f0bbd docs: align benchmark prerequisites with promptfoo's Node requirement (#205)
The Prerequisites section listed Node.js 18+, but the Reproduce section (and promptfoo's engine constraint) requires >= 22.22.0, so a reader on Node 18 hits promptfoo's engine error. The local Ollama path uses no Node, so 18+ had no basis. One-line docs change aligning the prerequisite with the existing requirement above it.
2026-07-09 02:57:37 +02:00
Lakshya Sharma 01a29e480a docs: add Zed to the agent portability table (#190)
The README lists Zed as a supported instruction-tier agent and points
readers to docs/agent-portability.md for the file mapping, but the table
had no Zed row. Zed auto-includes AGENTS.md from the worktree root as a
default rule file, so add the row to match the README.
2026-07-09 02:56:12 +02:00
DietrichGebert a439cd2930 docs: reword Copilot Chat note without em dash (#526) (#562) 2026-07-09 02:54:11 +02:00
Yash Yadav a195670068 docs: clarify that GitHub Copilot Chat (VS Code/JetBrains) is supported (#497) (#526)
"GitHub Copilot (editor)" was buried in a comma-separated adapter
list with no indication of which product it meant, so readers asking
"does this support VS Code Copilot?" had no way to tell from the
README. Spell out VS Code/JetBrains/Visual Studio explicitly and
disambiguate from the separately documented Copilot CLI.

Closes #497
2026-07-09 02:39:16 +02:00
Lorenzo Sanz 6c08d36447 Update Spanish README with improved wording (#560) 2026-07-09 01:25:23 +02:00
1b2760d384 feat: hide the pi status bar indicator while keeping ponytail active (#324) (#544)
Add getHideStatus() to the shared config resolver: PONYTAIL_HIDE_STATUS (any
truthy value; 0/false/empty mean don't hide) or config.hideStatus === true, with
BOM-stripped config reads. The pi extension caches it at init and re-reads on
session_start, and syncStatus() returns early when set, so the indicator is
suppressed while the ruleset still injects every turn.

Reconciles #511 and #328: takes #328's caching and ruleset-stays-active test,
#511's BOM-safe config read, a stricter env check (0/false do not hide), and
drops #328's writeDefaultMode change which already landed in #514.

Closes #324

Co-authored-by: dhedhialy <91044156+dhedhialy@users.noreply.github.com>
Co-authored-by: sanmaxdev <46221775+sanmaxdev@users.noreply.github.com>
2026-07-07 04:06:37 +02:00
DietrichGebert bed76c52fa feat: add /ponytail default <mode> to persist the default (#329) (#541)
Claude Code had no way to change the persistent default from within a session:
plain /ponytail switches are session-scoped by design ('sticks until session
end'), and only env/config could set the default. So /ponytail off never
survived a restart, which is what #329 hit.

Add /ponytail default <mode> to the mode-tracker hook, matching pi's existing
command: it writes defaultMode to config (survives restart) and does NOT touch
the current session flag, keeping plain switches transient. review is rejected
as a default (#377); only off/lite/full/ultra are accepted. Test covers persist,
transient-switch-does-not-persist, and review-rejected.

Closes #329
2026-07-07 03:09:25 +02:00
Lakshya Sharma f790cebb57 fix: statusline setup nudge honors CLAUDE_CONFIG_DIR (#338)
The activation hook detects a missing statusline in getClaudeDir()/settings.json
(CLAUDE_CONFIG_DIR-aware) but the nudge text told the user and the agent to add
the statusLine config to ~/.claude/settings.json. With CLAUDE_CONFIG_DIR set,
that is the wrong file: Claude Code never reads it and the badge never turns on.
Point the nudge at the settingsPath the hook already computed, in both the
shell-safe and manual branches.

Fixes #250
2026-07-07 02:54:46 +02:00
Aly Dhedhi 988428d510 fix: writeDefaultMode merges config instead of overwriting (#490) (#514)
writeDefaultMode was writing a fresh { defaultMode } object, silently
dropping any other fields in config.json. Now it reads the existing config,
updates only defaultMode, and writes it back preserving all other fields.

Fixes #490
2026-07-07 02:44:56 +02:00
Aly Dhedhi 3869218b13 fix: hermes test hardcoding python3 (fails on Windows) (#513)
tests/hermes-plugin.test.js spawned python3 with no fallback. On Windows
python3 is the Store app-execution-alias stub that exits non-zero even when
Python is installed. Reuse the probe/fallback pattern from
benchmarks/correctness.js: try python3, fall back to python, cache the result.

Fixes #498
2026-07-07 02:31:15 +02:00
Aly Dhedhi 146904825d fix: handle CRLF in loc.js fence regex and remove dead codeOf (#339) (#518)
loc.js regex was missing \r? before \n, so CRLF code fences were
never matched and the metric fell back to counting the whole response.
Also removed dead codeOf() from behavior.js (defined but never called).

Fixes #339
2026-07-07 02:26:10 +02:00
DietrichGebert 3efe7376ff docs(help): add /ponytail-gain to the OpenCode help card (#539)
The OpenCode /ponytail-help card listed 5 commands, omitting /ponytail-gain,
while the Claude commands/*.toml card lists all 6. An OpenCode user wouldn't
see that ponytail-gain exists. Add it so both help surfaces agree.
2026-07-07 02:00:10 +02:00
DietrichGebertandAnmolnoor 4286903a77 fix: ship scripts/uninstall.js in the npm package (#538)
The README tells users to run 'node scripts/uninstall.js' to clean up state
left outside the plugin folder, but the package files list didn't include
scripts/, so npm-installed users didn't have the file. Add scripts/uninstall.js
to files (its only dependency, hooks/, already ships). Guard it with a test
that asserts the files entry and that the file exists.

Co-authored-by: Anmolnoor <52135717+Anmolnoor@users.noreply.github.com>
2026-07-07 01:54:04 +02:00
DietrichGebertandAroool 39bad58d40 fix: guard pi before_agent_start against bad event and missing systemPrompt (#482)
The before_agent_start handler read event.systemPrompt with no guard. A
null/undefined event crashed the agent with a TypeError (#439), and a truthy
event without a systemPrompt key stringified to the literal 'undefined',
prepending garbage to every system prompt (#440). Both are fixed with one
optional-chain guard that mirrors the event?. pattern the input handler already
uses: prepend the base prompt only when present, otherwise inject the ruleset
alone. Adds a regression test covering null/undefined event, missing
systemPrompt, and the normal base-prompt path.

Closes #439
Closes #440

Co-authored-by: Aroool <90670606+Aroool@users.noreply.github.com>
2026-07-07 01:23:31 +02:00
DietrichGebertandisaukywhite 40e50d9e03 fix: don't crash uninstall on malformed settings.json (#481)
If settings.json contained invalid JSON, JSON.parse threw a SyntaxError, which
has no .code, so the catch rethrew it and crashed the script — after the mode
flag and config file were already removed, leaving cleanup half-done. Handle
SyntaxError explicitly: warn that the statusLine entry couldn't be removed and
leave the file untouched, since invalid JSON can't be safely edited. Adds a
regression test that a malformed settings.json exits 0, warns, and is left
byte-for-byte intact.

Closes #434

Co-authored-by: isaukywhite <50426537+isaukywhite@users.noreply.github.com>
2026-07-02 01:30:30 +02:00
DietrichGebert b8f20b8e7c docs(help): list all 6 skills and fix OpenCode command count (#480)
The ponytail-help skills table listed only 4 skills, omitting ponytail-audit
and ponytail-debt (both ship as commands). It also claimed OpenCode ships only
/ponytail and /ponytail-review, when it ships all six. Add the two missing rows
and correct the note. Regenerated the .openclaw copy so it stays in sync.

Closes #437
Closes #438
2026-07-02 01:24:32 +02:00
DietrichGebertandnanaubusiness 25185a445a fix: don't destroy combined statuslines on uninstall (#479)
uninstall deleted the whole statusLine key whenever the command contained
'ponytail-statusline'. For a user-combined statusline (e.g. caveman && ponytail)
that destroyed the other plugin's statusline too. Only remove the statusLine
when ponytail owns the whole command; if it's combined with other segments,
leave it and tell the user to strip ponytail's part by hand. Never leaves a
malformed husk. Adds a regression test for the combined case.

Closes #374

Co-authored-by: nanaubusiness <195150264+nanaubusiness@users.noreply.github.com>
2026-07-02 00:39:07 +02:00
DietrichGebertandnanaubusiness 9ec4fb8b54 fix: strip UTF-8 BOM before parsing config.json (#478)
getDefaultMode() parsed the config with JSON.parse and no BOM strip, so a
config.json saved with a UTF-8 BOM (common on Windows) failed to parse and the
user's defaultMode was silently ignored. Strip the BOM first, matching the
existing /^\uFEFF/ pattern in ponytail-activate.js, check-versions.js, and
ponytail-mode-tracker.js.

Closes #375

Co-authored-by: nanaubusiness <195150264+nanaubusiness@users.noreply.github.com>
2026-07-02 00:25:27 +02:00
DietrichGebertandHasnan42 7e6eca6e29 fix: prevent Windows session freeze from stdin EOF deadlock (#477)
On Windows, Claude Code runs the UserPromptSubmit hook through a PowerShell
if {} wrapper that can swallow the piped prompt JSON, so stdin 'end' never
fires and ponytail-mode-tracker.js blocks forever, freezing the session.

Make the hook non-blocking: extract the handler into finish() guarded by a
done flag, and add a 1s unref()'d fallback timeout plus the existing stdin
error handler that both call finish() then exit 0. unref() means zero added
latency on the normal path where 'end' fires first. Adds a regression test
that spawns the hook with a never-closing stdin pipe and asserts self-exit.

Reconciles #453 onto main after #227 (stdin error handler) and #474 (exec
node hooks) landed.

Closes #443

Co-authored-by: Hasnan42 <154899774+Hasnan42@users.noreply.github.com>
2026-07-02 00:18:01 +02:00
Shubham Sharma b8f6fbe92a fix: handle stdin error in ponytail-mode-tracker to avoid uncaught crash (#147) (#227)
Without a stdin 'error' listener, a broken pipe or parent-process crash
causes Node to emit an unhandled error event on the stream, which becomes
an uncaught exception and crashes the hook with a non-zero exit code.

Add process.stdin.on('error', () => process.exit(0)) before the data/end
listeners. Exiting 0 on error keeps the hook contract: always exit cleanly,
never block session start.

Fixes #147
2026-07-02 00:10:24 +02:00
Sangeeth Thilakarathnaandsanmaxdev 7eda70d30f fix: exec lifecycle hook commands (#474)
Co-authored-by: sanmaxdev <sanmaxdev@users.noreply.github.com>
2026-07-02 00:06:21 +02:00
DietrichGebert 16f6cbf4b8 docs(benchmarks): add Independent benchmarks section (#460)
Curated, plugin-installed third-party runs (KuldeepB19, RicardoCostaGit) with
method, headline, and date, clearly framed as independent corroboration not
official figures. Gives the recurring 'did anyone independent check this?' ask
a canonical home.

Closes #121
Closes #236
2026-06-30 02:04:48 +02:00
nanaubusinessandAdmin 85cc1d9935 fix: copilot-plugin test checks all 6 command files (#393)
Previously only checked 4 of 6. ponytail-gain.toml and
ponytail-help.toml are now validated.

Closes #381

Co-authored-by: Admin <admin@Admins-MacBook-Pro.local>
2026-06-30 00:21:09 +02:00
DietrichGebert bc9ee949d5 Merge pull request #448 from DietrichGebert/release-4.8.4
release: 4.8.4
v4.8.4
2026-06-29 07:23:36 +02:00
Emeriko c99757a14a release: bump plugin.yaml (Hermes manifest) to 4.8.4 2026-06-29 07:19:46 +02:00
Emeriko 4b7a012626 release: bump .devin-plugin to 4.8.4 2026-06-29 07:15:31 +02:00
Emeriko 801d976c69 release: 4.8.4 2026-06-29 07:12:58 +02:00
DietrichGebert adad1e451a Merge pull request #447 from DietrichGebert/fix-skill-trigger-recall
Trigger ponytail skill on any coding task, not just keywords
2026-06-29 07:08:50 +02:00
Emeriko 0e3fd0cfee Trigger ponytail skill on any coding task, not just keywords
The skill description was written keyword-first ("use when the user
says lazy / complains about boilerplate"), so a model-invoked host
only loaded it on prompts that hit those words. Plain coding tasks
(add a date picker, write a dedupe function, build a cache, fix a bug)
were skipped, exactly the over-build cases ponytail is best at.

Tested via a skill-router proxy (3 runs, 12 labeled prompts): recall
on coding tasks was 2/6 before, 6/6 after, with precision unchanged at
6/6 (no false fires on non-coding prompts). Fix is one clause naming
coding tasks explicitly plus a negative clause to keep precision.

Trigger descriptions live in two source-of-truth spots, both updated:
skills/ponytail/SKILL.md and the DESCRIPTIONS map in
scripts/build-openclaw-skills.js (.openclaw regenerated). The store
blurbs in the plugin manifests are listing metadata, not triggers, so
they are left alone.
2026-06-29 07:06:59 +02:00
DietrichGebert c4d1925ae9 Merge pull request #323 from DietrichGebert/hermes-plugin
feat: add Hermes Agent plugin (rebuilt from #78)
2026-06-26 03:28:08 +02:00
Emeriko 6eb2b7829c Merge branch 'main' into salaamdev/main
# Conflicts:
#	README.md
2026-06-26 03:24:37 +02:00
Emeriko ac75159e5e Merge branch 'main' into salaamdev/main
# Conflicts:
#	README.md
2026-06-26 03:08:24 +02:00
Lakshya Sharma 8d154e6c2a fix(benchmarks): strip block comments before counting LOC (#232)
loc.js filtered comments line by line, so /* ... */ block comments whose
continuation lines are not *-aligned had their inner lines counted as code.
A plain indented block comment scored higher than the same code written
JSDoc-style. Strip /* ... */ before the line count so both are equal, and
add loc.test.js to lock the behavior.

Fixes #231
2026-06-26 03:02:55 +02:00
systemBlueandClaude Opus 4.8 e353a1a5d3 docs: add Swift/SwiftUI section to platform-native.md (#313)
Closes #299. The "does the platform already do this?" rung is especially
rich on Apple platforms, but the doc had no Swift coverage. Adds a
Swift/SwiftUI section in the existing two-table format: SwiftUI controls
and the Swift/framework layer, with library carve-outs kept inline to
match the `ms` / `requests` style already in the doc.


Claude-Session: https://claude.ai/code/session_01MtGgxEbiXPQjqMyXWbnixn

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 02:38:34 +02:00
DietrichGebert 7147937ae8 Sync ES and Korean READMEs with the Devin CLI addition (#322)
Follow-up to #318, which updated only the English README. Bumps the agent badge 14->15, adds a Devin CLI install section before OpenClaw, and lists Devin CLI in the skill-capable host line. Also adds Swival to both host lines, which the translations were already missing.
2026-06-26 02:33:56 +02:00
Hamza Ali Shahjahan 33a4977a83 fix(benchmark): reject --ollama-url without a host (#315)
Follow-up to #274: the merged scheme validation accepts host-less URLs (http://, https://), which then fail opaquely inside urlopen(). Add a minimal netloc check after the existing scheme check, so a missing host is rejected up front with a clear argparse error. Additive; keeps the existing scheme message intact.
2026-06-26 02:28:51 +02:00
topherandDevin 7790c37b67 Add Devin CLI plugin manifest (#318)
Adds `.devin-plugin/plugin.json` so the plugin can be installed with
`devin plugins install DietrichGebert/ponytail`. The skills/ directory
is already at the repo root, which is exactly where Devin expects it.

Registers the new manifest in `scripts/check-versions.js` so it stays
in sync with every other host manifest on release.

Updates README: install/uninstall instructions, badge (14 → 15 agents),
and Devin added to the skill-capable hosts list in Commands.

Generated with [Devin](https://devin.ai)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-06-26 02:26:13 +02:00