feat(setup): MSIX/Store 버전 Claude 앱 자동 탐지 + 바로가기 지원

PD님 환경(Windows Store 버전 Claude Code) 실측 결과 반영:
- Get-AppxPackage로 MSIX 패키지 우선 탐지
- AppxManifest.xml에서 AppId 추출하여 정확한 shell:AppsFolder URI 구성
- MSIX 탐지 시 TargetPath=explorer.exe, Arguments=shell:AppsFolder\<PFN>!<AppId>
- 미탐지 시 기존 일반 claude.exe 경로 탐색으로 fallback
- MSIX 바로가기 생성 후 WorkingDirectory 전달 보장 안 된다는 경고 추가

실측 정보:
- PackageFamilyName: Claude_pzs8sxrjxfjjc
- AppId: Claude
- Executable: app\claude.exe (WindowsApps 직접 접근 제한됨)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-04-15 10:55:33 +09:00
parent 416dcceb11
commit d69672176f
1 changed files with 41 additions and 17 deletions

View File

@ -129,8 +129,28 @@ if ($CreateShortcuts) {
Write-Host ""
Write-Host "=== 부서별 바탕화면 바로가기 생성 ==="
# claude.exe 경로 자동 탐색
if (-not $ClaudeExePath) {
# 1) MSIX/Store 패키지 우선 탐지 (PD님 환경 표준)
$msixPkg = $null
try { $msixPkg = Get-AppxPackage -Name '*Claude*' -ErrorAction SilentlyContinue | Select-Object -First 1 } catch {}
$msixLaunchArg = $null
if ($msixPkg) {
# AppxManifest에서 AppId 추출
$manifestPath = Join-Path $msixPkg.InstallLocation 'AppxManifest.xml'
$appId = 'App'
if (Test-Path $manifestPath) {
try {
[xml]$m = Get-Content $manifestPath
$appIdNode = $m.Package.Applications.Application | Select-Object -First 1
if ($appIdNode -and $appIdNode.Id) { $appId = $appIdNode.Id }
} catch {}
}
$msixLaunchArg = "shell:AppsFolder\$($msixPkg.PackageFamilyName)!$appId"
Write-Host "Claude MSIX 패키지 탐지: $($msixPkg.PackageFamilyName) / AppId=$appId"
}
# 2) MSIX 미탐지 시 일반 claude.exe 탐색 (fallback)
if (-not $msixLaunchArg -and -not $ClaudeExePath) {
$candidatePaths = @(
"$env:LOCALAPPDATA\Programs\claude\claude.exe",
"$env:LOCALAPPDATA\AnthropicClaude\claude.exe",
@ -140,25 +160,17 @@ if ($CreateShortcuts) {
"$env:LOCALAPPDATA\Programs\Claude\Claude.exe"
)
foreach ($cp in $candidatePaths) {
if (Test-Path $cp) {
$ClaudeExePath = $cp
Write-Host "claude.exe 자동 탐지: $ClaudeExePath"
break
}
if (Test-Path $cp) { $ClaudeExePath = $cp; Write-Host "claude.exe 자동 탐지: $ClaudeExePath"; break }
}
if (-not $ClaudeExePath) {
$where = (Get-Command claude.exe -ErrorAction SilentlyContinue).Source
if ($where) {
$ClaudeExePath = $where
Write-Host "claude.exe PATH에서 탐지: $ClaudeExePath"
}
if ($where) { $ClaudeExePath = $where; Write-Host "claude.exe PATH에서 탐지: $ClaudeExePath" }
}
}
if (-not $ClaudeExePath -or -not (Test-Path $ClaudeExePath)) {
Write-Warning "claude.exe 경로 탐지 실패. 바로가기 생성 생략."
if (-not $msixLaunchArg -and (-not $ClaudeExePath -or -not (Test-Path $ClaudeExePath))) {
Write-Warning "Claude 실행 수단 탐지 실패 (MSIX·exe 모두). 바로가기 생성 생략."
Write-Warning "수동 지정: .\setup_windows.ps1 -CreateShortcuts -ClaudeExePath '<실제 경로>'"
Write-Warning "claude.exe 위치 확인법: Claude Code 앱 실행 파일 속성 > 대상 경로 복사"
} else {
$WshShell = New-Object -ComObject WScript.Shell
$desktop = [Environment]::GetFolderPath("Desktop")
@ -176,16 +188,28 @@ if ($CreateShortcuts) {
}
$shortcutPath = Join-Path $desktop "$($t.Name).lnk"
$sc = $WshShell.CreateShortcut($shortcutPath)
if ($msixLaunchArg) {
# MSIX 앱: explorer.exe shell:AppsFolder\... 방식
$sc.TargetPath = "explorer.exe"
$sc.Arguments = $msixLaunchArg
} else {
# 일반 exe 방식
$sc.TargetPath = $ClaudeExePath
$sc.WorkingDirectory = $t.Dir
$sc.IconLocation = "$ClaudeExePath,0"
}
$sc.WorkingDirectory = $t.Dir
$sc.Description = $t.Desc
$sc.Save()
Write-Host "바로가기 생성: $shortcutPath (WD=$($t.Dir))"
}
Write-Host ""
Write-Host "바로가기 3종 생성 완료. 바탕화면에서 각 바로가기 더블클릭으로 해당 부서 폴더에서 Claude Code 실행 가능."
if ($msixLaunchArg) {
Write-Host "바로가기 3종 생성 완료 (MSIX 모드)."
Write-Host "※ MSIX 앱은 WorkingDirectory가 전달되지 않을 수 있음. 바로가기 더블클릭 후 실제 프로젝트 경로 확인 필수."
} else {
Write-Host "바로가기 3종 생성 완료."
}
}
}