One-step install

Two scripts do the same thing: write the kit into your ~/.claude (shared by all projects) or into the current project's .claude/. Existing files are never overwritten; the kit version is saved as .kit-new for you to compare and merge.

Way 1: one command (lite kit)

Mac / Linux

Terminal
curl -fsSL https://workflow.maysuns.uk/en/kit/install.sh -o install.sh && bash install.sh --dry-run
# once you have seen what it will do, run it again without --dry-run:
bash install.sh              # install to ~/.claude
bash install.sh --project    # install into the current project

Windows PowerShell

PowerShell
Invoke-WebRequest https://workflow.maysuns.uk/en/kit/install.ps1 -OutFile install.ps1
.\install.ps1 -DryRun       # rehearse first
.\install.ps1               # install to $HOME\.claude
.\install.ps1 -Project      # install into the current project
If it says "running scripts is disabled": powershell -ExecutionPolicy Bypass -File .\install.ps1. Strongly recommended: run once with --dry-run / -DryRun first.

Way 2: download the zip and copy by hand

Download the lite kit zip After unzipping, copy what is in the .claude folder into your ~/.claude or the project's .claude.

What the script does / does not do

DoesDoes not
Download the zip (only from this one address); unzip into a temp folder; copy files that do not exist; save existing ones as .kit-new; create settings.kit-example.json for referenceOverwrite any existing file; modify your settings.json; delete files; upload any data; run code from the zip

Full script contents (read them yourself before running)

install.sh

install.sh Download
#!/usr/bin/env bash
# Starter workflow kit installer (Mac / Linux / Windows Git Bash)
# Usage:
#   bash install.sh                      # install to the user level ~/.claude (shared by all projects), downloads the lite kit
#   bash install.sh --project            # install into the current directory (./CLAUDE.md and ./.claude/)
#   bash install.sh --zip kit.zip        # use a local zip (for the full kit, sign in in the browser and download the zip first)
#   bash install.sh --dry-run            # only show what would be done, write nothing
#   bash install.sh --target /tmp/x      # choose the install directory (use it to try an install in a temp folder first)
# Rule: existing files are NEVER overwritten - the kit version is saved as <file name>.kit-new for you to compare and merge.
#       settings.json is never written; only settings.kit-example.json is created for reference.
set -euo pipefail

URL="https://workflow.maysuns.uk/en/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 needs a path}"; shift ;;
    --dry-run) DRY=1 ;;
    --target) TARGET="${2:?--target needs a path}"; shift ;;
    -h|--help) sed -n '2,10p' "$0"; exit 0 ;;
    *) echo "Unknown option: $1"; exit 1 ;;
  esac
  shift
done

TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
if [ -z "$ZIP" ]; then
  echo "Downloading kit: $URL"
  curl -fsSL "$URL" -o "$TMP/kit.zip"
  ZIP="$TMP/kit.zip"
fi
command -v unzip >/dev/null || { echo "The unzip command is required"; exit 1; }
unzip -q "$ZIP" -d "$TMP/x"
ROOT="$(find "$TMP/x" -mindepth 1 -maxdepth 1 -type d | head -n1)"
[ -n "$ROOT" ] || { echo "No kit folder in the 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=" (dry run)"
echo "Mode: $MODE   Target: $DEST$DRYTXT"

new=0; skipped=0
put() {  # put source-file target-file
  local src="$1" dst="$2"
  if [ -e "$dst" ]; then
    echo "  Skip (exists) $dst -> kit version saved as $dst.kit-new$DRYTXT"
    [ "$DRY" = 1 ] || cp "$src" "$dst.kit-new"
    skipped=$((skipped+1))
  else
    echo "  Create $dst$DRYTXT"
    if [ "$DRY" != 1 ]; then mkdir -p "$(dirname "$dst")"; cp "$src" "$dst"; fi
    new=$((new+1))
  fi
}

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

# 2) CLAUDE.md: project mode puts it in the project root; user mode only saves a template and does not take over your global 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 "Done: created $new, skipped $skipped (already existed; kit versions saved as .kit-new)."
echo "Next: open Claude Code and try /status; then replace the [bracketed] parts of the CLAUDE.md template with your own content."

install.ps1

install.ps1 Download
# Starter workflow kit installer (Windows PowerShell 5.1 / PowerShell 7)
# Usage:
#   .\install.ps1                       # install to the user level $HOME\.claude, downloads the lite kit
#   .\install.ps1 -Project              # install into the current directory (.\CLAUDE.md and .\.claude\)
#   .\install.ps1 -ZipPath kit.zip      # use a local zip (for the full kit, sign in in the browser and download the zip first)
#   .\install.ps1 -DryRun               # only show what would be done, write nothing
# Rule: existing files are NEVER overwritten - the kit version is saved as <file name>.kit-new for you to compare and merge.
#       settings.json is never written; only settings.kit-example.json is created for reference.
#   .\install.ps1 -Target D:\x\.claude  # choose the install directory (use it to try an install in a temp folder first)
param([switch]$Project, [string]$ZipPath = "", [switch]$DryRun, [string]$Target = "")
$ErrorActionPreference = "Stop"
$Url = "https://workflow.maysuns.uk/en/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 "Downloading kit: $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 "No kit folder in the 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 = " (dry run, no files written)" }
  Write-Host "Mode: $Mode   Target: $Dest $suffix"
  $script:new = 0; $script:skipped = 0
  function Put([string]$src, [string]$dst) {
    if (Test-Path -LiteralPath $dst) {
      Write-Host "  Skip (exists) $dst -> kit version saved as $dst.kit-new"
      if (-not $DryRun) { Copy-Item -LiteralPath $src -Destination "$dst.kit-new" -Force }
      $script:skipped++
    } else {
      Write-Host "  Create $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") }  # never touch 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 "Done: created $($script:new), skipped $($script:skipped) (already existed; kit versions saved as .kit-new)."
  Write-Host "Next: open Claude Code and try /status; then replace the [bracketed] parts of the CLAUDE.md template with your own content."
} finally {
  Remove-Item -LiteralPath $Tmp -Recurse -Force -ErrorAction SilentlyContinue
}

How to confirm after installing

  1. User level: ls ~/.claude/commands (Windows: dir $HOME\.claude\commands) should show status.md and others.
  2. Open Claude Code and type /; status, estimate, session-end should appear in the list.
  3. Type /status and see whether it prints normally.