| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: drop commandWindows from hooks.json for Claude.ai marketplace validation (#593) (#601) commandWindows is not part of the supported hooks schema for the Claude.ai plugin marketplace validator, which rejects it as an unknown field. The shared `command` field already runs cross-platform: Claude Code expands ${CLAUDE_PLUGIN_ROOT} before the shell sees it, VS Code Copilot ignores commandWindows and runs `command` through PowerShell on Windows, and `node` is natively available in both bash and PowerShell. Update the regression test to assert commandWindows is absent and remove the now-unused CMD_VAR_SYNTAX guard. Fix comment placeholder syntax ({{CLAUDE_PLUGIN_ROOT}} → ${CLAUDE_PLUGIN_ROOT}) and narrow test name. | 30 天前 | |
Adding support for Copilot Marketplace plugin (#47) * Add GitHub Copilot plugin and marketplace manifests for Ponytail Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add Copilot hook adapters and plugin data runtime precedence Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Document Copilot plugin install flow and instruction fallback mode Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix Copilot hooks for native output context and state-only mode tracking Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: add Copilot CLI namespaced command examples Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Collapse Copilot hooks into shared activate/mode-tracker The Copilot hook files duplicated ponytail-activate.js and ponytail-mode-tracker.js, differing only in output shape. Move that difference into writeHookOutput (isCopilot branch) and point copilot-hooks.json at the shared hooks. Deletes both forks (-73 lines). Refs #1 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Align Copilot manifest version to 4.4.0 with cross-manifest parity test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make Copilot and Codex host detection exclusive in runtime output routing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add Copilot debt command validation with a pull request acceptance checklist Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Removed PR template * Drop tautological copilot command-form test The namespaced-form assertion built '/ponytail:ponytail-debt' from two constants and compared it to itself — it tests string concatenation, not wiring. The file-exists check above already catches a renamed manifest. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> | 2 个月前 | |
Emit statusline setup nudge at most once per user (#483) Writes a flag file the first time the STATUSLINE SETUP NEEDED nudge fires, and skips it on later sessions so it stops nagging every start. Includes a regression test that a second session stays silent. | 1 个月前 | |
fix: reject review as a default mode in pi-extension and config (#576) review is a session-only mode set by /ponytail-review, never a persistent default. The Claude/Codex mode-tracker already enforces this (#377), but two paths did not: - pi-extension /ponytail default review was accepted, persisting review as the default, so the next session started in review with a blank status-bar icon. - getDefaultMode accepted review from PONYTAIL_DEFAULT_MODE or a stale config. Route default validation through RUNTIME_MODES (off/lite/full/ultra) in getDefaultMode, writeDefaultMode, and the pi-extension default command. review stays valid as a session mode. Adds regression tests for all three paths. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> | 1 个月前 | |
fix: stop filterSkillBodyForMode from swallowing rule bullets that start with a mode word (#571) filterSkillBodyForMode is the shared filter every host adapter (Claude hooks, Pi, OpenCode, the MCP server, Hermes) uses to trim the ponytail skill body down to the active intensity. Its worked-example detection matched any bullet shaped "- label: text" and treated it as a mode-specific example whenever the label happened to normalize to a mode name (lite/full/ultra/off) -- silently dropping it in every other mode. The current SKILL.md doesn't trip this today (its only such bullets are the three real worked examples), but it's a landmine: an ordinary rule bullet added later that happens to start with "Full:" or "Lite:" would vanish from every other mode's instructions with no warning, in the one code path every adapter shares. Confirmed with a real bullet: filterSkillBodyForMode('- Full: real rule text.', 'ultra') silently drops the line before this fix. All three real worked examples are quoted (`- lite: "..."`); ordinary rule bullets aren't. Required the quote so only genuine examples are mode-filtered, and added a regression test plus fixed an existing test whose synthetic fixture used unquoted examples that don't match the real file's format. | 1 个月前 | |
feat: add Qoder hooks support (UserPromptSubmit + PreToolUse) (#529) * feat: add Qoder hooks support (UserPromptSubmit + PreToolUse) - Add isQoder detection via QODER_SESSION_ID in ponytail-runtime.js - Add UserPromptSubmit double-duty: auto-activate + ruleset injection - Add PreToolUse hook with task|Task matcher for subagent injection - Create hooks/qoder-hooks.json reference template - Update .qoder-plugin/plugin.json with hooks field - Add .qoder/rules/ponytail.md for per-project rules - Add comprehensive tests for Qoder runtime behavior - Update README.md and docs/agent-portability.md * check-versions: enforce .qoder-plugin/plugin.json version too --------- Co-authored-by: shiding <shiding@ruigushop.com> Co-authored-by: Emeriko <dietrich.gebert@gmail.com> | 1 个月前 | |
fix: detect VS Code Copilot via CLAUDE_PLUGIN_ROOT fallback (#528) (#579) VS Code Copilot never sets COPILOT_PLUGIN_DATA, only CLAUDE_PLUGIN_ROOT (pointed at an .vscode/agent-plugins/... install path), so isCopilot was false and ponytail assumed native Claude Code — emitting the statusline setup nudge, which VS Code Copilot doesn't read. Also guard stateDir: it was built from the same unset COPILOT_PLUGIN_DATA whenever isCopilot resolved via this new fallback, so fall back to getClaudeDir() there too. | 30 天前 | |
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. | 1 个月前 | |
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. | 1 个月前 | |
feat(hooks): opt-in agent-type scoping for SubagentStart injection (#… (#522) * feat(hooks): opt-in agent-type scoping for SubagentStart injection (#506) The SubagentStart hook injected the ~1,300-token persona into every subagent, including read-only search agents where it is dead weight. Consumers could not narrow a plugin-provided hook from their own settings, so the scoping has to live here. Add an opt-in allowlist: PONYTAIL_SUBAGENT_AGENTS (comma-separated env var) or a subagentAgents array in config.json, matching getDefaultMode precedence. The hook now reads agent_type from stdin and skips injection only on a positive mismatch; unconfigured or missing agent_type keeps the inject-everywhere behavior from issue #252. Stdin reading follows the never-hang contract from issue #443. Closes #506 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review: regex matcher, stdin-free default path, exit on skip Rework the SubagentStart scoping per review on #522: - Replace the comma-separated PONYTAIL_SUBAGENT_AGENTS allowlist with a regex PONYTAIL_SUBAGENT_MATCHER, matching the reviewed API on #507 and the PONYTAIL_DEFAULT_MODE naming convention. - Default path (no matcher) injects synchronously and never reads stdin, fixing the #443-class Windows regression where the persona was delayed until a 1s timeout. - On a definite agent_type mismatch the hook now process.exit(0)s immediately instead of lingering until the fallback timer. - Drop the config-file (subagentAgents) source, so no config read on the subagent hot path; env-only keeps it lazy (YAGNI). - Revert the unrelated tests/hooks-windows.test.js change; the scoped path mirrors the mode-tracker never-hang contract already tested there. Fail open on unparseable input, missing agent_type, invalid regex, or timeout so scoping never silently drops the persona (#252). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Emeriko <dietrich.gebert@gmail.com> | 1 个月前 | |
feat: add Qoder hooks support (UserPromptSubmit + PreToolUse) (#529) * feat: add Qoder hooks support (UserPromptSubmit + PreToolUse) - Add isQoder detection via QODER_SESSION_ID in ponytail-runtime.js - Add UserPromptSubmit double-duty: auto-activate + ruleset injection - Add PreToolUse hook with task|Task matcher for subagent injection - Create hooks/qoder-hooks.json reference template - Update .qoder-plugin/plugin.json with hooks field - Add .qoder/rules/ponytail.md for per-project rules - Add comprehensive tests for Qoder runtime behavior - Update README.md and docs/agent-portability.md * check-versions: enforce .qoder-plugin/plugin.json version too --------- Co-authored-by: shiding <shiding@ruigushop.com> Co-authored-by: Emeriko <dietrich.gebert@gmail.com> | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 30 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 |