Проверка скриптов для Microsoft 365
Описывает, как проверять административные скрипты установки Claude для Office, запуская их в изолированной песочнице.
- Что делает
- Описывает, как проверять административные скрипты установки Claude для Office, запуская их в изолированной песочнице.
- Когда брать
- Когда меняются скрипты и команды плагина claude-for-msft-365-install и нужно убедиться, что они работают и не трогают данные пользователя.
- Когда не брать
- Если нужна работа для обычного пользователя: плагин — административный инструмент командной строки, а не приложение.
- Пример запроса
- Проверь мои правки в clear-addin-cache.sh в изолированной песочнице.
- Нужно подключить
- терминал, репозиторий плагина
- Работает лучше с
- Windows с PowerShell 5.1
Входит в плагин claude-for-msft-365-install. В Cowork и Claude Code можно поставить плагин целиком.
Как включить
- Скачайте архив и распакуйте его.
- Положите папку
verifyв~/.claude/skills/. - Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.
Текст
---
name: verify
description: Проверяет изменения в административных скриптах и командах claude-for-msft-365-install, запуская их в изолированном фиктивном $HOME.
---
Проверка claude-for-msft-365-install
Этот плагин — административный инструмент командной строки, а не приложение. Собирать нечего, запускать сервер не нужно. Работа идёт в терминале: scripts/*.sh на macOS, scripts/*.ps1 на Windows.
Линтер-проверка
python3 scripts/check.py # from the REPO ROOT, not the plugin dir
bash -n claude-for-msft-365-install/scripts/<script>.sh
check.py проверяет линтером каждый манифест и сам устанавливает хук pre-commit, который повышает патч-версию в .claude-plugin/plugin.json. Запускай перед коммитом.
Запускай скрипты в фиктивном $HOME
Каждый скрипт для macOS берёт пути Office из $HOME, поэтому подмена этой переменной даёт одноразовую песочницу: можно прогонять разрушительные ветки --apply, не трогая настоящие данные Office.
S=<scratchpad>/sandbox
for app in Excel Word Powerpoint; do
mkdir -p "$S/Library/Containers/com.microsoft.$app/Data/Documents/wef"
done
printf '<x/>' > "$S/Library/Containers/com.microsoft.Excel/Data/Documents/wef/aaaaaaaa-1111-1111-1111-111111111111.manifest-a.xml"
HOME=$S ./scripts/clear-addin-cache.sh # list
HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> # dry-run
HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> --apply # destructive
Заложи как минимум два идентификатора в двух приложениях, с буквами в разном регистре. Оба условия уже выявляли настоящие ошибки: затрагивание чужого приложения и чувствительный к регистру шаблон имён, который сообщал «уже чисто» и отправлял администраторов стирать всю папку целиком.
Докажи, что хранилище сохраняется
Главное обещание этого плагина: очистка манифеста никогда не затрагивает историю чатов пользователя. Проверь это сравнением снимков обоих деревьев до и после операции, на настоящем $HOME:
snap() {
for app in Excel Word Powerpoint; do
find "$HOME/Library/Containers/com.microsoft.$app/Data/Library/WebKit/WebsiteData" \
-type f -exec stat -f '%N %z %m' {} \; 2>/dev/null
find "$HOME/Library/Containers/com.microsoft.$app/Data/Documents/wef" \
-type f -exec stat -f 'WEF %N %z' {} \; 2>/dev/null
done | sort
}
snap > before.txt; <run the script>; snap > after.txt; diff before.txt after.txt
Манифесты лежат в Data/Documents/wef, хранилище — в Data/Library/WebKit/WebsiteData. Это разные поддеревья, поэтому diff должен показать только удалённый тобой манифест. Верни все подложенные файлы на место и снова сравни: убедись, что оставил машину в том виде, в каком её нашёл.
Подводные камни
- Инструмент Bash запускает zsh. Скрипты написаны под
#!/usr/bin/env bash; поведение, свойственное только bash (shopt, правила подстановки шаблонов), проверяй внутриbash <<'EOF' … EOF, а не прямо в строке. - **
PRAGMA integrity_checkиSELECT count(*)не работают на выгруженных файлах IndexedDB** и выдаютno such collation sequence: IDBKEY. Это особая сортировка WebKit, а не повреждение: на исходном файле происходит то же самое. Полноту проверяй запросомSELECT sum(length(value)) FROM Records;с обеих сторон. - **Никогда не утверждай, что скрипты
.ps1работают, если не запускал их на Windows.** В macOS нет PowerShell, поэтому изменение в.ps1, проверенное только здесь, считается непроверенным. Запускай его на настоящем компьютере с Windows в Windows PowerShell 5.1 и всегда выполняй проверку разбора до проверок поведения:
``powershell $e = $null [System.Management.Automation.PSParser]::Tokenize( (Get-Content -Raw .\clear-addin-cache.ps1), [ref]$e) | Out-Null if ($e.Count) { $e | ForEach-Object { $_.Message } } else { 'parse ok' } ``
Файл может прекрасно работать на macOS и полностью не разбираться в Windows (см. замечание про ASCII ниже), поэтому в первую очередь нужно убедиться, что разбор проходит.
- **Файлы
.ps1должны состоять только из ASCII** (проверяется вscripts/check.py). Windows PowerShell 5.1 читает.ps1без BOM как ANSI, поэтому длинное тире превращается в «кракозябры» с символом", который закрывает строку и ломает разбор.clear-addin-cache.ps1вышел сломанным именно так, и ни одна проверка на macOS этого не поймала. - Проверяй разбор аргументов. Если
--flagстоит последним аргументом,shift 2падает приset -eи скрипт завершается с кодом 1 без вывода; каждому флагу нужна защита[ $# -ge 2 ].
Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/financial-services/tree/main/claude-for-msft-365-install/.claude/skills/verify, лицензия Apache-2.0. Изменения: перевод на русский язык.
Оригинал на английском
---
name: verify
description: Verify changes to the claude-for-msft-365-install admin scripts and commands by driving them against an isolated fake $HOME.
---
# Verifying claude-for-msft-365-install
This plugin is **admin CLI tooling**, not an app. There is nothing to build and
no server to boot. The surface is the terminal: `scripts/*.sh` on macOS,
`scripts/*.ps1` on Windows.
## Lint gate
```bash
python3 scripts/check.py # from the REPO ROOT, not the plugin dir
bash -n claude-for-msft-365-install/scripts/<script>.sh
```
`check.py` lints every manifest and self-installs the pre-commit hook that
patch-bumps `.claude-plugin/plugin.json`. Run it before committing.
## Drive the scripts against a fake $HOME
Every macOS script resolves Office paths from `$HOME`, so overriding it gives a
throwaway sandbox — you can exercise the destructive `--apply` paths without
touching real Office data.
```bash
S=<scratchpad>/sandbox
for app in Excel Word Powerpoint; do
mkdir -p "$S/Library/Containers/com.microsoft.$app/Data/Documents/wef"
done
printf '<x/>' > "$S/Library/Containers/com.microsoft.Excel/Data/Documents/wef/aaaaaaaa-1111-1111-1111-111111111111.manifest-a.xml"
HOME=$S ./scripts/clear-addin-cache.sh # list
HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> # dry-run
HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> --apply # destructive
```
Seed at least **two IDs across two apps**, with **mixed upper/lowercase**. Both
properties have caught real bugs: cross-app blast radius, and a case-sensitive
glob that reported "already clear" and sent admins to a folder-wide wipe.
## Prove storage is retained
The load-bearing claim of this plugin is that clearing a manifest never touches
the user's chat history. Verify it by snapshot-diffing both trees around the
operation, against the **real** `$HOME`:
```bash
snap() {
for app in Excel Word Powerpoint; do
find "$HOME/Library/Containers/com.microsoft.$app/Data/Library/WebKit/WebsiteData" \
-type f -exec stat -f '%N %z %m' {} \; 2>/dev/null
find "$HOME/Library/Containers/com.microsoft.$app/Data/Documents/wef" \
-type f -exec stat -f 'WEF %N %z' {} \; 2>/dev/null
done | sort
}
snap > before.txt; <run the script>; snap > after.txt; diff before.txt after.txt
```
Manifests live in `Data/Documents/wef`; storage lives in
`Data/Library/WebKit/WebsiteData`. Different subtrees — the diff should show
only the manifest you removed. **Restore any planted files and re-diff to
confirm you left the machine as you found it.**
## Gotchas
- **The Bash tool runs zsh.** Scripts are `#!/usr/bin/env bash`; test bash-only
behaviour (`shopt`, glob semantics) inside `bash <<'EOF' … EOF`, not inline.
- **`PRAGMA integrity_check` and `SELECT count(*)` fail on exported IndexedDB
files** with `no such collation sequence: IDBKEY`. That is WebKit's custom
collation, not corruption — it fails on the source file too. Verify
completeness with `SELECT sum(length(value)) FROM Records;` on both sides.
- **Never claim the `.ps1` scripts work without running them on Windows.**
macOS has no PowerShell, so a `.ps1` change verified only here is unverified.
Run it on a real Windows host against Windows PowerShell 5.1, and always
include a **parse check** before the behavioural ones:
```powershell
$e = $null
[System.Management.Automation.PSParser]::Tokenize(
(Get-Content -Raw .\clear-addin-cache.ps1), [ref]$e) | Out-Null
if ($e.Count) { $e | ForEach-Object { $_.Message } } else { 'parse ok' }
```
A file can be perfectly fine on macOS and fail to parse outright on Windows
(see the ASCII note below), so parsing is the first thing to establish.
- **`.ps1` files must be pure ASCII** (enforced by `scripts/check.py`).
Windows PowerShell 5.1 reads a BOM-less `.ps1` as ANSI, so an em dash decodes
to mojibake containing `"`, which terminates a string and breaks the parse.
`clear-addin-cache.ps1` shipped broken this way and no macOS check caught it.
- Probe the arg parser. `--flag` as the final argument makes `shift 2` fail
under `set -e` and exits 1 with **no output**; each flag needs a
`[ $# -ge 2 ]` guard.
Источник: anthropics/financial-services / claude-for-msft-365-install / verify ↗. Ссылка проверена 2026-10-10.