Files
agency-agents/scripts/test-install-continue-after-failure.sh
T
hotragn ec4ff9fed4 fix(install): one failing tool no longer stops the tools after it
A sequential install called install_tool bare under set -e, so the first
tool that returned 1 exited the whole script. With copilot, cursor, qwen,
codex and hermes detected and no integrations/cursor:

  [1/5] copilot   [OK]
  [2/5] cursor    [ERR] integrations/cursor missing. Run convert.sh first.
  (exit 1)

qwen, codex and hermes were never attempted, and nothing said so. The same
happens for any ensure_converted failure or an OpenClaw registration error.

Each tool now runs in a subshell with errexit on. It is not
`install_tool "$t" || failed+=(...)`: bash ignores errexit for everything on
the left of ||, subshells included, so a failing cp inside a tool would carry
on as if it had worked. Instead the parent turns errexit off for that one
command, and the subshell turns it back on for itself.

A failed tool is recorded and the loop moves on. The done box reads
"Installed 2 of 3 tool(s)" instead of "Done!", and the run ends with
"Failed: cursor — see the [ERR] line under each above" and exit 1. A clean
install is unchanged. Nothing in install_* sets globals the parent reads
afterwards, and the SKIPPED_LOG cleanup trap does not fire in a ( )
subshell, so running tools in a subshell loses nothing.

Parallel mode is untouched; its log replay on failure is item 1 of #917.

test-install-continue-after-failure.sh builds a fixture repo with
gemini-cli and qwen output and no cursor output, installs all three, and
checks that qwen still installs, cursor's error is shown, the summary names
cursor, and the exit is non-zero. It also checks that a clean run still
exits 0. It fails on main at "qwen ... was never installed" and runs in
check-tools.yml.
2026-09-30 04:49:05 -04:00

61 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# One tool failing in a sequential install must not cost the tools after it,
# and the install must still exit non-zero and name the tool that failed.
#
# Before: install_tool ran bare under set -e, so the first tool whose output
# was missing exited the script. With gemini-cli, cursor and qwen selected and
# no integrations/cursor, gemini-cli installed, cursor printed its [ERR], and
# qwen was never attempted and never mentioned.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
tmp="$(mktemp -d "${TMPDIR:-/tmp}/agency-continue.XXXXXX")"
trap 'rm -rf "$tmp"' EXIT
fail() { echo "FAIL: $*" >&2; sed 's/^/ /' "$tmp/output" >&2; exit 1; }
mkdir -p "$tmp/repo/scripts" "$tmp/repo/engineering" \
"$tmp/repo/integrations/gemini-cli/agents" "$tmp/repo/integrations/qwen/agents" \
"$tmp/home/project"
cp "$SCRIPT_DIR/install.sh" "$SCRIPT_DIR/lib.sh" "$tmp/repo/scripts/"
cat > "$tmp/repo/divisions.json" <<'EOF'
{
"divisions": {
"engineering": {}
}
}
EOF
cat > "$tmp/repo/engineering/agent.md" <<'EOF'
---
name: Sample Agent
description: Example agent
---
Instructions.
EOF
printf 'Gemini output\n' > "$tmp/repo/integrations/gemini-cli/agents/sample-agent.md"
printf 'Qwen output\n' > "$tmp/repo/integrations/qwen/agents/sample-agent.md"
# integrations/cursor is deliberately absent: cursor is the tool that fails.
status=0
(cd "$tmp/home/project" && HOME="$tmp/home" PATH=/usr/bin:/bin \
bash "$tmp/repo/scripts/install.sh" --no-interactive --no-convert \
--tool gemini-cli,cursor,qwen > "$tmp/output" 2>&1) || status=$?
[[ "$status" -ne 0 ]] || fail "install exited 0 although cursor failed"
[[ -f "$tmp/home/.gemini/agents/sample-agent.md" ]] || fail "gemini-cli, before the failure, did not install"
[[ -f "$tmp/home/project/.qwen/agents/sample-agent.md" ]] \
|| fail "qwen, after the failing cursor, was never installed"
grep -q 'integrations/cursor missing' "$tmp/output" || fail "cursor's own error was not shown"
grep -q 'Failed: cursor' "$tmp/output" || fail "the summary does not name the failed tool"
grep -q 'Installed 2 of 3 tool(s)' "$tmp/output" || fail "the summary does not count the tools that installed"
echo "PASS: a failing tool is reported and the tools after it still install"
# The clean path is unchanged: every tool installs and the install exits 0.
mkdir -p "$tmp/repo/integrations/cursor/rules" "$tmp/home2/project"
printf -- '---\ndescription: x\n---\nCursor output\n' > "$tmp/repo/integrations/cursor/rules/sample-agent.mdc"
(cd "$tmp/home2/project" && HOME="$tmp/home2" PATH=/usr/bin:/bin \
bash "$tmp/repo/scripts/install.sh" --no-interactive --no-convert \
--tool gemini-cli,cursor,qwen > "$tmp/output" 2>&1) || fail "a clean install exited non-zero"
grep -q 'Done! Installed 3 tool(s)' "$tmp/output" || fail "a clean install did not report all three tools"
echo "PASS: a clean multi-tool install still exits 0"