iiuniversitet.ruЦентр обучения нейросетямОткрыть каталог

Проверка скриптов для Microsoft 365

Описывает, как проверять административные скрипты установки Claude для Office, запуская их в изолированной песочнице.

СкиллAnthropicClaudeApache-2.0Нужен терминалПроверка не требуется
Что делает
Описывает, как проверять административные скрипты установки Claude для Office, запуская их в изолированной песочнице.
Когда брать
Когда меняются скрипты и команды плагина claude-for-msft-365-install и нужно убедиться, что они работают и не трогают данные пользователя.
Когда не брать
Если нужна работа для обычного пользователя: плагин — административный инструмент командной строки, а не приложение.
Пример запроса
Проверь мои правки в clear-addin-cache.sh в изолированной песочнице.
Нужно подключить
терминал, репозиторий плагина
Работает лучше с
Windows с PowerShell 5.1

Входит в плагин claude-for-msft-365-install. В Cowork и Claude Code можно поставить плагин целиком.

Как включить

  1. Скачайте архив и распакуйте его.
  2. Положите папку verify в ~/.claude/skills/.
  3. Откройте 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.