# syncwingetlink(日本語)
> winget のポータブルパッケージで作られるべきシンボリックリンクの欠落・破損を検出し、再作成するネイティブ CLI ツール(Windows 11 24H2+)。
[](./LICENSE)
📖 The canonical English version is [`README.md`](./README.md).
## これは何?
winget でポータブルパッケージをインストールすると、本来はコマンドエイリアス用の
シンボリックリンクが `%LOCALAPPDATA%\Microsoft\WinGet\Links\.exe` に作成され、
このフォルダが `PATH` に含まれることで CLI から呼び出せます。
しかし環境によっては、この symlink が作成されない/壊れる不具合が報告されています。
その結果、`codex_0.x_x86_64-pc-windows-msvc.exe` のような長い実ファイル名でしか
起動できず、`codex` のような短いエイリアスが使えなくなります。
**syncwingetlink** は、インストール済みのポータブルパッケージを列挙し、
`Links` フォルダにあるべきリンクと突き合わせて、欠落・破損しているものを検出し、
ユーザー確認のうえで再作成します。
## 主な特徴
- 🔎 **検出**: インストール済み portable パッケージを列挙し、リンク状態を
`Ok / Missing / Broken / Mismatch` に分類
- 🔗 **修復**: 欠落・破損した symlink をユーザー確認のうえで作成(`--dry-run` 対応)
- 🧩 **エイリアス正規表現ルール**: `codex-x86_64-pc-windows-msvc.exe → codex.exe` のような
プラットフォーム接尾辞の除去ルールをカスタマイズ可能
- 🖥️ **CLI / TUI**: 通常は CLI、`--tui` で対話的なチェックリスト操作
- ⚡ **winget COM API を優先**: `Microsoft.Management.Deployment` から権威的に列挙し、
利用不可時はファイルシステム走査へ自動フォールバック
## 動作環境
- Windows 11 24H2 (build 26100) 以降
- x64 / arm64
- symlink 作成には**開発者モード**有効(推奨)または管理者権限が必要
## インストール
winget でインストール:
```powershell
winget install kkamegawa.syncwingetlink
```
winget で更新:
```powershell
winget upgrade kkamegawa.syncwingetlink
```
`syncwingetlink` はアーキテクチャごとの **ZIP アーカイブ**として GitHub Releases に公開されます
(`docs/adr-phase-6.md` ADR-0033、`docs/adr-phase-9.md` ADR-0045)。中の exe は
**署名なし**のため、初回実行時に Windows SmartScreen やアンチウイルスが警告を出す
可能性があります。展開する前に公開されている `SHA256SUMS.txt` でハッシュを検証して
ください。各 ZIP には本 README・エイリアスルールのリファレンス・トラブルシューティング
ガイド(英語・日本語の両方)を収めた `docs/` フォルダも同梱されており、オフラインでも
参照できます。
ZIP から手動インストール(PowerShell):
```powershell
# / をインストールしたいリリースに置き換えてください(x64 または arm64)。
Invoke-WebRequest -Uri "https://github.com//syncwingetlink/releases/download/v/syncwingetlink--.zip" -OutFile syncwingetlink.zip
Invoke-WebRequest -Uri "https://github.com//syncwingetlink/releases/download/v/SHA256SUMS.txt" -OutFile SHA256SUMS.txt
# 展開する前にハッシュを検証してください。
$expected = (Select-String -Path SHA256SUMS.txt -Pattern "syncwingetlink--\.zip").Line.Split()[0]
$actual = (Get-FileHash syncwingetlink.zip -Algorithm SHA256).Hash
if ($actual -ne $expected) { throw "Checksum mismatch - do not extract this file." }
Expand-Archive -Path syncwingetlink.zip -DestinationPath syncwingetlink
# exe を PATH の通ったフォルダへ移動します。例えば winget 自身が使う Links フォルダ
# (先に作成しておきます。Links フォルダが存在しないのはよくある正常な状態で、
# それを直すのがまさにこのツールの `fix` コマンドです):
New-Item -ItemType Directory -Force "$env:LOCALAPPDATA\Microsoft\WinGet\Links" | Out-Null
Move-Item syncwingetlink\syncwingetlink.exe "$env:LOCALAPPDATA\Microsoft\WinGet\Links\"
```
bash(WSL や Git Bash など。ダウンロード・検証専用 - 実行ファイル自体は
Windows でのみ動作します):
```bash
# / をインストールしたいリリースに置き換えてください(x64 または arm64)。
curl -LO "https://github.com//syncwingetlink/releases/download/v/syncwingetlink--.zip"
curl -LO "https://github.com//syncwingetlink/releases/download/v/SHA256SUMS.txt"
# 展開する前にハッシュを検証してください。
sha256sum --ignore-missing -c SHA256SUMS.txt
unzip syncwingetlink--.zip -d syncwingetlink
```
## 使い方
```powershell
# 検出のみ(読み取り専用)
syncwingetlink scan
# 欠落・破損リンクを修復(確認プロンプトあり)
syncwingetlink fix
# 何が行われるかだけ確認(副作用なし)
syncwingetlink fix --dry-run
# 対話 TUI で選択して一括作成
syncwingetlink fix --tui
# あるファイル名にどの置換ルールが適用されるか確認
syncwingetlink test-rule "codex-x86_64-pc-windows-msvc.exe"
```
### 主なオプション
| オプション | 説明 |
|---|---|
| `--source com\|fs\|auto` | パッケージ列挙のソース(既定 `auto`:COM 優先→FS 縮退) |
| `--dry-run` | 実行せず計画のみ表示(`fix`) |
| `--yes`, `-y` | 確認をスキップして実行 |
| `--rules ` | 置換ルール JSON のパス |
| `--tui` | 対話 TUI モード |
| `--json` | 結果を JSON 出力(スクリプト連携) |
| `--help` / `--version` | ヘルプ / バージョン |
### 終了コード
| コード | 意味 |
|---|---|
| 0 | 正常(修復不要 or 成功) |
| 1 | 修復が必要だが未実行 |
| 2 | 権限不足(開発者モード無効 & 非管理者) |
| 3 | 引数 / 設定エラー |
| 10 | 一部の修復に失敗 |
## トラブルシューティング
COM アクティベーションやパッケージ列挙の代表的な失敗については
[`docs/troubleshooting_ja.md`](./docs/troubleshooting_ja.md) を参照してください。
## エイリアス置換ルール
実ファイル名からエイリアス名を導く正規表現ルールを JSON で定義できます。
詳しくは [`docs/rules.md`](./docs/rules.md) を参照してください。
```json
{
"version": 1,
"rules": [
{
"name": "strip-rust-target-triple",
"pattern": "^(.+?)[-_](x86_64|aarch64|i686)-pc-windows-(msvc|gnu)(\\.exe)$",
"replacement": "$1.exe",
"flags": ["ignorecase"]
}
]
}
```
## ビルド(開発者向け)
**Visual Studio 2026**(プラットフォームツールセット v145)と Windows SDK 10.0.26100.0 が
必要です。Developer PowerShell for VS 2026 から実行してください。
```powershell
msbuild syncwingetlink.sln -p:Configuration=Release -p:Platform=x64 -m
vstest.console.exe build\x64\Release\syncwingetlink.tests.dll /Platform:x64
```
単体テストには MSTest(Microsoft Unit Testing Framework for C++)を使用し、Visual Studio の
テストエクスプローラーからも実行できます。
詳細な設計は [`docs/PLAN.md`](./docs/PLAN.md)、作業単位は [`docs/TODO.md`](./docs/TODO.md)、
アーキテクチャ上の意思決定は [`docs/adr.md`](./docs/adr.md) を参照してください。
## リポジトリのセットアップ(フォーク後)
識別可能な情報をコミットしないよう、URL とメールアドレスはプレースホルダのままにして
あります。次のいずれかのスクリプトで一度だけ置換してください(内容は同等です)。
```powershell
./tools/Set-RepositoryPlaceholders.ps1 -Owner -SecurityContact
```
```bash
tools/set-repository-placeholders.sh --owner --security-contact
```
どちらも `-WhatIf` / `--dry-run` で事前確認できます。
## 貢献
歓迎します をご覧ください。
AI コーディングエージェントを使う場合は [`AGENTS.md`](./AGENTS.md) を先に読んでください。
セキュリティ上の問題は公開 Issue ではなく [`SECURITY.md`](./SECURITY.md) の手順で
非公開に報告してください。
## ライセンス
[MIT License](./LICENSE)
## 免責
本ツールはシンボリックリンクの作成・削除を行います。`scan` は読み取り専用ですが、
`fix` を使う際は `--dry-run` で内容を確認することを推奨します。
winget 本体のデータベースは変更しません。