ponytail-installer
从 GitHub 安装 ponytail 到 WorkBuddy。调用后按步骤执行,不问用户额外问题。
源信息
- 仓库: https://github.com/DietrichGebert/ponytail (MIT)
- 补丁脚本: 本 skill 目录下的
patch-workbuddy.js(对 ponytail-runtime.js 打 4 处 WorkBuddy 适配改动)
执行步骤
第 1 步:定位本 skill 目录
找到 patch-workbuddy.js 的位置:
find "$HOME/.workbuddy/skills" -name "patch-workbuddy.js" -path "*ponytail-installer*" 2>/dev/null
记为 PATCH_SCRIPT。其同目录下的 SKILL.md 就是本文件。
第 2 步:检测 node
node -v
- 不存在或 < 18:告诉用户「需要 Node.js >= 18,请先安装:https://nodejs.org/」,停止。
- OK:继续。
第 3 步:检测 WorkBuddy
ls -d "$HOME/.workbuddy"
- 不存在:告诉用户「未检测到 WorkBuddy,请先安装」,停止。
- OK:继续。
第 4 步:从 GitHub clone ponytail
TMP_DIR=$(mktemp -d)
git clone --depth 1 https://github.com/DietrichGebert/ponytail.git "$TMP_DIR/ponytail"
- clone 失败:告诉用户「网络问题,请检查能否访问 GitHub」,停止。
- OK:继续。
第 5 步:打 WorkBuddy 适配补丁
node "$PATCH_SCRIPT" "$TMP_DIR/ponytail/hooks/ponytail-runtime.js"
应输出「补丁完成: 4/4 处改动」。
第 6 步:复制到 ~/.workbuddy/
WB_DIR="$HOME/.workbuddy"
PONYTAIL_DIR="$WB_DIR/ponytail"
rm -rf "$PONYTAIL_DIR"
mkdir -p "$PONYTAIL_DIR"
cp -r "$TMP_DIR/ponytail/hooks" "$PONYTAIL_DIR/hooks"
cp -r "$TMP_DIR/ponytail/skills" "$PONYTAIL_DIR/skills"
cp "$TMP_DIR/ponytail/AGENTS.md" "$PONYTAIL_DIR/AGENTS.md"
cp "$TMP_DIR/ponytail/package.json" "$PONYTAIL_DIR/package.json"
第 7 步:复制 6 个 skill
SKILLS_DIR="$WB_DIR/skills"
mkdir -p "$SKILLS_DIR"
for s in ponytail ponytail-audit ponytail-debt ponytail-gain ponytail-help ponytail-review; do
rm -rf "$SKILLS_DIR/$s"
cp -r "$TMP_DIR/ponytail/skills/$s" "$SKILLS_DIR/$s"
done
第 8 步:合并 hooks 到 settings.json
# Windows 路径转换(node 不认 /c/ 风格)
WB_WIN=$(cygpath -w "$WB_DIR" 2>/dev/null || echo "$WB_DIR")
PT_WIN=$(cygpath -w "$PONYTAIL_DIR" 2>/dev/null || echo "$PONYTAIL_DIR")
SETTINGS="$WB_DIR/settings.json"
node -e "
const fs = require('fs');
const settingsPath = process.argv[1];
const wbWin = process.argv[2];
const ptWin = process.argv[3];
let settings = {};
try { settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); } catch(e) {}
const activateCmd = 'PONYTAIL_HOST=workbuddy CLAUDE_CONFIG_DIR=\"' + wbWin + '\" node \"' + ptWin + '/hooks/ponytail-activate.js\"';
const trackerCmd = 'PONYTAIL_HOST=workbuddy CLAUDE_CONFIG_DIR=\"' + wbWin + '\" node \"' + ptWin + '/hooks/ponytail-mode-tracker.js\"';
settings.hooks = settings.hooks || {};
settings.hooks.SessionStart = [{ matcher: 'startup|resume|clear|compact', hooks: [{ type: 'command', command: activateCmd, timeout: 5 }] }];
settings.hooks.UserPromptSubmit = [{ hooks: [{ type: 'command', command: trackerCmd, timeout: 5 }] }];
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
console.log('settings.json 已更新');
" "$SETTINGS" "$WB_WIN" "$PT_WIN"
第 9 步:预置 flag + 验证
touch "$WB_DIR/.ponytail-statusline-nudged"
echo "full" > "$WB_DIR/.ponytail-active"
# 验证 hook
PONYTAIL_HOST=workbuddy CLAUDE_CONFIG_DIR="$WB_WIN" node "$PT_WIN/hooks/ponytail-activate.js" > /dev/null 2>&1
HOOK_EXIT=$?
# 验证 settings.json
node -e "JSON.parse(require('fs').readFileSync('$SETTINGS','utf8')); console.log('settings.json OK')"
# 清理临时目录
rm -rf "$TMP_DIR"
- hook exit 0 + settings.json OK = 成功
- 否则报告错误
第 10 步:输出结果
ponytail 已安装到 WorkBuddy(从 GitHub 拉取最新版 + WorkBuddy 适配补丁)。
装了什么:
- hooks (always-on): 每次会话启动自动注入懒惰阶梯规则
- 6 个 skill: ponytail / ponytail-review / ponytail-audit / ponytail-debt / ponytail-gain / ponytail-help
生效方式:重启 WorkBuddy 或新开会话
日常使用:
- 自动生效,正常提需求即可
- 切强度:/ponytail lite | full | ultra | off
- 代码审查:对话里说"用 ponytail-review 审一下代码"
- 全仓库审计:对话里说"用 ponytail-audit 审一下仓库"
卸载
用户要求卸载时:
rm -rf ~/.workbuddy/ponytailrm -rf ~/.workbuddy/skills/ponytail*(只删 ponytail 开头的,别误删)- 从
~/.workbuddy/settings.json移除hooks.SessionStart和hooks.UserPromptSubmit rm -f ~/.workbuddy/.ponytail-active ~/.workbuddy/.ponytail-statusline-nudged- 告诉用户重启 WorkBuddy
注意
- 补丁脚本
patch-workbuddy.js是幂等的,重复运行不会出错 - settings.json 合并必须保留用户已有配置,只动 hooks 字段
- Windows 下路径必须用
C:/风格(cygpath -w),不能用/c/风格 - 安装后必须重启 WorkBuddy 才能生效
- 始终从 GitHub clone 最新版,不依赖 skill 内打包的文件