Skip to content

fix(worktree): WorktreeCreate hook must print only the worktree path - #168

Closed
aryrabelo wants to merge 4 commits into
Chachamaru127:mainfrom
aryrabelo:fix/worktree-create-contract
Closed

aryrabelo wants to merge 4 commits into
Chachamaru127:mainfrom
aryrabelo:fix/worktree-create-contract

Conversation

@aryrabelo

@aryrabelo aryrabelo commented May 27, 2026 •

Copy link
Copy Markdown
Contributor

Supersedes #165 (auto-closed when its head branch was force-updated; this PR carries the same work plus the review refinements below).

Problem

The WorktreeCreate hook emitted a decision JSON ({"decision":"approve","reason":...}) on stdout. The Claude Code runtime treats this hook as a replacement for default git worktree behavior: it expects the hook to ensure the worktree directory exists and print only that path on stdout. The runtime read the JSON as a path, found it was not a directory ("returned a path that is not a directory"), and aborted worktree creation — breaking agent-isolation / breezing worker spawns.

Fix

Rewrite the Go handler (go/internal/hookhandler/worktree_create.go) and the shell fallback (scripts/hook-handlers/worktree-create.sh) so both:

  • Resolve the target worktree path (explicit tool_input.path / worktreePath, else a deterministic .harness-worktrees/<session-slug> under the repo root).
  • Reuse an existing valid git worktree; create one otherwise (origin default branch, HEAD fallback).
  • Initialize .claude/state/.
  • Print only the directory path on stdout. Diagnostics for skipped/failed cases go to stderr (never stdout, which is reserved for the path).

The logic is defensive about non-determinism: it never assumes the worktree exists or not, never clobbers a non-empty pre-existing directory, and on any failure emits nothing on stdout (a safe abort). A looksLikeHookDecisionJSON guard hardens both implementations against the legacy decision-JSON-as-cwd bug.

Tests

  • go test ./internal/hookhandler/ -run Worktree — 17 pass, including 8 direct unit tests for the helpers (originDefaultRef, dirIsEmpty, absOrSelf, worktreeBranchName, gitWorktreeAdd, normalizeWorktreeCreateCWD, worktreeStateDir, isGitWorktree).
  • tests/test-worktree-create-hook.sh — pass (shell parity).
  • go vet — clean.

Source-only change. Committed binaries are release-managed artifacts and are intentionally left untouched.

Summary by CodeRabbit

  • バグ修正

    • WorktreeCreate フックの出力を修正:JSON ではなく、作成/再利用した worktree のディレクトリパスのみを stdout に出力するようにしました。
  • 改善

    • 無効入力や不正JSONを検出した際は出力を抑制し、安全に中断してログを記録するよう強化しました。
    • 既存の worktree 判定と再利用ロジックを改善し、作成時に状態ディレクトリとメタデータ(worker ID・作成時刻・CWD)を残すようにしました。
    • tool_input による指定パスを優先する挙動を追加しました。
  • テスト

    • フック挙動に合わせた回帰テストを追加・刷新し、各種入力ケース(不正入力、正常作成、再利用、tool_input 優先など)を検証するテストを整備しました。

Review Change Stack

…ract

The WorktreeCreate hook emitted a decision JSON on stdout, but the Claude
Code runtime expects this hook to "replace default git behavior" — it must
ensure the worktree directory exists and print ONLY that path on stdout.
The runtime read the JSON as a path, saw it was not a directory, and aborted
worktree creation ("returned a path that is not a directory"), forcing
agent-isolation / breezing worker spawns to fail.

Rewrite the Go handler and shell fallback to resolve the target path, reuse
an existing valid worktree or create one (origin default branch, HEAD
fallback), initialize .claude/state/, and print the path. The logic is
defensive about non-determinism: it never assumes the worktree does or does
not already exist, and never clobbers a non-empty pre-existing directory.

Update Go and shell regression tests to assert the path contract and
idempotent reuse. Rebuild all four platform binaries (v4.12.3).
@coderabbitai

coderabbitai Bot commented May 27, 2026 •

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 834954fb-29d6-4983-b190-1e5bd76308ad

📥 Commits

Reviewing files that changed from the base of the PR and between a3c1749 and f05da1c.

📒 Files selected for processing (3)
  • go/internal/hookhandler/worktree_create.go
  • go/internal/hookhandler/worktree_create_test.go
  • scripts/hook-handlers/worktree-create.sh
🚧 Files skipped from review as they are similar to previous changes (3)
  • scripts/hook-handlers/worktree-create.sh
  • go/internal/hookhandler/worktree_create.go
  • go/internal/hookhandler/worktree_create_test.go

Walkthrough

WorktreeCreateフックを「approve decision JSON」出力から「作成または再利用した worktree ディレクトリパスのみ」出力へ統一。無入力/不正JSON/decision JSON を cwd として扱わないガード、既存 worktree の再利用、git worktree 作成の origin フォールバック、及び .claude/state/worktree-info.json のベストエフォート記録を Go・Shell・テストで実装・検証した。

Changes

WorktreeCreate フック契約の統一化

Layer / File(s) Summary
Go実装:新しい契約とヘルパー関数群
go/internal/hookhandler/worktree_create.go
HandleWorktreeCreate が stdin を検査し(無入力/不正JSON/不正 cwd は非出力で終了)、resolveWorktreePath で tool_input や session_id 由来の TARGET を決定。ensureWorktree / gitWorktreeAdd / originDefaultRef / isGitWorktree による状態ベースの再利用・作成ロジックと、initWorktreeState による .claude/state/worktree-info.json のベストエフォート書き込みを実装。最終的に作成または再利用したパスのみを stdout に出力する。
Go単体テスト
go/internal/hookhandler/worktree_create_test.go
Handler の入出力契約(空入力・不正JSON・空CWD・decision JSON as CWD は stdout 空)、正常系で worktree 作成・stdout がパスのみ・.claude/state の作成と内容検証を行うテストへ置換。補助関数(sanitize/normalize/branch/slug/dirIsEmpty/absOrSelf/originDefaultRef/gitWorktreeAdd/isGitWorktree)の単体テストと、throwaway git リポジトリを作る initTestRepo ヘルパを追加。
Shell実装
scripts/hook-handlers/worktree-create.sh
payload が空なら即終了し出力しない。looks_like_hook_decision_json で decision JSON の混入を検出して拒否。tool_input.worktreePath(または path/worktree_path)を優先して TARGET を決定し、未作成なら git worktree add(-b を優先、失敗時は再試行)で作成、既存ディレクトリが空でなければ破壊せず利用。作成後に TARGET/.claude/state/worktree-info.json をベストエフォートで書き込み、最後に TARGET のみを stdout に出力する(従来の approve JSON 出力は削除)。
Shell統合テスト
tests/test-worktree-create-hook.sh
decision JSON を cwd に渡した不正ケース・空 cwd の拒否、正常系で stdout が改行を除いた「パスのみ」でありそのパスが git worktree で .claude/state/worktree-info.json を持つこと、同一 session の 2 回目呼び出しで再利用して同一パスを返す冪等性を検証する回帰テストに改修。

Sequence Diagram

sequenceDiagram
  participant Client as stdin (worktreeInput)
  participant Handler as HandleWorktreeCreate / worktree-create.sh
  participant Resolver as resolveWorktreePath / jq/python3
  participant Git as git (rev-parse, worktree add)
  participant FS as filesystem
  participant stdout as stdout

  Client->>Handler: payload (session_id, cwd, tool_input)
  Handler->>Resolver: extract/normalize cwd, tool_input
  Resolver-->>Handler: selected TARGET
  Handler->>Git: is_git_worktree? (git rev-parse)
  alt already worktree
    Git-->>Handler: reuse TARGET
  else need create
    Handler->>Git: git worktree add (-b preferred / fallback)
    Git-->>Handler: result
  end
  Handler->>FS: mkdir .claude/state && write worktree-info.json (best-effort)
  Handler->>stdout: print TARGET
Loading

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Chachamaru127/claude-code-harness#122: worktree_create.go と関連ロジックの以前の改修で、CWD 正規化・decision JSON 判定・.claude/state 関連の共通点があります。

Poem

🐰 worktree パスだけを出す契約に
Go と Shell が手を組んで
不正な JSON は はねのけ
既存を再利用し、並行も守る
stdout は清潔、決定JSONなし!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 47.73% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR タイトルは、主な変更内容を正確に反映しており、WorktreeCreate フックが stdout に worktree パスのみを出力すべきという核となる要件を明確に示しています。
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain modules listed in go.work or their selected dependencies"


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a3c1749341

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

if _, err := os.Stat(path); err != nil {
return false
}
cmd := exec.Command("git", "rev-parse", "--is-inside-work-tree")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Require the target to be the worktree root

This check treats any existing directory inside the main checkout as a reusable worktree, because Git documents --is-inside-work-tree as true when the cwd is “inside the work tree” (not necessarily at its root). If the default target .harness-worktrees/<session> was left behind by a partial run, or tool_input.path names an existing repo subdirectory, ensureWorktree skips git worktree add and prints a path that is still part of the main checkout; the shell fallback has the same predicate. Compare rev-parse --show-toplevel to the target (or otherwise verify the target is the actual worktree root) before reusing it.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f05da1c. isGitWorktree now uses git rev-parse --show-toplevel and requires it to equal the target (symlink-resolved via pwd -P), so a repo subdirectory or a leftover .harness-worktrees/ dir is no longer treated as a reusable worktree — it only matches an actual worktree root. Mirrored in the shell fallback (is_git_worktree). Regression test: TestIsGitWorktree_RepoSubdirNotWorktreeRoot.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
scripts/hook-handlers/worktree-create.sh (2)

157-160: 💤 Low value

printf フォールバックのJSON エスケープが不完全

${SESSION_ID//\"/\\\"} はダブルクォートのみをエスケープしますが、バックスラッシュ、改行、タブなどの制御文字はエスケープされません。SESSION_ID や TARGET にこれらが含まれると不正なJSONが生成されます。

通常のユースケースでは問題になりませんが、堅牢性を高めるには Python フォールバックの使用や、より完全なエスケープ処理を検討してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/hook-handlers/worktree-create.sh` around lines 157 - 160, The printf
fallback that writes JSON to WORKTREE_INFO_FILE escapes only double quotes via
"${SESSION_ID//\"/\\\"}" and "${TARGET//\"/\\\"}", which fails for backslashes
and control characters; update the fallback to produce valid JSON by using a
Python (or other JSON library) one-liner to safely serialize the object
(including SESSION_ID, TARGET, CREATED_AT) or implement proper escaping for
backslashes and control characters before writing; target the printf block that
currently generates the JSON and replace it with the robust serializer so
WORKTREE_INFO_FILE always contains valid JSON.

54-61: 💤 Low value

タブ文字を含むパスで解析が壊れる可能性

@tsv と IFS=$'\t' read を使用していますが、cwd や TOOL_WORKTREE_PATH にタブ文字が含まれている場合、フィールド境界が誤認識されます。実際にはパスにタブが含まれることは稀ですが、NUL区切り(@sh + eval または別のアプローチ)の方が堅牢です。

現状のユースケースではタブ入りパスは想定外と思われるため、必須ではありませんが、将来の堅牢性のために検討してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/hook-handlers/worktree-create.sh` around lines 54 - 61, 現在の
_parsed="$(printf '%s' "${INPUT}" | jq -r '… | `@tsv`')" と IFS=$'\t' read -r
SESSION_ID CWD TOOL_WORKTREE_PATH でタブを区切りにしているため、cwd や TOOL_WORKTREE_PATH
にタブが含まれると壊れます。修正するには jq 側でフィールドを NUL 文字で連結(例えば '[(...)] | join("\u0000")'
など)して出力し、シェル側では read の -d '' オプションや -a 配列読み込みで NUL 区切りを扱うように変更して、INPUT → _parsed
→ read による SESSION_ID / CWD / TOOL_WORKTREE_PATH の復元を NUL 区切りで安全に行ってください。
tests/test-worktree-create-hook.sh (1)

77-83: ⚡ Quick win

tool_input.worktreePath のテストケース追加を検討

フック実装では tool_input.worktreePath が指定された場合にそのパスを優先的に使用するロジックがありますが、このテストファイルではそのケースがカバーされていません。

契約の重要な部分であるため、以下のようなテストケースの追加を推奨します:

# === 5. tool_input.worktreePath overrides default path ===
CUSTOM_PATH="${TMP_DIR}/custom-worktree"
CUSTOM_OUT="${TMP_DIR}/custom.out"
run_hook "{\"session_id\":\"worker-custom\",\"cwd\":$(json_str "${REPO}"),\"tool_input\":{\"worktreePath\":$(json_str "${CUSTOM_PATH}")}}" "${CUSTOM_OUT}" "${REPO}"
CUSTOM_PRINTED="$(tr -d '\n' < "${CUSTOM_OUT}")"
[ "${CUSTOM_PRINTED}" = "${CUSTOM_PATH}" ] || fail "tool_input.worktreePath not honored: ${CUSTOM_PRINTED}"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test-worktree-create-hook.sh` around lines 77 - 83, Add a test that
verifies the hook honors tool_input.worktreePath by invoking run_hook with a
JSON payload containing "tool_input":{"worktreePath":<custom path>} (use
variables like CUSTOM_PATH and CUSTOM_OUT), capture output into CUSTOM_PRINTED,
and assert CUSTOM_PRINTED equals CUSTOM_PATH; if not, call fail with a clear
message like "tool_input.worktreePath not honored: ${CUSTOM_PRINTED}". Ensure
the test is placed after the idempotency check and uses the same run_hook and tr
-d '\n' pattern as the other cases to remain consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@go/internal/hookhandler/worktree_create.go`:
- Around line 162-170: The retry invocation builds the wrong git command: after
failing with "git worktree add -b <branch> <path>" the current retry uses
exec.Command("git", "worktree", "add", path) which will attempt to checkout a
branch named after the path instead of the intended branch; change the retry to
include the existing branch name (e.g., exec.Command("git", "worktree", "add",
path, branch) or exec.Command("git", "worktree", "add", path, branchName") using
the same branch variable used for the initial command) so the retry explicitly
checks out the intended branch into the worktree while keeping the same
CombinedOutput/error handling on retry and using the repoCWD Dir.

---

Nitpick comments:
In `@scripts/hook-handlers/worktree-create.sh`:
- Around line 157-160: The printf fallback that writes JSON to
WORKTREE_INFO_FILE escapes only double quotes via "${SESSION_ID//\"/\\\"}" and
"${TARGET//\"/\\\"}", which fails for backslashes and control characters; update
the fallback to produce valid JSON by using a Python (or other JSON library)
one-liner to safely serialize the object (including SESSION_ID, TARGET,
CREATED_AT) or implement proper escaping for backslashes and control characters
before writing; target the printf block that currently generates the JSON and
replace it with the robust serializer so WORKTREE_INFO_FILE always contains
valid JSON.
- Around line 54-61: 現在の _parsed="$(printf '%s' "${INPUT}" | jq -r '… | `@tsv`')"
と IFS=$'\t' read -r SESSION_ID CWD TOOL_WORKTREE_PATH でタブを区切りにしているため、cwd や
TOOL_WORKTREE_PATH にタブが含まれると壊れます。修正するには jq 側でフィールドを NUL 文字で連結(例えば '[(...)] |
join("\u0000")' など)して出力し、シェル側では read の -d '' オプションや -a 配列読み込みで NUL
区切りを扱うように変更して、INPUT → _parsed → read による SESSION_ID / CWD / TOOL_WORKTREE_PATH
の復元を NUL 区切りで安全に行ってください。

In `@tests/test-worktree-create-hook.sh`:
- Around line 77-83: Add a test that verifies the hook honors
tool_input.worktreePath by invoking run_hook with a JSON payload containing
"tool_input":{"worktreePath":<custom path>} (use variables like CUSTOM_PATH and
CUSTOM_OUT), capture output into CUSTOM_PRINTED, and assert CUSTOM_PRINTED
equals CUSTOM_PATH; if not, call fail with a clear message like
"tool_input.worktreePath not honored: ${CUSTOM_PRINTED}". Ensure the test is
placed after the idempotency check and uses the same run_hook and tr -d '\n'
pattern as the other cases to remain consistent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bc752b0-68f1-4639-b1f6-8447b551c42d

📥 Commits

Reviewing files that changed from the base of the PR and between 0787113 and a3c1749.

📒 Files selected for processing (4)
  • go/internal/hookhandler/worktree_create.go
  • go/internal/hookhandler/worktree_create_test.go
  • scripts/hook-handlers/worktree-create.sh
  • tests/test-worktree-create-hook.sh

Comment thread go/internal/hookhandler/worktree_create.go Outdated
aryrabelo added 2 commits May 27, 2026 17:07
…on retry

Address PR Chachamaru127#168 review:

- isGitWorktree used `git rev-parse --is-inside-work-tree`, which is true
  for ANY path inside a checkout. A repo subdirectory or a leftover
  .harness-worktrees/<session> dir would be wrongly reused, printing a path
  still part of the main checkout. Switch to `--show-toplevel` and require
  it to equal the target (symlink-resolved) — a true worktree root.
- gitWorktreeAdd retry on an existing branch ran `git worktree add <path>`,
  which checks out a branch named after the dir basename instead of the
  intended harness/worker/<slug>. Pass the branch explicitly.

Mirror both fixes in the shell fallback. Add regression tests:
TestIsGitWorktree_RepoSubdirNotWorktreeRoot, TestGitWorktreeAdd_ReusesExistingBranch.

Copy link
Copy Markdown
Owner

Heads-up on the CI here — there are two independent failures:

  1. validate job — this was failing on a repo-wide version drift (harness.toml was 4.13.0 while VERSION/plugin.json were 4.13.1, so the sync step reverted plugin.json and tripped the check-consistency parity gate). That affected every PR branched off main, not just this one. It's now fixed on main (fix: align harness.toml version with VERSION/plugin.json (4.13.1) #178), so a rebase on main should clear the validate failure here.

  2. test-go job — this one is specific to this branch and is not explained by the version drift (go test ./... is unrelated to it). After rebasing, please re-check test-go; it looks like a genuine failure in the worktree-create changes that needs a look. (I wasn't able to reproduce the exact cause in a clean environment to pin it down further.)

Thanks for the fix — the worktree-path-only contract change itself looks right.


Generated by Claude Code

@Chachamaru127 Chachamaru127 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed locally against current main.

  • Merges cleanly into main (4 files: Go handler, shell fallback, and both tests).
  • Full go test ./... passes (11 packages, exit 0) on the merged tree, including the 8 new helper unit tests and tests/test-worktree-create-hook.sh.
  • The fix is correct: the WorktreeCreate hook must print only the resolved worktree path on stdout (diagnostics → stderr). The previous decision-JSON-on-stdout broke worktree creation ("returned a path that is not a directory"). The looksLikeHookDecisionJSON guard is a good defensive hardening against the legacy bug.
  • Defensive handling of pre-existing/non-empty dirs and safe-abort-on-failure (empty stdout) is sound.

The test-go / validate CI failures were against a stale base (and a sandbox-only commit-signing issue locally); re-running after updating the branch to current main.

LGTM.


Generated by Claude Code

Copy link
Copy Markdown
Owner

Landed via #186 (merged to main). Thanks @aryrabelo — your two commits were cherry-picked unchanged so authorship is preserved, with a Co-authored-by trailer on the squash commit.

Two small CI fixes were needed to land on the current main:

  • gofmt on worktree_create_test.go (map-literal alignment) for the test-go format-lint gate.
  • Updated tests/test-windows-worktree-support.sh to follow the refactor that moved the inline .claude/state join into the worktreeStateDir(base) helper. The grep now asserts filepath.Join(<var>, ".claude", "state"), so the Windows-safe path-joining contract still holds.

All 5 checks (test-go, validate, CodeQL, Analyze, actionlint) were green on #186 before merge. Closing this in favor of #186.


Generated by Claude Code

Chachamaru127 added a commit that referenced this pull request May 31, 2026
… lands #168)

Rewrite the WorktreeCreate Go handler and shell fallback to resolve/reuse/create the worktree, init .claude/state/, and print ONLY the worktree path on stdout (diagnostics to stderr), with a looksLikeHookDecisionJSON guard against the legacy decision-JSON-on-stdout bug that broke agent-isolation / breezing worker spawns.

Also includes two CI fixes needed to land on current main:
- gofmt worktree_create_test.go (format-lint gate)
- track the .claude/state join refactor (worktreeStateDir helper) in tests/test-windows-worktree-support.sh, keeping the Windows-safe path-joining assertion.

Original work by Ary Rabelo (#168). Closes #168.

Co-authored-by: Ary Rabelo <aryrabelo@gmail.com>

Copy link
Copy Markdown
Owner

Correction: my earlier comment said "#186" by mistake — this was actually landed via #188 (now merged to main). #186 is an unrelated docs PR. Apologies for the wrong number.

Summary stands: your two commits (@aryrabelo) were cherry-picked unchanged (authorship preserved, Co-authored-by on the squash commit), with two CI fixes — gofmt on worktree_create_test.go and updating tests/test-windows-worktree-support.sh to follow the worktreeStateDir(base) refactor. All checks were green on #188 before merge.


Generated by Claude Code

pull Bot pushed a commit to dubbypanda/claude-code-harness that referenced this pull request Jun 1, 2026
Promote [Unreleased] to [4.13.3] - 2026-06-01 and bump all version
surfaces from 4.13.2 to 4.13.3 (patch).

- Cursor 初回利用の摩擦 4 点を解消 (Chachamaru127#193, Chachamaru127#194)
- breezing 起動ナレーションを計画明示型に緩和 (Chachamaru127#190)
- WorktreeCreate hook の出力修正 (Chachamaru127#188, lands Chachamaru127#168)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants