mirror of
https://github.com/jnMetaCode/superpowers-zh.git
synced 2026-09-02 22:54:06 +08:00
- 移除 legacy ~/.config/superpowers/skills 迁移警告块及其 warning_escaped 注入(上游 v6.0.0 已删;与 v6 清理 ~/.config/superpowers/ 一致) - 三处 printf 输出补 | cat,对齐上游输出行为 验证:与上游 v6.0.3 逐字一致;实际运行 hook,三个平台分支 (CURSOR_PLUGIN_ROOT / CLAUDE_PLUGIN_ROOT / COPILOT_CLI) 均输出合法 JSON(字段分别为 additional_context / hookSpecificOutput.additionalContext / additionalContext)。注入内容仍为本 fork 的中文 using-superpowers SKILL.md。 关联 #19(v6 同步追踪)
50 lines
2.2 KiB
Bash
Executable File
50 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# SessionStart hook for superpowers plugin
|
|
|
|
set -euo pipefail
|
|
|
|
# Determine plugin root directory
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
|
|
# Read using-superpowers content
|
|
using_superpowers_content=$(cat "${PLUGIN_ROOT}/skills/using-superpowers/SKILL.md" 2>&1 || echo "Error reading using-superpowers skill")
|
|
|
|
# Escape string for JSON embedding using bash parameter substitution.
|
|
# Each ${s//old/new} is a single C-level pass - orders of magnitude
|
|
# faster than the character-by-character loop this replaces.
|
|
escape_for_json() {
|
|
local s="$1"
|
|
s="${s//\\/\\\\}"
|
|
s="${s//\"/\\\"}"
|
|
s="${s//$'\n'/\\n}"
|
|
s="${s//$'\r'/\\r}"
|
|
s="${s//$'\t'/\\t}"
|
|
printf '%s' "$s"
|
|
}
|
|
|
|
using_superpowers_escaped=$(escape_for_json "$using_superpowers_content")
|
|
session_context="<EXTREMELY_IMPORTANT>\nYou have superpowers.\n\n**Below is the full content of your 'superpowers:using-superpowers' skill - your introduction to using skills. For all other skills, use the 'Skill' tool:**\n\n${using_superpowers_escaped}\n</EXTREMELY_IMPORTANT>"
|
|
|
|
# Output context injection as JSON.
|
|
# Cursor hooks expect additional_context (snake_case).
|
|
# Claude Code hooks expect hookSpecificOutput.additionalContext (nested).
|
|
# Copilot CLI (v1.0.11+) and others expect additionalContext (top-level, SDK standard).
|
|
# Claude Code reads BOTH additional_context and hookSpecificOutput without
|
|
# deduplication, so we must emit only the field the current platform consumes.
|
|
#
|
|
# Uses printf instead of heredoc to work around bash 5.3+ heredoc hang.
|
|
# See: https://github.com/obra/superpowers/issues/571
|
|
if [ -n "${CURSOR_PLUGIN_ROOT:-}" ]; then
|
|
# Cursor sets CURSOR_PLUGIN_ROOT (may also set CLAUDE_PLUGIN_ROOT)
|
|
printf '{\n "additional_context": "%s"\n}\n' "$session_context" | cat
|
|
elif [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && [ -z "${COPILOT_CLI:-}" ]; then
|
|
# Claude Code sets CLAUDE_PLUGIN_ROOT without COPILOT_CLI
|
|
printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": "%s"\n }\n}\n' "$session_context" | cat
|
|
else
|
|
# Copilot CLI (sets COPILOT_CLI=1) or unknown platform — SDK standard format
|
|
printf '{\n "additionalContext": "%s"\n}\n' "$session_context" | cat
|
|
fi
|
|
|
|
exit 0
|