[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C4NJM4ARCNA790DCG3YSWF":3,"skill-same:01M6C4NJM4ARCNA790DCG3YSWF":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":50,"linkOnly":51,"markdownContent":52,"markdownBody":53,"frontMatter":54,"refName":32,"commitSha":64,"skillDirectory":65,"forksCount":66,"repositoryHtmlUrl":67,"repositoryHomepageUrl":6,"ownerHtmlUrl":68,"ownerBlogUrl":69,"ownerDescription":70,"updatedAt":71,"install":72,"resources":84},"01M6C4NJM4ARCNA790DCG3YSWF","cursor-do",null,"Delegate a single write task to Cursor Composer via cursor-companion.sh inside an isolated worktree, then Lead-review the diff and cherry-pick. Use when user invokes cursor:do, says delegate to cursor, have composer write it, refactor with cursor, hand a file edit to Composer. Do NOT load for: planning, code review only, read-only investigation, or multi-task team runs (use breezing --cursor or cursor:ask instead).","Chachamaru127\u002Fclaude-code-harness","Chachamaru127","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F96473544?v=4","01M6C4N084DDDEK9SJPGFG9H9M","Chachamaru","01M6C4N0CCNFST9P8C7EJNVH42",3209,"MIT","https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Fcodex\u002F.codex\u002Fskills\u002Fcursor-do\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"do","cursor do","cursor","ask","when","hand","composer","done","main","breezing","only","diff","use","code review","delegate","pick","plan","Bash","team","wt","file","worktree","harness","planning","code","review","2026-11-10 10:12:30",false,"---\nname: cursor-do\ndescription: \"Delegate a single write task to Cursor Composer via cursor-companion.sh inside an isolated worktree, then Lead-review the diff and cherry-pick. Use when user invokes cursor:do, says delegate to cursor, have composer write it, refactor with cursor, hand a file edit to Composer. Do NOT load for: planning, code review only, read-only investigation, or multi-task team runs (use breezing --cursor or cursor:ask instead).\"\ndescription-en: \"Delegate a single write task to Cursor Composer via cursor-companion.sh inside an isolated worktree, then Lead-review the diff and cherry-pick. Use when user invokes cursor:do, says delegate to cursor, have composer write it, refactor with cursor, hand a file edit to Composer. Do NOT load for: planning, code review only, read-only investigation, or multi-task team runs (use breezing --cursor or cursor:ask instead).\"\ndescription-ja: \"1 件の write タスクを Cursor Composer に委譲するスキル。専用 worktree (.claude\u002Fworktrees\u002Fcursor-do-\u003Cid>) を切って `cursor-companion.sh task --write --workspace \u003Cwt>` を直接呼び、Lead が diff レビュー → main へ cherry-pick → Plans.md `cc:done [hash]` 更新まで一気通貫する。Use when user mentions cursor:do, cursor で実装して, composer に書かせて, カーソルにやらせて, refactor を Cursor に, ファイル編集を Composer に. Do NOT load for: 計画 (harness-plan), レビューのみ (harness-review), 読み取り調査 (cursor:ask), 複数タスク並列 (breezing --cursor を使う).\"\nallowed-tools: [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Glob\", \"Grep\"]\nargument-hint: \"[task-description]\"\nuser-invocable: true\n---\n\n# cursor:do — Single-Task Write Delegate to Cursor Composer\n\n1 件の実装タスクを Cursor Composer (`composer-2.5-fast`) に専用 worktree 内で委譲し、Lead が diff をレビューしてから main へ cherry-pick する skill。breezing の team フローを起こさず、1 タスク 1 cherry-pick を最短経路で回す。\n\n封じ込めは Cursor 側にはない ([references\u002Fcursor-cli-only.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fcursor-cli-only.md))。**専用 `.git` を持つ worktree + Lead diff review + cherry-pick (R01-R13 経路)** の 3 点だけが実効的な境界。cursor の出力は Lead レビューまで untrusted として扱う。\n\n## Step 0 — NARRATION RULES (UX Contract)\n\n敵は **冗長さ** であって進捗報告ではない。breezing と同じ契約。**起動時に banner + 実行計画を簡潔に明示してから実行する**。見やすい進捗報告は歓迎、冗長な繰り返しのみ禁止。\n\n### 起動時に必ず出すもの (banner + plan、合計 5 行以内)\n\n```\n? cursor \u002F composer-2.5-fast \u002F feat\u002Ffoo-bar \u002F Add login form validation\nこれから:\n1. pre-check (branch \u002F cursor-agent) → 専用 worktree 作成\n2. composer に実装委譲 (--write)\n3. diff レビュー → cherry-pick → Plans.md 更新\n```\n\nbanner 1 行 (`? cursor \u002F composer-2.5-fast \u002F \u003Cbranch> \u002F \u003Ctask>`) + 計画 2-4 行。1 秒以内に出し、即 Step 1 へ。\n\n### 進捗報告は出してよい (見やすい範囲で)\n\n- 各ステップの開始・完了を 1 行ステータスで (`✓ worktree 作成: .claude\u002Fworktrees\u002Fcursor-do-...`)\n- pre-check \u002F resolve の要点、cherry-pick した SHA\n- なぜこの分岐を取るかの理由を 1 行で\n\n### 禁止 (= 冗長さ)\n\n- **同じ事実の 2 回言い換え**: pre-check 結果を後段で再説明しない\n- **中身のない前置き**: tool call で自明な宣言だけの行\n- **3 行以上の経緯振り返り**: 必要なら 1 行に圧縮\n- **起動シーケンス中の ★ Insight ブロック**: Insight は最終 report で 1 回のみ\n\n違反例 (冗長):\n```\n× 「composer 2.5 で実装する流れですね、まず確認します」（中身のない前置き）\n× 「Cursor を呼ぶ前に branch を見ます」 → bash → 「branch を確認しました」（言い換え）\n× ★ Insight ──── Cursor の強みは…\n```\n\n正常例 (簡潔 + 計画明示):\n```\n? cursor \u002F composer-2.5-fast \u002F feat\u002Ffoo-bar \u002F Add login form validation\nこれから: worktree 作成 → composer に実装委譲 → diff レビュー → cherry-pick\n```\n\n## Step 1 — banner + plan を出し切る (1 秒以内)\n\n引数 `$ARGUMENTS` をタスク説明として受ける。空なら直前の明示依頼と選択済み Plans.md を読み、対象を回収する。\nそれでも対象を特定できない場合だけ、以下のマーカーを出力してユーザーに 1 行タスクを要求し、入力後に Step 2 へ進む:\n\n```\nCURSOR_DO_AWAITING_TASK: provide a one-line task description as $ARGUMENTS\n```\n\n引数があれば、即 1 行 echo:\n\n```\n? cursor \u002F composer-2.5-fast \u002F \u003Ccurrent-branch> \u002F \u003Ctask-first-60-chars>\n```\n\n`\u003Ccurrent-branch>` は Step 2 で取得する値だが、Step 1 では未取得のため `…` でも可。Step 2 直後に確定値を 1 行で再出力する。Step 0 の banner + 実行計画 (5 行以内) はここで出し切り、以降は各ステップの 1 行ステータスで進捗を見せる。冗長な繰り返しのみ避ける。\n\n## Step 2 — 並列 pre-check (1 bash)\n\n1 つの bash 呼び出しで以下を並列に取り、結果だけを 1 ブロックで受ける。個別の説明は出さない。\n\n```bash\nbash -c '\n  set +e\n  echo \"==BRANCH==\"; git branch --show-current\n  echo \"==VERSION==\"; cat VERSION 2>\u002Fdev\u002Fnull\n  echo \"==PLANS_TAIL==\"; tail -n 12 Plans.md 2>\u002Fdev\u002Fnull\n  echo \"==CURSOR_AGENT==\"\n  CURSOR_AGENT_BIN=\"${CURSOR_AGENT_BIN:-}\"\n  if [ -z \"$CURSOR_AGENT_BIN\" ]; then\n    # `agent`（公式の新表記）→ `cursor-agent`（legacy alias）の順に探す。\n    # `agent` は汎用的な名前なので、symlink 解決後の実パスの「成分」に\n    # cursor-agent が完全一致で現れる場合だけ採用する（部分文字列一致だと\n    # \u002Fx\u002Fcursor-agent-not-really\u002Fagent のようなディレクトリ名で突破される）。\n    for _c in agent cursor-agent; do\n      _p=\"$(command -v \"$_c\" 2>\u002Fdev\u002Fnull)\" || continue\n      [ -n \"$_p\" ] || continue\n      _r=\"$(realpath \"$_p\" 2>\u002Fdev\u002Fnull || readlink -f \"$_p\" 2>\u002Fdev\u002Fnull || echo \"$_p\")\"\n      case \"\u002F$_r\u002F\" in *\u002Fcursor-agent\u002F*) CURSOR_AGENT_BIN=\"$_p\"; break ;; esac\n    done\n    if [ -z \"$CURSOR_AGENT_BIN\" ] && [ -x \"$HOME\u002F.local\u002Fbin\u002Fcursor-agent\" ]; then\n      CURSOR_AGENT_BIN=\"$HOME\u002F.local\u002Fbin\u002Fcursor-agent\"\n    fi\n  fi\n  if [ -z \"$CURSOR_AGENT_BIN\" ]; then\n    echo \"NOT_INSTALLED\"\n  else\n    \"$CURSOR_AGENT_BIN\" --version 2>\u002Fdev\u002Fnull || echo \"NOT_INSTALLED\"\n  fi\n'\n```\n\n判定:\n- `CURSOR_AGENT=NOT_INSTALLED` → `ERROR: cursor-agent not found (exit 3 expected from companion). Install via setup-cursor.sh.` を出し終了。\n- `BRANCH` が `main` \u002F `master` → `WARN: on protected branch — cherry-pick target is HEAD of this branch. Confirm intent or switch.` を出し継続。\n\n## Step 3 — plugin root + backend + model resolve (1 bash)\n\n`HARNESS_PLUGIN_ROOT` \u002F `CLAUDE_PLUGIN_ROOT` が未設定だと `:-.` fallback が consumer repo の cwd に解決し、`scripts\u002Fcursor-companion.sh` が見えず起動不能になる (Issue #193 §2)。hooks.json と同じ `valid_root` パターンで堅牢に解決する。\n\n```bash\nbash -c '\n  set -euo pipefail\n  valid_root() {\n    [ -n \"${1:-}\" ] && [ -f \"$1\u002Fscripts\u002Fcursor-companion.sh\" ] && { [ -f \"$1\u002F.claude-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.codex-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.cursor-plugin\u002Fplugin.json\" ]; }\n  }\n  HARNESS_PLUGIN_ROOT=\"${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}\"\n  ROOT=\"$HARNESS_PLUGIN_ROOT\"\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    if [ -n \"${CLAUDE_SKILL_DIR:-}\" ]; then\n      probe=\"$(cd \"${CLAUDE_SKILL_DIR}\" && pwd)\"\n      while [ \"$probe\" != \"\u002F\" ] && ! valid_root \"$probe\"; do\n        probe=\"$(cd \"$probe\u002F..\" && pwd)\"\n      done\n      valid_root \"$probe\" && ROOT=\"$probe\"\n    fi\n  fi\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    for c in \"${CLAUDE_PROJECT_DIR:-}\" \"$PWD\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Fclaude-code-harness-marketplace\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fcache\u002Fclaude-code-harness-marketplace\u002Fclaude-code-harness\u002F\"*; do\n      if valid_root \"$c\"; then ROOT=\"$c\"; break; fi\n    done\n  fi\n  if ! valid_root \"$ROOT\"; then\n    echo \"ERROR: claude-code-harness plugin root not found (no scripts\u002Fcursor-companion.sh)\" >&2\n    exit 2\n  fi\n  HARNESS_PLUGIN_ROOT=\"$ROOT\"\n  BACKEND=$(bash \"${HARNESS_PLUGIN_ROOT}\u002Fscripts\u002Fresolve-impl-backend.sh\" --backend cursor --role worker)\n  MODEL=$(bash \"${HARNESS_PLUGIN_ROOT}\u002Fscripts\u002Fmodel-routing.sh\" --host cursor --role worker --field model)\n  echo \"PLUGIN_ROOT=${HARNESS_PLUGIN_ROOT}\"\n  echo \"BACKEND=$BACKEND\"\n  echo \"MODEL=$MODEL\"\n'\n```\n\n返却値: `PLUGIN_ROOT` (Step 5 で使う) \u002F `BACKEND` (必ず `cursor`) \u002F `MODEL` (通常 `composer-2.5-fast`)。`BACKEND` または `MODEL` が空なら `ERROR: backend\u002Fmodel resolution failed` を 1 行で出して終了。`PLUGIN_ROOT` 解決失敗は上記スクリプトが exit 2 で報告する。\n\n## Step 4 — 専用 worktree 作成\n\n衝突しない id を作って worktree を切る。**main tree や `$HOME` を指してはならない** (companion 側 guard で exit 2 になる)。`WT_DIR` は絶対パスで作る (Step 5 の `--workspace` は companion の `is not a directory` ガードで相対パスを exit 2 にすることがあるため、Issue #193 §4)。\n\n```bash\nbash -c '\n  set -euo pipefail\n  REPO_ROOT=\"$(git rev-parse --show-toplevel)\"\n  cd \"$REPO_ROOT\"\n  ID=\"$(date +%Y%m%d-%H%M%S)-$$\"\n  WT_DIR=\"$REPO_ROOT\u002F.claude\u002Fworktrees\u002Fcursor-do-${ID}\"\n  BASE_REF=\"$(git rev-parse HEAD)\"\n  BASE_BRANCH=\"$(git branch --show-current)\"\n  WT_BRANCH=\"cursor-do\u002F${ID}\"\n  mkdir -p \"$REPO_ROOT\u002F.claude\u002Fworktrees\"\n  git worktree add -b \"${WT_BRANCH}\" \"${WT_DIR}\" \"${BASE_REF}\"\n  echo \"REPO_ROOT=${REPO_ROOT}\"\n  echo \"WT_DIR=${WT_DIR}\"\n  echo \"WT_BRANCH=${WT_BRANCH}\"\n  echo \"BASE_REF=${BASE_REF}\"\n  echo \"BASE_BRANCH=${BASE_BRANCH}\"\n'\n```\n\n返却された `WT_DIR` \u002F `WT_BRANCH` \u002F `BASE_REF` \u002F `BASE_BRANCH` を以降の Step で使う。失敗時 (branch 名衝突等) は `ID` を作り直して 1 回だけ retry。2 回連続失敗で `ERROR: worktree creation failed` を出し終了。\n\n## Step 5 — cursor-companion.sh task --write で委譲\n\nLead が直接 companion を呼ぶ ([references\u002Fcursor-cli-only.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fcursor-cli-only.md) Topology 節 — 非 claude backend では Worker 介在なし)。プロンプトは引数の task そのまま + 必要な追補のみ。冗長な前置きは付けない。\n\n```bash\nbash -c '\n  set -euo pipefail\n  valid_root() {\n    [ -n \"${1:-}\" ] && [ -f \"$1\u002Fscripts\u002Fcursor-companion.sh\" ] && { [ -f \"$1\u002F.claude-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.codex-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.cursor-plugin\u002Fplugin.json\" ]; }\n  }\n  HARNESS_PLUGIN_ROOT=\"${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}\"\n  ROOT=\"${PLUGIN_ROOT:-$HARNESS_PLUGIN_ROOT}\"\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    if [ -n \"${CLAUDE_SKILL_DIR:-}\" ]; then\n      probe=\"$(cd \"${CLAUDE_SKILL_DIR}\" && pwd)\"\n      while [ \"$probe\" != \"\u002F\" ] && ! valid_root \"$probe\"; do\n        probe=\"$(cd \"$probe\u002F..\" && pwd)\"\n      done\n      valid_root \"$probe\" && ROOT=\"$probe\"\n    fi\n  fi\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    for c in \"${CLAUDE_PROJECT_DIR:-}\" \"$PWD\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Fclaude-code-harness-marketplace\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fcache\u002Fclaude-code-harness-marketplace\u002Fclaude-code-harness\u002F\"*; do\n      if valid_root \"$c\"; then ROOT=\"$c\"; break; fi\n    done\n  fi\n  if ! valid_root \"$ROOT\"; then\n    echo \"ERROR: claude-code-harness plugin root not found (no scripts\u002Fcursor-companion.sh)\" >&2\n    exit 2\n  fi\n  HARNESS_PLUGIN_ROOT=\"$ROOT\"\n  PROMPT=\"\u003Ctask-description>\nPurpose and why: \u003Cexpected outcome and user need>\nOwned paths and non-goals: \u003Cassigned files\u002Fmodules and excluded work>\nDefinition of done: \u003Cobservable conditions and required checks>\nContract and authorization references: \u003Cselected plan\u002Fspec paths and original user instruction or applicable approval record>\nAvailable evidence: \u003Cobserved state, prior attempts, findings and artifact paths>\n\nConstraints:\n- Choose the implementation method within the assigned scope. Other workers may be active; preserve their edits.\n- Recover missing context from the supplied contracts and read-only inspection first. State minor assumptions; stop only the action that needs a material decision or missing authorization.\n- Complete authorized reversible work without asking again. Inferred scope is not authorization for protected operations.\n- Preserve required TDD and validation. After required checks pass, add checks only for new changes, failures, or unresolved concerns.\n- Match existing code style and naming.\n- Create exactly one git commit if your environment supports it; otherwise leave one dirty changeset for Lead auto-commit.\n- Do not touch .claude-plugin\u002Fsettings*, .claude\u002Fsettings*, .eslintrc*, biome.json, tsconfig*.json.\n- Return the result, decision reasons, changed paths, check commands\u002Fresults and remaining limitations. A success claim alone is not evidence.\"\n  bash \"${HARNESS_PLUGIN_ROOT}\u002Fscripts\u002Fcursor-companion.sh\" task \\\n    --write \\\n    --workspace \"${WT_DIR}\" \\\n    \"${PROMPT}\"\n' 2>&1\n```\n\n判定:\n- exit 0 + result text → Step 6 へ\n- exit 1 (result-error) → companion stderr を 1 行要約して `ERROR: cursor returned is_error\u002Fempty result` を出し終了。worktree は Step 8 のクリーンアップで削除\n- exit 2 (bad-guard) → 設定不備。原因 (workspace 指定誤り等) を 1 行で示し終了\n- exit 3 (not-found) → Step 2 で検出済みのはずだが、再度遭遇したら同様に終了\n\n## Step 6 — Lead diff review\n\nworktree 内で Composer が作成した変更を読み、目視レビュー + contract grep の二段ゲートを通す (`harness-work` 「Lead の cherry-pick 前ゲート」と同じ契約)。\n\n**注意 (Issue #193 §1)**: Cursor Composer は `--write` でファイル編集を行うが **commit は作らない**ことがある。worktree が dirty なまま放置すると Step 7 の cherry-pick 対象から漏れ、ユーザー視点で「完了したのに main に何も入らない」状態になる。本 Step 冒頭で dirty なら、既存 commit がある場合は amend、commit がない場合は Lead 側で 1 commit にまとめる。\n\n```bash\nbash -c '\n  set -euo pipefail\n  cd \"${WT_DIR}\"\n  # Composer は dirty changeset を返すことがあるため、既存 commit に fold する\n  if [ -n \"$(git status --porcelain)\" ]; then\n    git add -A\n    if [ \"$(git rev-list --count \"${BASE_REF}..HEAD\")\" -gt 0 ]; then\n      git -c user.name=\"cursor-composer\" -c user.email=\"cursor-composer@local\" \\\n        commit --amend --no-edit --no-verify\n      echo \"==AUTO_AMENDED==\"\n    else\n      git -c user.name=\"cursor-composer\" -c user.email=\"cursor-composer@local\" \\\n        commit --no-verify -m \"cursor: ${TASK_SUMMARY:-cursor-do delegated change}\"\n      echo \"==AUTO_COMMITTED==\"\n    fi\n    git log -1 --oneline\n  fi\n  echo \"==LOG==\"\n  git log --oneline \"${BASE_REF}..HEAD\"\n  echo \"==STAT==\"\n  git diff --stat \"${BASE_REF}..HEAD\"\n  echo \"==DIFF==\"\n  git diff \"${BASE_REF}..HEAD\"\n'\n```\n\n`TASK_SUMMARY` は引数 task の先頭 60 文字以内に圧縮した文字列を Lead が事前に export しておく (例: `TASK_SUMMARY=\"Add login form validation\"`)。未設定なら fallback メッセージ `cursor-do delegated change` を使う。`--no-verify` を付けるのは worktree 内の編集を「Lead レビュー前の中間 commit」として扱うため (cherry-pick 後の main commit で R01-R13 と pre-commit hook を通す)。\n\nLead は diff 全文を Read し、以下を確認する:\n\n- 変更が依頼タスクの範囲内か (関係ないファイルを触っていないか)\n- protected path (`.claude-plugin\u002Fsettings*`, `.eslintrc*`, etc.) を変更していないか\n- secret \u002F `.env` \u002F 認証情報を含まないか\n- 公開 support tier 表記を破壊していないか。contract gates は必ず candidate worktree (`WT_DIR`) 内で実行する:\n  ```bash\n  [ ! -f \"${WT_DIR}\u002Ftests\u002Ftest-support-claim-wording.sh\" ] || (cd \"${WT_DIR}\" && bash tests\u002Ftest-support-claim-wording.sh)\n  [ ! -f \"${WT_DIR}\u002Fscripts\u002Fci\u002Fcheck-consistency.sh\" ] || (cd \"${WT_DIR}\" && bash scripts\u002Fci\u002Fcheck-consistency.sh)\n  [ ! -f \"${WT_DIR}\u002Ftests\u002Fvalidate-plugin.sh\" ] || (cd \"${WT_DIR}\" && bash tests\u002Fvalidate-plugin.sh)\n  ```\n\n判定:\n- 問題なし → Step 7 へ\n- 範囲外変更あり → 該当 commit を `git reset` で巻き戻すか、Cursor に再委譲 (Step 5 を 1 回だけ retry)。2 回失敗で `REQUEST_CHANGES: \u003C理由>` を出し、worktree を残したまま終了\n- protected path \u002F secret 検出 → 即 abort。`ABORT: protected path violation` を出し worktree 削除\n\n## Step 7 — cherry-pick + Plans.md cc:done 更新\n\nworktree から main tree に cherry-pick する。Cursor prompt は exactly one commit 契約だが、Composer は dirty changeset を返すことがあるため Step 6 で commit\u002Famend する。複数 commit が残った場合は main tree を触る前に停止する。\nさらに cherry-pick 前に `Plans.md` の staged \u002F unstaged 差分がないことを確認する。理由: 既存差分がある状態で後続の `git add Plans.md && git commit --amend` を行うと、task と無関係な plan\u002Fstatus 編集を Cursor の code commit に巻き込むため。\n**SHA 直接指定** (branch 名経由ではない) で reviewer state drift を避ける (MEMORY: reviewer_state_drift)。\n\n```bash\nbash -c '\n  set -euo pipefail\n  COMMIT_COUNT=\"$(cd \"${WT_DIR}\" && git rev-list --count \"${BASE_REF}..HEAD\")\"\n  if [ \"${COMMIT_COUNT}\" -eq 0 ]; then\n    echo \"ERROR: no commits to cherry-pick\"\n    exit 1\n  fi\n  if [ \"${COMMIT_COUNT}\" -ne 1 ]; then\n    echo \"ERROR: cursor returned ${COMMIT_COUNT} commits; expected exactly one. Keep worktree for manual review: ${WT_DIR}\"\n    exit 1\n  fi\n  if ! git diff --quiet -- Plans.md || ! git diff --cached --quiet -- Plans.md; then\n    echo \"ERROR: Plans.md has pre-existing local edits; refusing to cherry-pick before the cursor:do marker amend\"\n    exit 1\n  fi\n  SHA=\"$(cd \"${WT_DIR}\" && git rev-parse HEAD)\"\n  git cherry-pick \"${SHA}\"\n  echo \"==CHERRY_PICKED==\"\n  git log --oneline -n 1\n'\n```\n\ncherry-pick で conflict が出たら `git cherry-pick --abort` し、`CHERRY_PICK_CONFLICT: \u003Cfiles>` を 1 行で示して終了 (worktree は残す、ユーザー判断)。\n\ncherry-pick 後、Plans.md に対応行があれば該当タスクのマーカーを更新する。\n上記の clean precondition を通過しているため、ここで発生する Plans.md 差分は marker-only diff として扱う:\n\n```\n| \u003Ctask> | ... | cc:done [\u003Cmerged-sha>] |\n```\n\n該当行の特定: 引数 task 文字列の先頭 40 文字で grep し、ヒットした最初の `cc:TODO` \u002F `cc:WIP` \u002F `cc:todo` 行を `cc:done [\u003Csha>]` に置換する。ヒットなしなら更新スキップ (Plans.md 外のタスクとして扱う)。\n\nマーカーを更新した場合、その編集は cherry-pick commit に含める。未コミットの `Plans.md` を残して cleanup \u002F 完了報告へ進んではならない。\n以下の amend block は、上記 precondition 通過後に実行した marker-only diff だけを対象にする:\n\n```bash\nbash -c '\n  set -euo pipefail\n  if git diff --quiet -- Plans.md; then\n    echo \"PLANS_UPDATED=0\"\n  else\n    git add Plans.md\n    git commit --amend --no-edit\n    echo \"PLANS_UPDATED=1\"\n    echo \"MERGED_SHA=$(git rev-parse HEAD)\"\n  fi\n'\n```\n\n## Step 8 — worktree cleanup + 完了報告 (1 ブロック)\n\ncherry-pick 成功後、worktree を delete する。失敗 path では呼ばれない（worktree を残してユーザー判断）。\n\n```bash\nbash -c '\n  set -euo pipefail\n  git worktree remove --force \"${WT_DIR}\"\n  git branch -D \"${WT_BRANCH}\" 2>\u002Fdev\u002Fnull || true\n  echo \"==CLEANUP==\"\n  git worktree list | grep -v \"cursor-do-\" || true\n'\n```\n\n完了報告は **1 ブロック** で出す。中間ナレーションなし:\n\n```\ncursor:do completed\n   task: \u003Ctask-first-60-chars>\n   commits: \u003Ccount>\n   base: \u003CBASE_REF> → cherry-picked into \u003CBASE_BRANCH>\n   plans: \u003Cupdated|skipped (no match)>\n   files: \u003Cchanged-file-count> changed, +\u003Cinserts> -\u003Cdeletes>\n   checks: \u003Ccommands, results and evidence paths>\n   unverified: \u003Cremaining limitations or none observed within the checked scope>\n```\n\n## Full Containment (write mode 必須)\n\n| 層 | 役割 | skip 可否 |\n|---|---|---|\n| 専用 `.git` worktree | cursor の書込を main tree から隔離 | 不可（必須） |\n| Lead diff review | untrusted cursor 出力の品質ゲート | 不可（必須） |\n| contract-grep ゲート | docs \u002F locale \u002F matrix 固定文字列の保護 | 不可（必須） |\n| cherry-pick → main | R01-R13 guard rail を通す唯一の経路 | 不可（必須） |\n| Plans.md cc:done 更新 | 台帳との sync | 該当行なければ skip 可 |\n\n## Prohibited\n\n- `--force` \u002F `--yolo` を companion に渡す（Cursor 公式 \"Never use\"）\n- cursor 出力を Lead レビュー前に main へ直接 commit する\n- protected path (`.claude-plugin\u002Fsettings*`, `.eslintrc*`, `tsconfig*.json`, etc.) を Step 5 の prompt で許可する\n- `$HOME` \u002F `\u002F` \u002F main tree を `--workspace` に指定する\n- Plans.md の `cc:*` マーカーを task と無関係に書き換える\n\n## Related Skills \u002F Rules\n\n- `cursor:ask` — 読取専用の質問・調査・敵対的視点 (worktree 不要)\n- `breezing --cursor` — 複数タスクを team フローで cursor 委譲する場合\n- `harness-work` — claude backend の default フロー (Worker agent 経由)\n- `references\u002Fcursor-cli-only.md` — Cursor backend governance + Topology (旧 `.claude\u002Frules\u002Fcursor-cli-only.md` の全文がここに移設済み)\n","# cursor:do — Single-Task Write Delegate to Cursor Composer\n\n1 件の実装タスクを Cursor Composer (`composer-2.5-fast`) に専用 worktree 内で委譲し、Lead が diff をレビューしてから main へ cherry-pick する skill。breezing の team フローを起こさず、1 タスク 1 cherry-pick を最短経路で回す。\n\n封じ込めは Cursor 側にはない ([references\u002Fcursor-cli-only.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fcursor-cli-only.md))。**専用 `.git` を持つ worktree + Lead diff review + cherry-pick (R01-R13 経路)** の 3 点だけが実効的な境界。cursor の出力は Lead レビューまで untrusted として扱う。\n\n## Step 0 — NARRATION RULES (UX Contract)\n\n敵は **冗長さ** であって進捗報告ではない。breezing と同じ契約。**起動時に banner + 実行計画を簡潔に明示してから実行する**。見やすい進捗報告は歓迎、冗長な繰り返しのみ禁止。\n\n### 起動時に必ず出すもの (banner + plan、合計 5 行以内)\n\n```\n? cursor \u002F composer-2.5-fast \u002F feat\u002Ffoo-bar \u002F Add login form validation\nこれから:\n1. pre-check (branch \u002F cursor-agent) → 専用 worktree 作成\n2. composer に実装委譲 (--write)\n3. diff レビュー → cherry-pick → Plans.md 更新\n```\n\nbanner 1 行 (`? cursor \u002F composer-2.5-fast \u002F \u003Cbranch> \u002F \u003Ctask>`) + 計画 2-4 行。1 秒以内に出し、即 Step 1 へ。\n\n### 進捗報告は出してよい (見やすい範囲で)\n\n- 各ステップの開始・完了を 1 行ステータスで (`✓ worktree 作成: .claude\u002Fworktrees\u002Fcursor-do-...`)\n- pre-check \u002F resolve の要点、cherry-pick した SHA\n- なぜこの分岐を取るかの理由を 1 行で\n\n### 禁止 (= 冗長さ)\n\n- **同じ事実の 2 回言い換え**: pre-check 結果を後段で再説明しない\n- **中身のない前置き**: tool call で自明な宣言だけの行\n- **3 行以上の経緯振り返り**: 必要なら 1 行に圧縮\n- **起動シーケンス中の ★ Insight ブロック**: Insight は最終 report で 1 回のみ\n\n違反例 (冗長):\n```\n× 「composer 2.5 で実装する流れですね、まず確認します」（中身のない前置き）\n× 「Cursor を呼ぶ前に branch を見ます」 → bash → 「branch を確認しました」（言い換え）\n× ★ Insight ──── Cursor の強みは…\n```\n\n正常例 (簡潔 + 計画明示):\n```\n? cursor \u002F composer-2.5-fast \u002F feat\u002Ffoo-bar \u002F Add login form validation\nこれから: worktree 作成 → composer に実装委譲 → diff レビュー → cherry-pick\n```\n\n## Step 1 — banner + plan を出し切る (1 秒以内)\n\n引数 `$ARGUMENTS` をタスク説明として受ける。空なら直前の明示依頼と選択済み Plans.md を読み、対象を回収する。\nそれでも対象を特定できない場合だけ、以下のマーカーを出力してユーザーに 1 行タスクを要求し、入力後に Step 2 へ進む:\n\n```\nCURSOR_DO_AWAITING_TASK: provide a one-line task description as $ARGUMENTS\n```\n\n引数があれば、即 1 行 echo:\n\n```\n? cursor \u002F composer-2.5-fast \u002F \u003Ccurrent-branch> \u002F \u003Ctask-first-60-chars>\n```\n\n`\u003Ccurrent-branch>` は Step 2 で取得する値だが、Step 1 では未取得のため `…` でも可。Step 2 直後に確定値を 1 行で再出力する。Step 0 の banner + 実行計画 (5 行以内) はここで出し切り、以降は各ステップの 1 行ステータスで進捗を見せる。冗長な繰り返しのみ避ける。\n\n## Step 2 — 並列 pre-check (1 bash)\n\n1 つの bash 呼び出しで以下を並列に取り、結果だけを 1 ブロックで受ける。個別の説明は出さない。\n\n```bash\nbash -c '\n  set +e\n  echo \"==BRANCH==\"; git branch --show-current\n  echo \"==VERSION==\"; cat VERSION 2>\u002Fdev\u002Fnull\n  echo \"==PLANS_TAIL==\"; tail -n 12 Plans.md 2>\u002Fdev\u002Fnull\n  echo \"==CURSOR_AGENT==\"\n  CURSOR_AGENT_BIN=\"${CURSOR_AGENT_BIN:-}\"\n  if [ -z \"$CURSOR_AGENT_BIN\" ]; then\n    # `agent`（公式の新表記）→ `cursor-agent`（legacy alias）の順に探す。\n    # `agent` は汎用的な名前なので、symlink 解決後の実パスの「成分」に\n    # cursor-agent が完全一致で現れる場合だけ採用する（部分文字列一致だと\n    # \u002Fx\u002Fcursor-agent-not-really\u002Fagent のようなディレクトリ名で突破される）。\n    for _c in agent cursor-agent; do\n      _p=\"$(command -v \"$_c\" 2>\u002Fdev\u002Fnull)\" || continue\n      [ -n \"$_p\" ] || continue\n      _r=\"$(realpath \"$_p\" 2>\u002Fdev\u002Fnull || readlink -f \"$_p\" 2>\u002Fdev\u002Fnull || echo \"$_p\")\"\n      case \"\u002F$_r\u002F\" in *\u002Fcursor-agent\u002F*) CURSOR_AGENT_BIN=\"$_p\"; break ;; esac\n    done\n    if [ -z \"$CURSOR_AGENT_BIN\" ] && [ -x \"$HOME\u002F.local\u002Fbin\u002Fcursor-agent\" ]; then\n      CURSOR_AGENT_BIN=\"$HOME\u002F.local\u002Fbin\u002Fcursor-agent\"\n    fi\n  fi\n  if [ -z \"$CURSOR_AGENT_BIN\" ]; then\n    echo \"NOT_INSTALLED\"\n  else\n    \"$CURSOR_AGENT_BIN\" --version 2>\u002Fdev\u002Fnull || echo \"NOT_INSTALLED\"\n  fi\n'\n```\n\n判定:\n- `CURSOR_AGENT=NOT_INSTALLED` → `ERROR: cursor-agent not found (exit 3 expected from companion). Install via setup-cursor.sh.` を出し終了。\n- `BRANCH` が `main` \u002F `master` → `WARN: on protected branch — cherry-pick target is HEAD of this branch. Confirm intent or switch.` を出し継続。\n\n## Step 3 — plugin root + backend + model resolve (1 bash)\n\n`HARNESS_PLUGIN_ROOT` \u002F `CLAUDE_PLUGIN_ROOT` が未設定だと `:-.` fallback が consumer repo の cwd に解決し、`scripts\u002Fcursor-companion.sh` が見えず起動不能になる (Issue #193 §2)。hooks.json と同じ `valid_root` パターンで堅牢に解決する。\n\n```bash\nbash -c '\n  set -euo pipefail\n  valid_root() {\n    [ -n \"${1:-}\" ] && [ -f \"$1\u002Fscripts\u002Fcursor-companion.sh\" ] && { [ -f \"$1\u002F.claude-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.codex-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.cursor-plugin\u002Fplugin.json\" ]; }\n  }\n  HARNESS_PLUGIN_ROOT=\"${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}\"\n  ROOT=\"$HARNESS_PLUGIN_ROOT\"\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    if [ -n \"${CLAUDE_SKILL_DIR:-}\" ]; then\n      probe=\"$(cd \"${CLAUDE_SKILL_DIR}\" && pwd)\"\n      while [ \"$probe\" != \"\u002F\" ] && ! valid_root \"$probe\"; do\n        probe=\"$(cd \"$probe\u002F..\" && pwd)\"\n      done\n      valid_root \"$probe\" && ROOT=\"$probe\"\n    fi\n  fi\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    for c in \"${CLAUDE_PROJECT_DIR:-}\" \"$PWD\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Fclaude-code-harness-marketplace\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fcache\u002Fclaude-code-harness-marketplace\u002Fclaude-code-harness\u002F\"*; do\n      if valid_root \"$c\"; then ROOT=\"$c\"; break; fi\n    done\n  fi\n  if ! valid_root \"$ROOT\"; then\n    echo \"ERROR: claude-code-harness plugin root not found (no scripts\u002Fcursor-companion.sh)\" >&2\n    exit 2\n  fi\n  HARNESS_PLUGIN_ROOT=\"$ROOT\"\n  BACKEND=$(bash \"${HARNESS_PLUGIN_ROOT}\u002Fscripts\u002Fresolve-impl-backend.sh\" --backend cursor --role worker)\n  MODEL=$(bash \"${HARNESS_PLUGIN_ROOT}\u002Fscripts\u002Fmodel-routing.sh\" --host cursor --role worker --field model)\n  echo \"PLUGIN_ROOT=${HARNESS_PLUGIN_ROOT}\"\n  echo \"BACKEND=$BACKEND\"\n  echo \"MODEL=$MODEL\"\n'\n```\n\n返却値: `PLUGIN_ROOT` (Step 5 で使う) \u002F `BACKEND` (必ず `cursor`) \u002F `MODEL` (通常 `composer-2.5-fast`)。`BACKEND` または `MODEL` が空なら `ERROR: backend\u002Fmodel resolution failed` を 1 行で出して終了。`PLUGIN_ROOT` 解決失敗は上記スクリプトが exit 2 で報告する。\n\n## Step 4 — 専用 worktree 作成\n\n衝突しない id を作って worktree を切る。**main tree や `$HOME` を指してはならない** (companion 側 guard で exit 2 になる)。`WT_DIR` は絶対パスで作る (Step 5 の `--workspace` は companion の `is not a directory` ガードで相対パスを exit 2 にすることがあるため、Issue #193 §4)。\n\n```bash\nbash -c '\n  set -euo pipefail\n  REPO_ROOT=\"$(git rev-parse --show-toplevel)\"\n  cd \"$REPO_ROOT\"\n  ID=\"$(date +%Y%m%d-%H%M%S)-$$\"\n  WT_DIR=\"$REPO_ROOT\u002F.claude\u002Fworktrees\u002Fcursor-do-${ID}\"\n  BASE_REF=\"$(git rev-parse HEAD)\"\n  BASE_BRANCH=\"$(git branch --show-current)\"\n  WT_BRANCH=\"cursor-do\u002F${ID}\"\n  mkdir -p \"$REPO_ROOT\u002F.claude\u002Fworktrees\"\n  git worktree add -b \"${WT_BRANCH}\" \"${WT_DIR}\" \"${BASE_REF}\"\n  echo \"REPO_ROOT=${REPO_ROOT}\"\n  echo \"WT_DIR=${WT_DIR}\"\n  echo \"WT_BRANCH=${WT_BRANCH}\"\n  echo \"BASE_REF=${BASE_REF}\"\n  echo \"BASE_BRANCH=${BASE_BRANCH}\"\n'\n```\n\n返却された `WT_DIR` \u002F `WT_BRANCH` \u002F `BASE_REF` \u002F `BASE_BRANCH` を以降の Step で使う。失敗時 (branch 名衝突等) は `ID` を作り直して 1 回だけ retry。2 回連続失敗で `ERROR: worktree creation failed` を出し終了。\n\n## Step 5 — cursor-companion.sh task --write で委譲\n\nLead が直接 companion を呼ぶ ([references\u002Fcursor-cli-only.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fcursor-cli-only.md) Topology 節 — 非 claude backend では Worker 介在なし)。プロンプトは引数の task そのまま + 必要な追補のみ。冗長な前置きは付けない。\n\n```bash\nbash -c '\n  set -euo pipefail\n  valid_root() {\n    [ -n \"${1:-}\" ] && [ -f \"$1\u002Fscripts\u002Fcursor-companion.sh\" ] && { [ -f \"$1\u002F.claude-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.codex-plugin\u002Fplugin.json\" ] || [ -f \"$1\u002F.cursor-plugin\u002Fplugin.json\" ]; }\n  }\n  HARNESS_PLUGIN_ROOT=\"${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}\"\n  ROOT=\"${PLUGIN_ROOT:-$HARNESS_PLUGIN_ROOT}\"\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    if [ -n \"${CLAUDE_SKILL_DIR:-}\" ]; then\n      probe=\"$(cd \"${CLAUDE_SKILL_DIR}\" && pwd)\"\n      while [ \"$probe\" != \"\u002F\" ] && ! valid_root \"$probe\"; do\n        probe=\"$(cd \"$probe\u002F..\" && pwd)\"\n      done\n      valid_root \"$probe\" && ROOT=\"$probe\"\n    fi\n  fi\n  if ! valid_root \"$ROOT\"; then\n    ROOT=\"\"\n    for c in \"${CLAUDE_PROJECT_DIR:-}\" \"$PWD\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Fclaude-code-harness-marketplace\" \\\n             \"$HOME\u002F.claude\u002Fplugins\u002Fcache\u002Fclaude-code-harness-marketplace\u002Fclaude-code-harness\u002F\"*; do\n      if valid_root \"$c\"; then ROOT=\"$c\"; break; fi\n    done\n  fi\n  if ! valid_root \"$ROOT\"; then\n    echo \"ERROR: claude-code-harness plugin root not found (no scripts\u002Fcursor-companion.sh)\" >&2\n    exit 2\n  fi\n  HARNESS_PLUGIN_ROOT=\"$ROOT\"\n  PROMPT=\"\u003Ctask-description>\nPurpose and why: \u003Cexpected outcome and user need>\nOwned paths and non-goals: \u003Cassigned files\u002Fmodules and excluded work>\nDefinition of done: \u003Cobservable conditions and required checks>\nContract and authorization references: \u003Cselected plan\u002Fspec paths and original user instruction or applicable approval record>\nAvailable evidence: \u003Cobserved state, prior attempts, findings and artifact paths>\n\nConstraints:\n- Choose the implementation method within the assigned scope. Other workers may be active; preserve their edits.\n- Recover missing context from the supplied contracts and read-only inspection first. State minor assumptions; stop only the action that needs a material decision or missing authorization.\n- Complete authorized reversible work without asking again. Inferred scope is not authorization for protected operations.\n- Preserve required TDD and validation. After required checks pass, add checks only for new changes, failures, or unresolved concerns.\n- Match existing code style and naming.\n- Create exactly one git commit if your environment supports it; otherwise leave one dirty changeset for Lead auto-commit.\n- Do not touch .claude-plugin\u002Fsettings*, .claude\u002Fsettings*, .eslintrc*, biome.json, tsconfig*.json.\n- Return the result, decision reasons, changed paths, check commands\u002Fresults and remaining limitations. A success claim alone is not evidence.\"\n  bash \"${HARNESS_PLUGIN_ROOT}\u002Fscripts\u002Fcursor-companion.sh\" task \\\n    --write \\\n    --workspace \"${WT_DIR}\" \\\n    \"${PROMPT}\"\n' 2>&1\n```\n\n判定:\n- exit 0 + result text → Step 6 へ\n- exit 1 (result-error) → companion stderr を 1 行要約して `ERROR: cursor returned is_error\u002Fempty result` を出し終了。worktree は Step 8 のクリーンアップで削除\n- exit 2 (bad-guard) → 設定不備。原因 (workspace 指定誤り等) を 1 行で示し終了\n- exit 3 (not-found) → Step 2 で検出済みのはずだが、再度遭遇したら同様に終了\n\n## Step 6 — Lead diff review\n\nworktree 内で Composer が作成した変更を読み、目視レビュー + contract grep の二段ゲートを通す (`harness-work` 「Lead の cherry-pick 前ゲート」と同じ契約)。\n\n**注意 (Issue #193 §1)**: Cursor Composer は `--write` でファイル編集を行うが **commit は作らない**ことがある。worktree が dirty なまま放置すると Step 7 の cherry-pick 対象から漏れ、ユーザー視点で「完了したのに main に何も入らない」状態になる。本 Step 冒頭で dirty なら、既存 commit がある場合は amend、commit がない場合は Lead 側で 1 commit にまとめる。\n\n```bash\nbash -c '\n  set -euo pipefail\n  cd \"${WT_DIR}\"\n  # Composer は dirty changeset を返すことがあるため、既存 commit に fold する\n  if [ -n \"$(git status --porcelain)\" ]; then\n    git add -A\n    if [ \"$(git rev-list --count \"${BASE_REF}..HEAD\")\" -gt 0 ]; then\n      git -c user.name=\"cursor-composer\" -c user.email=\"cursor-composer@local\" \\\n        commit --amend --no-edit --no-verify\n      echo \"==AUTO_AMENDED==\"\n    else\n      git -c user.name=\"cursor-composer\" -c user.email=\"cursor-composer@local\" \\\n        commit --no-verify -m \"cursor: ${TASK_SUMMARY:-cursor-do delegated change}\"\n      echo \"==AUTO_COMMITTED==\"\n    fi\n    git log -1 --oneline\n  fi\n  echo \"==LOG==\"\n  git log --oneline \"${BASE_REF}..HEAD\"\n  echo \"==STAT==\"\n  git diff --stat \"${BASE_REF}..HEAD\"\n  echo \"==DIFF==\"\n  git diff \"${BASE_REF}..HEAD\"\n'\n```\n\n`TASK_SUMMARY` は引数 task の先頭 60 文字以内に圧縮した文字列を Lead が事前に export しておく (例: `TASK_SUMMARY=\"Add login form validation\"`)。未設定なら fallback メッセージ `cursor-do delegated change` を使う。`--no-verify` を付けるのは worktree 内の編集を「Lead レビュー前の中間 commit」として扱うため (cherry-pick 後の main commit で R01-R13 と pre-commit hook を通す)。\n\nLead は diff 全文を Read し、以下を確認する:\n\n- 変更が依頼タスクの範囲内か (関係ないファイルを触っていないか)\n- protected path (`.claude-plugin\u002Fsettings*`, `.eslintrc*`, etc.) を変更していないか\n- secret \u002F `.env` \u002F 認証情報を含まないか\n- 公開 support tier 表記を破壊していないか。contract gates は必ず candidate worktree (`WT_DIR`) 内で実行する:\n  ```bash\n  [ ! -f \"${WT_DIR}\u002Ftests\u002Ftest-support-claim-wording.sh\" ] || (cd \"${WT_DIR}\" && bash tests\u002Ftest-support-claim-wording.sh)\n  [ ! -f \"${WT_DIR}\u002Fscripts\u002Fci\u002Fcheck-consistency.sh\" ] || (cd \"${WT_DIR}\" && bash scripts\u002Fci\u002Fcheck-consistency.sh)\n  [ ! -f \"${WT_DIR}\u002Ftests\u002Fvalidate-plugin.sh\" ] || (cd \"${WT_DIR}\" && bash tests\u002Fvalidate-plugin.sh)\n  ```\n\n判定:\n- 問題なし → Step 7 へ\n- 範囲外変更あり → 該当 commit を `git reset` で巻き戻すか、Cursor に再委譲 (Step 5 を 1 回だけ retry)。2 回失敗で `REQUEST_CHANGES: \u003C理由>` を出し、worktree を残したまま終了\n- protected path \u002F secret 検出 → 即 abort。`ABORT: protected path violation` を出し worktree 削除\n\n## Step 7 — cherry-pick + Plans.md cc:done 更新\n\nworktree から main tree に cherry-pick する。Cursor prompt は exactly one commit 契約だが、Composer は dirty changeset を返すことがあるため Step 6 で commit\u002Famend する。複数 commit が残った場合は main tree を触る前に停止する。\nさらに cherry-pick 前に `Plans.md` の staged \u002F unstaged 差分がないことを確認する。理由: 既存差分がある状態で後続の `git add Plans.md && git commit --amend` を行うと、task と無関係な plan\u002Fstatus 編集を Cursor の code commit に巻き込むため。\n**SHA 直接指定** (branch 名経由ではない) で reviewer state drift を避ける (MEMORY: reviewer_state_drift)。\n\n```bash\nbash -c '\n  set -euo pipefail\n  COMMIT_COUNT=\"$(cd \"${WT_DIR}\" && git rev-list --count \"${BASE_REF}..HEAD\")\"\n  if [ \"${COMMIT_COUNT}\" -eq 0 ]; then\n    echo \"ERROR: no commits to cherry-pick\"\n    exit 1\n  fi\n  if [ \"${COMMIT_COUNT}\" -ne 1 ]; then\n    echo \"ERROR: cursor returned ${COMMIT_COUNT} commits; expected exactly one. Keep worktree for manual review: ${WT_DIR}\"\n    exit 1\n  fi\n  if ! git diff --quiet -- Plans.md || ! git diff --cached --quiet -- Plans.md; then\n    echo \"ERROR: Plans.md has pre-existing local edits; refusing to cherry-pick before the cursor:do marker amend\"\n    exit 1\n  fi\n  SHA=\"$(cd \"${WT_DIR}\" && git rev-parse HEAD)\"\n  git cherry-pick \"${SHA}\"\n  echo \"==CHERRY_PICKED==\"\n  git log --oneline -n 1\n'\n```\n\ncherry-pick で conflict が出たら `git cherry-pick --abort` し、`CHERRY_PICK_CONFLICT: \u003Cfiles>` を 1 行で示して終了 (worktree は残す、ユーザー判断)。\n\ncherry-pick 後、Plans.md に対応行があれば該当タスクのマーカーを更新する。\n上記の clean precondition を通過しているため、ここで発生する Plans.md 差分は marker-only diff として扱う:\n\n```\n| \u003Ctask> | ... | cc:done [\u003Cmerged-sha>] |\n```\n\n該当行の特定: 引数 task 文字列の先頭 40 文字で grep し、ヒットした最初の `cc:TODO` \u002F `cc:WIP` \u002F `cc:todo` 行を `cc:done [\u003Csha>]` に置換する。ヒットなしなら更新スキップ (Plans.md 外のタスクとして扱う)。\n\nマーカーを更新した場合、その編集は cherry-pick commit に含める。未コミットの `Plans.md` を残して cleanup \u002F 完了報告へ進んではならない。\n以下の amend block は、上記 precondition 通過後に実行した marker-only diff だけを対象にする:\n\n```bash\nbash -c '\n  set -euo pipefail\n  if git diff --quiet -- Plans.md; then\n    echo \"PLANS_UPDATED=0\"\n  else\n    git add Plans.md\n    git commit --amend --no-edit\n    echo \"PLANS_UPDATED=1\"\n    echo \"MERGED_SHA=$(git rev-parse HEAD)\"\n  fi\n'\n```\n\n## Step 8 — worktree cleanup + 完了報告 (1 ブロック)\n\ncherry-pick 成功後、worktree を delete する。失敗 path では呼ばれない（worktree を残してユーザー判断）。\n\n```bash\nbash -c '\n  set -euo pipefail\n  git worktree remove --force \"${WT_DIR}\"\n  git branch -D \"${WT_BRANCH}\" 2>\u002Fdev\u002Fnull || true\n  echo \"==CLEANUP==\"\n  git worktree list | grep -v \"cursor-do-\" || true\n'\n```\n\n完了報告は **1 ブロック** で出す。中間ナレーションなし:\n\n```\ncursor:do completed\n   task: \u003Ctask-first-60-chars>\n   commits: \u003Ccount>\n   base: \u003CBASE_REF> → cherry-picked into \u003CBASE_BRANCH>\n   plans: \u003Cupdated|skipped (no match)>\n   files: \u003Cchanged-file-count> changed, +\u003Cinserts> -\u003Cdeletes>\n   checks: \u003Ccommands, results and evidence paths>\n   unverified: \u003Cremaining limitations or none observed within the checked scope>\n```\n\n## Full Containment (write mode 必須)\n\n| 層 | 役割 | skip 可否 |\n|---|---|---|\n| 専用 `.git` worktree | cursor の書込を main tree から隔離 | 不可（必須） |\n| Lead diff review | untrusted cursor 出力の品質ゲート | 不可（必須） |\n| contract-grep ゲート | docs \u002F locale \u002F matrix 固定文字列の保護 | 不可（必須） |\n| cherry-pick → main | R01-R13 guard rail を通す唯一の経路 | 不可（必須） |\n| Plans.md cc:done 更新 | 台帳との sync | 該当行なければ skip 可 |\n\n## Prohibited\n\n- `--force` \u002F `--yolo` を companion に渡す（Cursor 公式 \"Never use\"）\n- cursor 出力を Lead レビュー前に main へ直接 commit する\n- protected path (`.claude-plugin\u002Fsettings*`, `.eslintrc*`, `tsconfig*.json`, etc.) を Step 5 の prompt で許可する\n- `$HOME` \u002F `\u002F` \u002F main tree を `--workspace` に指定する\n- Plans.md の `cc:*` マーカーを task と無関係に書き換える\n\n## Related Skills \u002F Rules\n\n- `cursor:ask` — 読取専用の質問・調査・敵対的視点 (worktree 不要)\n- `breezing --cursor` — 複数タスクを team フローで cursor 委譲する場合\n- `harness-work` — claude backend の default フロー (Worker agent 経由)\n- `references\u002Fcursor-cli-only.md` — Cursor backend governance + Topology (旧 `.claude\u002Frules\u002Fcursor-cli-only.md` の全文がここに移設済み)\n",{"name":5,"description":7,"allowed-tools":55,"argument-hint":61,"description-en":7,"description-ja":62,"user-invocable":63},[56,57,58,41,59,60],"Read","Write","Edit","Glob","Grep","[task-description]","1 件の write タスクを Cursor Composer に委譲するスキル。専用 worktree (.claude\u002Fworktrees\u002Fcursor-do-\u003Cid>) を切って `cursor-companion.sh task --write --workspace \u003Cwt>` を直接呼び、Lead が diff レビュー → main へ cherry-pick → Plans.md `cc:done [hash]` 更新まで一気通貫する。Use when user mentions cursor:do, cursor で実装して, composer に書かせて, カーソルにやらせて, refactor を Cursor に, ファイル編集を Composer に. Do NOT load for: 計画 (harness-plan), レビューのみ (harness-review), 読み取り調査 (cursor:ask), 複数タスク並列 (breezing --cursor を使う).",true,"c2304c325d4432f51d632e0586d886767b0f41ea","codex\u002F.codex\u002Fskills\u002Fcursor-do",306,"https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness","https:\u002F\u002Fgithub.com\u002FChachamaru127","https:\u002F\u002Fcanai.jp\u002F","Going all-in on the AI business from April 2025\r\nOSS release: 3k Stars\r\nAI adoption starting with \"I want\"\r\nAX Support | Tokenomics | AISDR |","2026-11-11 17:18:34",{"source":8,"skillName":5,"commands":73,"prompt":83,"zipAvailable":63},[74,77,80],{"tool":75,"command":76},"npx","npx skills add Chachamaru127\u002Fclaude-code-harness --skill cursor-do",{"tool":78,"command":79},"bunx","bunx skills add Chachamaru127\u002Fclaude-code-harness --skill cursor-do",{"tool":81,"command":82},"pnpm","pnpm dlx skills add Chachamaru127\u002Fclaude-code-harness --skill cursor-do","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Fcodex\u002F.codex\u002Fskills\u002Fcursor-do\u002FSKILL.md",[85],{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fcursor-cli-only.md","REFERENCE","参考文档",12958,"https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Fcodex\u002F.codex\u002Fskills\u002Fcursor-do\u002Freferences\u002Fcursor-cli-only.md",[92,108,116,133,161,186],{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":100,"publishedAt":50},"01M6C4VZCJB9EN3KZXGNARAF6P","escape-skill","https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fzz-review-escape\u002FSKILL.md",[97],{"categoryNo":98,"categoryName":99,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[101,102,103,104,105,106,107],"escape skill","escape","Tools","false","true","path","quoted",{"skillNo":109,"name":110,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":50},"01M6C4VYAJW332S5R2MM3RNE0G","zz-review-empty","https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fzz-review-empty\u002FSKILL.md",[],[49,114,115,104,105],"zz review empty","empty",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":50},"01M6C4VWW4GNAZ2680GY04S3EW","session-send","This skill should be used when the user asks to notify other session, requests a session handoff, says tell other agent, or needs a cross-session message.","https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Fskills\u002Fsession-send\u002FSKILL.md",[122],{"categoryNo":98,"categoryName":99,"taxonomyType":21,"taxonomyTypeDesc":22},[124,125,126,127,128,41,129,130,131,132,28],"session","session send","send","handoff","session handoff","user","message","notify","requests",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":140,"publishedAt":50},"01M6C4VSMYH6XQGR087HQ9Y7HT","memory","Manage SSOT, memory, and cross-tool memory search. Guardian of decisions.md and patterns.md. Use when user mentions memory, SSOT, decisions.md, patterns.md, merging, migration, SSOT promotion, sync memory, save learnings, memory search, harness-mem, past decisions, or record this. Do NOT load for: implementation work, reviews, ad-hoc notes, or in-session logging.","https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Fskills\u002Fmemory\u002FSKILL.md",[139],{"categoryNo":98,"categoryName":99,"taxonomyType":21,"taxonomyTypeDesc":22},[135,141,142,143,46,144,145,146,41,147,148,149,150,151,152,153,129,124,36,154,155,24,156,157,158,105,159,160,28],"MCP","sync","notes","search","memory search","guardian","migrate","tool","work","decisions","read","write","edit","migration","manage","learnings","promotion","reviews","load","for",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":50},"01M6C4VQ3507BV9XRX4BDSES6J","maintenance","File cleanup and archiving. Tidies up bloated Plans.md, session-log.md, old logs, and state files. Trigger: \u002Fmaintenance, cleanup, archive, organize, split session-log. Do NOT load for: implementation, review, release, new feature development.","https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Fskills\u002Fmaintenance\u002FSKILL.md",[],[163,49,168,169,170,171,172,44,173,41,174,175,151,152,153,176,124,177,178,179,24,180,181,182,183,184,105,159,160,185],"development","cleanup","run","release","state","logs","archive","grep","new feature","up","log","files","feature","plans","trigger","整理","split","new",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":202,"publishedAt":50},"01M6C4VK473YJ872RNMBYK7P4R","japanese-writing-drafter","Detect when the operator corrects the agent's Japanese phrasing mid-conversation (rewrites a sentence, calls out a style problem, says 'this wording is bad, say it like X instead') and draft a pending writing-rule proposal into ~\u002F.claude\u002Fwriting-lint\u002Fproposals.jsonl for later human review. This skill is the ONLY writer of proposals.jsonl — it never edits rules.jsonl and never sets status to anything but pending. Promotion to rules.jsonl only happens via the human-run scripts\u002Fwriting-rule-approve.sh. Use when user mentions writing-rule proposal, 表現を直して, 文体を直して, その言い方はNG, writing lint 提案, 指摘をルール化して. Do NOT load for: approving or rejecting proposals (use scripts\u002Fwriting-rule-approve.sh), listing pending proposals (use scripts\u002Fwriting-rule-list.sh), or scanning text against the existing dictionary (the writinglint engine \u002F PostToolUse hook does that).","https:\u002F\u002Fgithub.com\u002FChachamaru127\u002Fclaude-code-harness\u002Fblob\u002Fmain\u002Fskills\u002Fjapanese-writing-drafter\u002FSKILL.md",[192,193,196,197],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":194,"categoryName":195,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":98,"categoryName":99,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":198,"categoryName":199,"taxonomyType":200,"taxonomyTypeDesc":201},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[203,204,205,49,206,170,207,208,41,209,210,211,212,151,213,214,36,215,34,216,217,218,219,220,221,222,223,224,225,226,28,227],"writing","japanese writing drafter","japanese","status","lint","operator","提案","text","engine","Rules","list","proposals","never","scanning","say","human review","later","conversation","writer","human","scripts","problem","proposal","jsonl","listing"]