Repository navigation
windows shell safety_ja
Kazushi Kamegawa edited this page Oct 7, 2026
·
1 revision
Windows で Azure CLI・JSON ペイロード・パイプが cmd.exe を経由してエージェントが時間を浪費しないよう、独立した windows-shell-safety プラグインを追加します。スキルが安全な実行パターンを規定し、同梱の事前 lint が危険なコマンド形を実行前に検出します。
| 種別 | Issue |
|---|---|
| 親 | Issue #84 |
| サブ issue | Issue #85 |
| サブ issue | Issue #86 |
| サブ issue | Issue #87 |
| サブ issue | Issue #88 |
- Windows の
azはバッチファイルaz.cmdです。PowerShell 7 から呼んでもcmd.exeが引数を再解釈し、|、&、<、>、^、%VAR%を消費するため、--query "[?x=='a'] | [0]"のような JMESPath が壊れます。 - PowerShell 7.3+ の既定
$PSNativeCommandArgumentPassing = 'Windows'は.cmd/.batに対して Legacy の引数渡しを維持するため、インライン JSON 内の二重引用符が欠落します。 - Git Bash や
cmdからのpowershell -Command "... | ..."のような多段呼び出しでは、外側のシェルが先にパイプや引用符を消費します。 -
$OutputEncodingと[Console]::OutputEncodingの不一致により、パイプ経由の非 ASCII データが?になります。 - 既存の Azure DevOps ガイダンスは REST 書き込みのみを対象としており、本計画でこれを汎用化します。
- 防止レベル: スキルと事前 lint。誤検知で作業が止まらないよう PreToolUse フックは使いません。
- 配置:
az、gh、dotnetなどのネイティブツールに使える新規プラグインplugins/windows-shell-safety/。Azure DevOps スキルは内容を重複させずに参照します。 - スキルの規則:
pwshのみを使う、JSON を引数に埋め込まない(UTF-8 ファイルと@file)、az --queryにcmdメタ文字や引用符を入れずConvertFrom-Jsonで絞り込む、パイプ前に UTF-8 エンコーディングを設定する、-Command文字列ではなくpwsh -Fileでスクリプトを実行する、実行前に lint を通す、再試行前に受信 argv を確認する。 -
Test-NativeCommand.ps1: 規則 WSS001-WSS008(cmd /c、-Command文字列、.cmd対象へのcmdメタ文字、インライン JSON、エスケープ済み引用符、Windows PowerShell 5.1、UTF-8 設定漏れ、シェル回避策)を持つ AST ベースの lint。指摘ありで終了コード 1、-AsJson出力対応。 -
Invoke-NativeJson.ps1:Invoke-AzJsonは本文を UTF-8 一時ファイル経由で送り、解析済みオブジェクトを返します。-EchoArgsは.cmd子プロセスが実際に受け取った argv を表示します。
- lint スクリプトと unittest フィクスチャ(#85)。
- 安全実行ヘルパー(#86)。
- スキル文書、リファレンス、マニフェスト、リポジトリ文書(#87)。
- 引数欠落を再現し、安全なパターンを実証する
windows-latestCI ジョブ(#88)。
-
python3 scripts/validate_marketplaces.pyが成功すること。 - lint の unittest がローカルの
pwshと既存の Ubuntu CI ジョブで成功すること。 -
windows-latestCI ジョブで、サインイン不要のaz versionを使い、壊れる形が失敗し推奨形が成功することを示すこと。