一键安装

两份脚本做同一件事:把套件写进你的 ~/.claude(所有项目共用)或当前项目的 .claude/。已存在的文件一律不覆盖,套件版本另存为 .kit-new,由你自己对比合并。

方式一:命令一行装(精简套件)

Mac / Linux

终端
curl -fsSL https://workflow.maysuns.uk/zh/kit/install.sh -o install.sh && bash install.sh --dry-run
# 看清楚要做什么之后,去掉 --dry-run 再运行:
bash install.sh              # 装到 ~/.claude
bash install.sh --project    # 装到当前项目

Windows PowerShell

PowerShell
Invoke-WebRequest https://workflow.maysuns.uk/zh/kit/install.ps1 -OutFile install.ps1
.\install.ps1 -DryRun       # 先预演
.\install.ps1               # 装到 $HOME\.claude
.\install.ps1 -Project      # 装到当前项目
如果提示"禁止运行脚本":powershell -ExecutionPolicy Bypass -File .\install.ps1。强烈建议先用 --dry-run / -DryRun 看一遍。

方式二:下载 zip 手动复制

下载精简套件 zip 解压后把 .claude 文件夹里的内容复制到你的 ~/.claude 或项目的 .claude 里即可。

脚本会做什么 / 不会做什么

会不会
下载 zip(只访问本站这一个地址);在临时目录解压;复制不存在的文件;已存在的文件另存为 .kit-new;生成 settings.kit-example.json 供参考覆盖任何已有文件;修改你的 settings.json;删除文件;上传任何数据;运行 zip 里的代码

完整脚本内容(运行前请自己读一遍)

install.sh

install.sh 下载
#!/usr/bin/env bash
# 起步工作流套件 安装脚本(Mac / Linux / Windows Git Bash)
# 用法:
#   bash install.sh                      # 装到用户级 ~/.claude(所有项目共用),下载精简套件
#   bash install.sh --project            # 装到当前目录(./CLAUDE.md 与 ./.claude/)
#   bash install.sh --zip 套件.zip       # 用本地 zip(完整套件请先在浏览器登录后下载 zip)
#   bash install.sh --dry-run            # 只显示将做什么,不写任何文件
#   bash install.sh --target /tmp/x      # 指定安装目录(想先在临时目录试装时用)
# 规则:已存在的文件一律不覆盖——套件版本另存为 <文件名>.kit-new,由你自己对比合并。
#       settings.json 永远不写,只生成 settings.kit-example.json 供参考。
set -euo pipefail

URL="https://workflow.maysuns.uk/zh/kit/workflow-starter-lite.zip"
MODE="user"; ZIP=""; DRY=0; TARGET=""
while [ $# -gt 0 ]; do
  case "$1" in
    --project) MODE="project" ;;
    --user) MODE="user" ;;
    --zip) ZIP="${2:?--zip 需要路径}"; shift ;;
    --dry-run) DRY=1 ;;
    --target) TARGET="${2:?--target 需要路径}"; shift ;;
    -h|--help) sed -n '2,10p' "$0"; exit 0 ;;
    *) echo "未知参数:$1"; exit 1 ;;
  esac
  shift
done

TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
if [ -z "$ZIP" ]; then
  echo "下载套件:$URL"
  curl -fsSL "$URL" -o "$TMP/kit.zip"
  ZIP="$TMP/kit.zip"
fi
command -v unzip >/dev/null || { echo "需要 unzip 命令"; exit 1; }
unzip -q "$ZIP" -d "$TMP/x"
ROOT="$(find "$TMP/x" -mindepth 1 -maxdepth 1 -type d | head -n1)"
[ -n "$ROOT" ] || { echo "zip 里没有套件目录"; exit 1; }

if [ -n "$TARGET" ]; then MODE="target"; DEST="$TARGET"; CLAUDE_DIR="$TARGET"
elif [ "$MODE" = "project" ]; then DEST="$PWD"; CLAUDE_DIR="$DEST/.claude"; else DEST="$HOME/.claude"; CLAUDE_DIR="$DEST"; fi
DRYTXT=""; [ "$DRY" = 1 ] && DRYTXT="(预演)"
echo "模式:$MODE 目标:$DEST$DRYTXT"

new=0; skipped=0
put() {  # put 源文件 目标文件
  local src="$1" dst="$2"
  if [ -e "$dst" ]; then
    echo "  跳过(已存在)$dst → 套件版本另存为 $dst.kit-new$DRYTXT"
    [ "$DRY" = 1 ] || cp "$src" "$dst.kit-new"
    skipped=$((skipped+1))
  else
    echo "  新建 $dst$DRYTXT"
    if [ "$DRY" != 1 ]; then mkdir -p "$(dirname "$dst")"; cp "$src" "$dst"; fi
    new=$((new+1))
  fi
}

# 1) .claude 下的 rules / commands / skills
while IFS= read -r f; do
  rel="${f#"$ROOT/.claude/"}"
  case "$rel" in
    settings.example.json) put "$f" "$CLAUDE_DIR/settings.kit-example.json" ;;  # 永远不碰 settings.json
    *) put "$f" "$CLAUDE_DIR/$rel" ;;
  esac
done < <(find "$ROOT/.claude" -type f | sort)

# 2) CLAUDE.md:项目模式放项目根目录;用户模式只放成模板,不占用你的全局 CLAUDE.md
if [ -f "$ROOT/CLAUDE.md" ]; then
  if [ "$MODE" = "project" ]; then put "$ROOT/CLAUDE.md" "$DEST/CLAUDE.md"; else put "$ROOT/CLAUDE.md" "$DEST/CLAUDE.kit-template.md"; fi
fi

echo "完成:新建 $new 个,跳过 $skipped 个(已存在,套件版本另存为 .kit-new)。"
echo "下一步:打开 Claude Code,输入 /status 试试;再把 CLAUDE.md 模板里的【】部分改成你的内容。"

install.ps1

install.ps1 下载
# 起步工作流套件 安装脚本(Windows PowerShell 5.1 / PowerShell 7)
# 用法:
#   .\install.ps1                       # 装到用户级 $HOME\.claude,下载精简套件
#   .\install.ps1 -Project              # 装到当前目录(.\CLAUDE.md 与 .\.claude\)
#   .\install.ps1 -ZipPath 套件.zip     # 用本地 zip(完整套件请先在浏览器登录后下载 zip)
#   .\install.ps1 -DryRun               # 只显示将做什么,不写任何文件
# 规则:已存在的文件一律不覆盖——套件版本另存为 <文件名>.kit-new,由你自己对比合并。
#       settings.json 永远不写,只生成 settings.kit-example.json 供参考。
#   .\install.ps1 -Target D:\x\.claude  # 指定安装目录(想先在临时目录试装时用)
param([switch]$Project, [string]$ZipPath = "", [switch]$DryRun, [string]$Target = "")
$ErrorActionPreference = "Stop"
$Url = "https://workflow.maysuns.uk/zh/kit/workflow-starter-lite.zip"
$Tmp = Join-Path ([System.IO.Path]::GetTempPath()) ("kit_" + [guid]::NewGuid().ToString("N"))
New-Item -ItemType Directory -Path $Tmp | Out-Null
try {
  if (-not $ZipPath) {
    Write-Host "下载套件:$Url"
    $ZipPath = Join-Path $Tmp "kit.zip"
    Invoke-WebRequest -Uri $Url -OutFile $ZipPath -UseBasicParsing
  }
  Expand-Archive -Path $ZipPath -DestinationPath (Join-Path $Tmp "x") -Force
  $Root = Get-ChildItem (Join-Path $Tmp "x") -Directory | Select-Object -First 1
  if (-not $Root) { throw "zip 里没有套件目录" }
  $RootPath = $Root.FullName
  if ($Target) { $Dest = $Target; $ClaudeDir = $Target; $Mode = "target" }
  elseif ($Project) { $Dest = (Get-Location).Path; $ClaudeDir = Join-Path $Dest ".claude"; $Mode = "project" }
  else { $Dest = Join-Path $HOME ".claude"; $ClaudeDir = $Dest; $Mode = "user" }
  $suffix = ""; if ($DryRun) { $suffix = "(预演,不写文件)" }
  Write-Host "模式:$Mode 目标:$Dest $suffix"
  $script:new = 0; $script:skipped = 0
  function Put([string]$src, [string]$dst) {
    if (Test-Path -LiteralPath $dst) {
      Write-Host "  跳过(已存在)$dst → 套件版本另存为 $dst.kit-new"
      if (-not $DryRun) { Copy-Item -LiteralPath $src -Destination "$dst.kit-new" -Force }
      $script:skipped++
    } else {
      Write-Host "  新建 $dst"
      if (-not $DryRun) {
        New-Item -ItemType Directory -Path (Split-Path $dst) -Force | Out-Null
        Copy-Item -LiteralPath $src -Destination $dst
      }
      $script:new++
    }
  }
  $dotClaude = Join-Path $RootPath ".claude"
  Get-ChildItem -LiteralPath $dotClaude -Recurse -File | Sort-Object FullName | ForEach-Object {
    $rel = $_.FullName.Substring($dotClaude.Length).TrimStart('\','/')
    if ($rel -eq "settings.example.json") { Put $_.FullName (Join-Path $ClaudeDir "settings.kit-example.json") }  # 永远不碰 settings.json
    else { Put $_.FullName (Join-Path $ClaudeDir $rel) }
  }
  $cm = Join-Path $RootPath "CLAUDE.md"
  if (Test-Path -LiteralPath $cm) {
    if ($Project -and -not $Target) { Put $cm (Join-Path $Dest "CLAUDE.md") } else { Put $cm (Join-Path $Dest "CLAUDE.kit-template.md") }
  }
  Write-Host "完成:新建 $($script:new) 个,跳过 $($script:skipped) 个(已存在,套件版本另存为 .kit-new)。"
  Write-Host "下一步:打开 Claude Code,输入 /status 试试;再把 CLAUDE.md 模板里的【】部分改成你的内容。"
} finally {
  Remove-Item -LiteralPath $Tmp -Recurse -Force -ErrorAction SilentlyContinue
}

装完后怎么确认

  1. 用户级:ls ~/.claude/commands(Windows:dir $HOME\.claude\commands)应看到 status.md 等文件。
  2. 打开 Claude Code,输入 /,列表里应出现 status、estimate、session-end。
  3. 输入 /status 看能否正常输出。