scripts/butler-extension-verify.sh
Rama main · réplica de lectura del repositorio original.
#!/usr/bin/env bash
# Extension Verify (L1): manifest secrets + golden MCP calls.
#
# Usage:
# bash scripts/butler-extension-verify.sh # all manifests
# bash scripts/butler-extension-verify.sh github-readonly
# bash scripts/butler-extension-verify.sh ext-4 --no-golden
#
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
export PYTHONPATH="$ROOT"
# shellcheck source=scripts/lib/butler-source-env.sh
source "$ROOT/scripts/lib/butler-source-env.sh"
butler_source_env "$ROOT/.env" 2>/dev/null || true
EXT_ID=""
NO_GOLDEN=0
for arg in "$@"; do
case "$arg" in
--no-golden) NO_GOLDEN=1 ;;
*)
if [[ -z "$EXT_ID" ]]; then
EXT_ID="$arg"
fi
;;
esac
done
RUN_GOLDEN=1
if [[ "$NO_GOLDEN" -eq 1 ]]; then
RUN_GOLDEN=0
fi
python3 - "$EXT_ID" "$RUN_GOLDEN" <<'PY'
import sys
from butler.mcp.extension_verify import (
verify_all_extensions,
verify_extension,
write_verify_cache,
)
ext_id = str(sys.argv[1] or "").strip()
run_golden = sys.argv[2] == "1"
if ext_id:
report = verify_extension(ext_id, run_golden=run_golden)
write_verify_cache({report.ext_id: report})
reports = {report.ext_id: report}
else:
reports = verify_all_extensions(run_golden=run_golden)
fail = 0
for rid, report in sorted(reports.items()):
mark = "ok" if report.ok else "FAIL"
print(f"[{mark}] {rid} @ {report.at}")
for err in report.errors:
print(f" error: {err}")
for warn in report.warnings:
print(f" warn: {warn}")
for case in report.cases:
cmark = "ok" if case.ok else ("skip" if case.skipped else "fail")
print(f" case {case.tool}: {cmark} — {case.detail}")
if not report.ok:
fail += 1
if fail:
sys.exit(1)
PY