install.sh 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/bin/sh
  2. # 手工安装:把本插件整目录复制到目标项目或用户级 skills 目录。
  3. #
  4. # ./install.sh ~/work/other-project # 项目级,只在该项目激活
  5. # ./install.sh --user # 用户级,所有项目可用
  6. # ./install.sh --user --force # 覆盖已存在的旧副本
  7. #
  8. # 首选方式是从 marketplace 装(见 README),那样能自动更新。本脚本是给
  9. # 不走 marketplace 的场景留的后路:复制过去的目录带 .claude-plugin/
  10. # manifest,会被当作 <name>@skills-dir 插件就地加载。
  11. #
  12. # 只复制本目录自身,不碰仓库里的任何其他文件。副本不会自动更新——
  13. # API 契约一改,旧副本就静默过期,靠 plugin.json 的 version 判断。
  14. set -eu
  15. SRC=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
  16. NAME=$(basename -- "$SRC")
  17. FORCE=0
  18. TARGET=""
  19. usage() {
  20. sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'
  21. exit "${1:-1}"
  22. }
  23. while [ $# -gt 0 ]; do
  24. case "$1" in
  25. --user) TARGET="$HOME/.claude/skills" ;;
  26. --force|-f) FORCE=1 ;;
  27. -h|--help) usage 0 ;;
  28. -*) echo "未知参数:$1" >&2; usage ;;
  29. *)
  30. if [ ! -d "$1" ]; then
  31. echo "错误:目标目录不存在:$1" >&2
  32. exit 1
  33. fi
  34. TARGET=$(CDPATH= cd -- "$1" && pwd)/.claude/skills
  35. ;;
  36. esac
  37. shift
  38. done
  39. if [ -z "$TARGET" ]; then
  40. echo "错误:请给出目标项目目录,或用 --user 装到用户级。" >&2
  41. usage
  42. fi
  43. DEST="$TARGET/$NAME"
  44. # 版本号只有一处来源:plugin.json。VERSION 文件已废弃,两处版本必然漂移
  45. read_version() {
  46. python3 -c 'import json,sys; print(json.load(open(sys.argv[1])).get("version","(未标版本)"))' \
  47. "$1/.claude-plugin/plugin.json" 2>/dev/null || echo "(读不到 plugin.json)"
  48. }
  49. VERSION=$(read_version "$SRC")
  50. if [ "$DEST" = "$SRC" ]; then
  51. echo "错误:源和目标是同一个目录。" >&2
  52. exit 1
  53. fi
  54. if [ -d "$DEST" ]; then
  55. OLD=$(read_version "$DEST")
  56. if [ "$FORCE" -ne 1 ]; then
  57. echo "目标已存在:$DEST"
  58. echo " 已装版本:$OLD"
  59. echo " 本次版本:$VERSION"
  60. echo "要覆盖请加 --force。"
  61. exit 1
  62. fi
  63. echo "覆盖 $OLD → $VERSION"
  64. rm -rf "$DEST"
  65. fi
  66. mkdir -p "$TARGET"
  67. cp -R "$SRC" "$DEST"
  68. find "$DEST" -name __pycache__ -type d -exec rm -rf {} + 2>/dev/null || true
  69. chmod +x "$DEST/skills/write/scripts/wp.py" "$DEST/skills/write/scripts/wp_login.py" "$DEST/install.sh"
  70. echo "已安装 $NAME $VERSION 到 $DEST"
  71. echo
  72. echo "下一步(凭据在 ~/.wikipali/,多个副本共用,通常不必重新登录):"
  73. echo " python3 $DEST/skills/write/scripts/wp.py whoami"