Skip to content

feat: add post-create symlink hooks#58

Merged
es5h merged 1 commit into
mainfrom
feat/create-hooks
May 12, 2026
Merged

feat: add post-create symlink hooks#58
es5h merged 1 commit into
mainfrom
feat/create-hooks

Conversation

@es5h

@es5h es5h commented May 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • <primary-root>/.wt/config.toml[[hooks.postCreate.symlinks]] 설정을 추가했습니다.
  • wt createwt path --create가 새 worktree 생성 직후 primary repo의 파일/디렉터리를 새 worktree 안에 상대 symlink로 연결합니다.
  • source 누락과 target 충돌은 onMissingSource / onExistingTarget 정책으로 제어합니다.
  • release-please PR 본문과 충돌하던 CI pr-body 강제 검사 job과 전용 script를 제거했습니다.
  • Claude/Codex skill 등록 문서를 현재 dotfiles 기반 구조에 맞춰 정리했습니다.

User impact

  • 새 설정 파일: <primary-root>/.wt/config.toml
  • 새 hook table: [[hooks.postCreate.symlinks]]
  • wt create / wt path --create에서 새 worktree가 실제 생성될 때만 post-create symlink가 적용됩니다.
  • 기존 live worktree path를 반환하는 경우에는 symlink를 재적용하지 않습니다.
  • post-create symlink 실패 시 명령은 non-zero로 실패하지만, 이미 생성된 worktree를 자동 삭제하지 않습니다.
  • stdout path-only 계약은 유지합니다.
  • CI에서는 PR body 형식 강제 check가 사라지고 premerge만 PR 필수 check로 남습니다.

Behavior

예시:

[[hooks.postCreate.symlinks]]
source = ".env.local"
target = ".env.local"
onMissingSource = "skip"
onExistingTarget = "fail"
wt path feature-x --create
wt create feature-y
  • source는 primary repo root 기준 상대 경로입니다.
  • target은 새 worktree root 기준 상대 경로입니다.
  • target을 생략하면 source와 같은 상대 경로를 사용합니다.
  • symlink 값은 상대 경로로 생성됩니다.

Safety

  • 절대 경로와 ..로 root를 벗어나는 경로는 거부합니다.
  • target이 이미 다른 파일/디렉터리/symlink이면 기본값 onExistingTarget = "fail"로 실패합니다.
  • onExistingTarget = "skip"이면 기존 target을 덮어쓰지 않습니다.
  • onMissingSource = "skip"이 기본값이라 로컬 secret 파일이 없는 환경에서도 worktree 생성이 막히지 않습니다.
  • wt remove / wt cleanup --apply로 worktree를 제거해도 primary repo의 source 파일은 삭제되지 않습니다.

Tests

  • wt run feat/create-hooks -- make fmt
  • wt run feat/create-hooks -- make test
  • wt run feat/create-hooks -- make check
  • wt run feat/create-hooks -- make premerge
  • 임시 repo E2E: 빌드한 wt 바이너리로 path feature-x --create 실행 후 .env.local symlink 생성 확인

E2E guide

현재 repo 기준:

wt run feat/create-hooks -- make premerge

임시 repo 기준:

git init -b main <repo>
printf '[[hooks.postCreate.symlinks]]\nsource = ".env.local"\ntarget = ".env.local"\n' > <repo>/.wt/config.toml
wt path feature-x --create
test -L <repo>/.wt/feature-x/.env.local

E2E Done

  • 완료: wt run feat/create-hooks -- make fmt
    • exit code: 0
    • stdout/stderr 핵심: 없음
    • evidence: local command output
  • 완료: wt run feat/create-hooks -- make test
    • exit code: 0
    • stdout 핵심: cmd/wt, internal/git, internal/hosting, internal/worktree 테스트 통과
    • stderr 핵심: 없음
    • evidence: local command output
  • 완료: wt run feat/create-hooks -- make check
    • exit code: 0
    • stdout/stderr 핵심: 없음
    • evidence: local command output
  • 완료: wt run feat/create-hooks -- make premerge
    • exit code: 0
    • stdout 핵심: 전체 Go package 테스트 통과
    • stderr 핵심: 없음
    • evidence: local command output
  • 완료: 임시 repo symlink E2E
    • exit code: 0
    • stdout 핵심: created=<repo>/.wt/feature-x, link=../../.env.local
    • stderr 핵심: 없음
    • evidence: local command output

Docs

  • README.md
  • docs/spec/cli.md
  • docs/policy/worktree.md
  • docs/ux/agents.md
  • docs/examples/skills/wt-worktree/SKILL.md
  • docs/release/notes.md

Release

  • PR title은 Conventional Commit 형식입니다.
  • 기능 PR이지만 release-please version 파일과 CHANGELOG.md는 직접 수정하지 않았습니다.

@es5h es5h merged commit 6bc1439 into main May 12, 2026
2 checks passed
@es5h es5h deleted the feat/create-hooks branch May 12, 2026 13:04
@es5h es5h mentioned this pull request May 12, 2026
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.

1 participant