workerssuper 5.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +13 -0
- package/.codex/INSTALL.md +67 -0
- package/.cursor-plugin/plugin.json +18 -0
- package/.gitattributes +18 -0
- package/.github/FUNDING.yml +3 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +52 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
- package/.github/ISSUE_TEMPLATE/platform_support.md +23 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +87 -0
- package/.opencode/INSTALL.md +83 -0
- package/.opencode/plugins/superpowers.js +107 -0
- package/CHANGELOG.md +13 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/GEMINI.md +2 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/RELEASE-NOTES.md +1057 -0
- package/agents/code-reviewer.md +48 -0
- package/commands/brainstorm.md +5 -0
- package/commands/execute-plan.md +5 -0
- package/commands/write-plan.md +5 -0
- package/docs/README.codex.md +126 -0
- package/docs/README.opencode.md +130 -0
- package/docs/plans/2025-11-22-opencode-support-design.md +294 -0
- package/docs/plans/2025-11-22-opencode-support-implementation.md +1095 -0
- package/docs/plans/2025-11-28-skills-improvements-from-user-feedback.md +711 -0
- package/docs/plans/2026-01-17-visual-brainstorming.md +571 -0
- package/docs/superpowers/plans/2026-01-22-document-review-system.md +301 -0
- package/docs/superpowers/plans/2026-02-19-visual-brainstorming-refactor.md +523 -0
- package/docs/superpowers/plans/2026-03-11-zero-dep-brainstorm-server.md +479 -0
- package/docs/superpowers/specs/2026-01-22-document-review-system-design.md +136 -0
- package/docs/superpowers/specs/2026-02-19-visual-brainstorming-refactor-design.md +162 -0
- package/docs/superpowers/specs/2026-03-11-zero-dep-brainstorm-server-design.md +118 -0
- package/docs/testing.md +303 -0
- package/docs/windows/polyglot-hooks.md +212 -0
- package/gemini-extension.json +6 -0
- package/hooks/hooks-cursor.json +10 -0
- package/hooks/hooks.json +16 -0
- package/hooks/run-hook.cmd +46 -0
- package/hooks/session-start +57 -0
- package/package.json +5 -0
- package/skills/brainstorming/SKILL.md +164 -0
- package/skills/brainstorming/scripts/frame-template.html +214 -0
- package/skills/brainstorming/scripts/helper.js +88 -0
- package/skills/brainstorming/scripts/server.cjs +338 -0
- package/skills/brainstorming/scripts/start-server.sh +153 -0
- package/skills/brainstorming/scripts/stop-server.sh +55 -0
- package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/brainstorming/visual-companion.md +286 -0
- package/skills/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/skills/receiving-code-review/SKILL.md +213 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +146 -0
- package/skills/subagent-driven-development/SKILL.md +277 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/skills/systematic-debugging/find-polluter.sh +63 -0
- package/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/skills/systematic-debugging/test-academic.md +14 -0
- package/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/skills/test-driven-development/SKILL.md +371 -0
- package/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/using-git-worktrees/SKILL.md +218 -0
- package/skills/using-superpowers/SKILL.md +115 -0
- package/skills/using-superpowers/references/codex-tools.md +25 -0
- package/skills/using-superpowers/references/gemini-tools.md +33 -0
- package/skills/verification-before-completion/SKILL.md +139 -0
- package/skills/writing-plans/SKILL.md +145 -0
- package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/writing-skills/SKILL.md +655 -0
- package/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/writing-skills/persuasion-principles.md +187 -0
- package/skills/writing-skills/render-graphs.js +168 -0
- package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/tests/brainstorm-server/package-lock.json +36 -0
- package/tests/brainstorm-server/package.json +10 -0
- package/tests/brainstorm-server/server.test.js +424 -0
- package/tests/brainstorm-server/windows-lifecycle.test.sh +351 -0
- package/tests/brainstorm-server/ws-protocol.test.js +392 -0
- package/tests/claude-code/README.md +158 -0
- package/tests/claude-code/analyze-token-usage.py +168 -0
- package/tests/claude-code/run-skill-tests.sh +187 -0
- package/tests/claude-code/test-document-review-system.sh +177 -0
- package/tests/claude-code/test-helpers.sh +202 -0
- package/tests/claude-code/test-subagent-driven-development-integration.sh +314 -0
- package/tests/claude-code/test-subagent-driven-development.sh +165 -0
- package/tests/explicit-skill-requests/prompts/action-oriented.txt +3 -0
- package/tests/explicit-skill-requests/prompts/after-planning-flow.txt +17 -0
- package/tests/explicit-skill-requests/prompts/claude-suggested-it.txt +11 -0
- package/tests/explicit-skill-requests/prompts/i-know-what-sdd-means.txt +8 -0
- package/tests/explicit-skill-requests/prompts/mid-conversation-execute-plan.txt +3 -0
- package/tests/explicit-skill-requests/prompts/please-use-brainstorming.txt +1 -0
- package/tests/explicit-skill-requests/prompts/skip-formalities.txt +3 -0
- package/tests/explicit-skill-requests/prompts/subagent-driven-development-please.txt +1 -0
- package/tests/explicit-skill-requests/prompts/use-systematic-debugging.txt +1 -0
- package/tests/explicit-skill-requests/run-all.sh +70 -0
- package/tests/explicit-skill-requests/run-claude-describes-sdd.sh +100 -0
- package/tests/explicit-skill-requests/run-extended-multiturn-test.sh +113 -0
- package/tests/explicit-skill-requests/run-haiku-test.sh +144 -0
- package/tests/explicit-skill-requests/run-multiturn-test.sh +143 -0
- package/tests/explicit-skill-requests/run-test.sh +136 -0
- package/tests/opencode/run-tests.sh +163 -0
- package/tests/opencode/setup.sh +73 -0
- package/tests/opencode/test-plugin-loading.sh +72 -0
- package/tests/opencode/test-priority.sh +198 -0
- package/tests/opencode/test-tools.sh +104 -0
- package/tests/skill-triggering/prompts/dispatching-parallel-agents.txt +8 -0
- package/tests/skill-triggering/prompts/executing-plans.txt +1 -0
- package/tests/skill-triggering/prompts/requesting-code-review.txt +3 -0
- package/tests/skill-triggering/prompts/systematic-debugging.txt +11 -0
- package/tests/skill-triggering/prompts/test-driven-development.txt +7 -0
- package/tests/skill-triggering/prompts/writing-plans.txt +10 -0
- package/tests/skill-triggering/run-all.sh +60 -0
- package/tests/skill-triggering/run-test.sh +88 -0
- package/tests/subagent-driven-dev/go-fractals/design.md +81 -0
- package/tests/subagent-driven-dev/go-fractals/plan.md +172 -0
- package/tests/subagent-driven-dev/go-fractals/scaffold.sh +45 -0
- package/tests/subagent-driven-dev/run-test.sh +106 -0
- package/tests/subagent-driven-dev/svelte-todo/design.md +70 -0
- package/tests/subagent-driven-dev/svelte-todo/plan.md +222 -0
- package/tests/subagent-driven-dev/svelte-todo/scaffold.sh +46 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Windows lifecycle tests for the brainstorm server.
|
|
3
|
+
#
|
|
4
|
+
# Verifies that the brainstorm server survives the 60-second lifecycle
|
|
5
|
+
# check on Windows, where OWNER_PID monitoring is disabled because the
|
|
6
|
+
# MSYS2 PID namespace is invisible to Node.js.
|
|
7
|
+
#
|
|
8
|
+
# Requirements:
|
|
9
|
+
# - Node.js in PATH
|
|
10
|
+
# - Run from the repository root, or set SUPERPOWERS_ROOT
|
|
11
|
+
# - On Windows: Git Bash (OSTYPE=msys*)
|
|
12
|
+
#
|
|
13
|
+
# Usage:
|
|
14
|
+
# bash tests/brainstorm-server/windows-lifecycle.test.sh
|
|
15
|
+
set -uo pipefail
|
|
16
|
+
|
|
17
|
+
# ========== Configuration ==========
|
|
18
|
+
|
|
19
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
20
|
+
REPO_ROOT="${SUPERPOWERS_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
|
|
21
|
+
START_SCRIPT="$REPO_ROOT/skills/brainstorming/scripts/start-server.sh"
|
|
22
|
+
STOP_SCRIPT="$REPO_ROOT/skills/brainstorming/scripts/stop-server.sh"
|
|
23
|
+
SERVER_JS="$REPO_ROOT/skills/brainstorming/scripts/server.js"
|
|
24
|
+
|
|
25
|
+
TEST_DIR="${TMPDIR:-/tmp}/brainstorm-win-test-$$"
|
|
26
|
+
|
|
27
|
+
passed=0
|
|
28
|
+
failed=0
|
|
29
|
+
skipped=0
|
|
30
|
+
|
|
31
|
+
# ========== Helpers ==========
|
|
32
|
+
|
|
33
|
+
cleanup() {
|
|
34
|
+
# Kill any server processes we started
|
|
35
|
+
for pidvar in SERVER_PID CONTROL_PID STOP_TEST_PID; do
|
|
36
|
+
pid="${!pidvar:-}"
|
|
37
|
+
if [[ -n "$pid" ]]; then
|
|
38
|
+
kill "$pid" 2>/dev/null || true
|
|
39
|
+
wait "$pid" 2>/dev/null || true
|
|
40
|
+
fi
|
|
41
|
+
done
|
|
42
|
+
if [[ -n "${TEST_DIR:-}" && -d "$TEST_DIR" ]]; then
|
|
43
|
+
rm -rf "$TEST_DIR"
|
|
44
|
+
fi
|
|
45
|
+
}
|
|
46
|
+
trap cleanup EXIT
|
|
47
|
+
|
|
48
|
+
pass() {
|
|
49
|
+
echo " PASS: $1"
|
|
50
|
+
passed=$((passed + 1))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
fail() {
|
|
54
|
+
echo " FAIL: $1"
|
|
55
|
+
echo " $2"
|
|
56
|
+
failed=$((failed + 1))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
skip() {
|
|
60
|
+
echo " SKIP: $1 ($2)"
|
|
61
|
+
skipped=$((skipped + 1))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
wait_for_server_info() {
|
|
65
|
+
local dir="$1"
|
|
66
|
+
for _ in $(seq 1 50); do
|
|
67
|
+
if [[ -f "$dir/.server-info" ]]; then
|
|
68
|
+
return 0
|
|
69
|
+
fi
|
|
70
|
+
sleep 0.1
|
|
71
|
+
done
|
|
72
|
+
return 1
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get_port_from_info() {
|
|
76
|
+
# Read the port from .server-info. Use grep/sed instead of Node.js
|
|
77
|
+
# to avoid MSYS2-to-Windows path translation issues.
|
|
78
|
+
grep -o '"port":[0-9]*' "$1/.server-info" | head -1 | sed 's/"port"://'
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
http_check() {
|
|
82
|
+
local port="$1"
|
|
83
|
+
node -e "
|
|
84
|
+
const http = require('http');
|
|
85
|
+
http.get('http://localhost:$port/', (res) => {
|
|
86
|
+
process.exit(res.statusCode === 200 ? 0 : 1);
|
|
87
|
+
}).on('error', () => process.exit(1));
|
|
88
|
+
" 2>/dev/null
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# ========== Platform Detection ==========
|
|
92
|
+
|
|
93
|
+
echo ""
|
|
94
|
+
echo "=== Brainstorm Server Windows Lifecycle Tests ==="
|
|
95
|
+
echo "Platform: ${OSTYPE:-unknown}"
|
|
96
|
+
echo "MSYSTEM: ${MSYSTEM:-unset}"
|
|
97
|
+
echo "Node: $(node --version 2>/dev/null || echo 'not found')"
|
|
98
|
+
echo ""
|
|
99
|
+
|
|
100
|
+
is_windows="false"
|
|
101
|
+
case "${OSTYPE:-}" in
|
|
102
|
+
msys*|cygwin*|mingw*) is_windows="true" ;;
|
|
103
|
+
esac
|
|
104
|
+
if [[ -n "${MSYSTEM:-}" ]]; then
|
|
105
|
+
is_windows="true"
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
if [[ "$is_windows" != "true" ]]; then
|
|
109
|
+
echo "NOTE: Not running on Windows/MSYS2 (OSTYPE=${OSTYPE:-unset})."
|
|
110
|
+
echo "Windows-specific tests will be skipped. Tests 4-6 still run."
|
|
111
|
+
echo ""
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
mkdir -p "$TEST_DIR"
|
|
115
|
+
|
|
116
|
+
SERVER_PID=""
|
|
117
|
+
CONTROL_PID=""
|
|
118
|
+
STOP_TEST_PID=""
|
|
119
|
+
|
|
120
|
+
# ========== Test 1: OWNER_PID is empty on Windows ==========
|
|
121
|
+
|
|
122
|
+
echo "--- Owner PID Resolution ---"
|
|
123
|
+
|
|
124
|
+
if [[ "$is_windows" == "true" ]]; then
|
|
125
|
+
# Replicate the PID resolution logic from start-server.sh lines 104-112
|
|
126
|
+
TEST_OWNER_PID="$(ps -o ppid= -p "$PPID" 2>/dev/null | tr -d ' ' || true)"
|
|
127
|
+
if [[ -z "$TEST_OWNER_PID" || "$TEST_OWNER_PID" == "1" ]]; then
|
|
128
|
+
TEST_OWNER_PID="$PPID"
|
|
129
|
+
fi
|
|
130
|
+
# The fix: clear on Windows
|
|
131
|
+
case "${OSTYPE:-}" in
|
|
132
|
+
msys*|cygwin*|mingw*) TEST_OWNER_PID="" ;;
|
|
133
|
+
esac
|
|
134
|
+
|
|
135
|
+
if [[ -z "$TEST_OWNER_PID" ]]; then
|
|
136
|
+
pass "OWNER_PID is empty on Windows after fix"
|
|
137
|
+
else
|
|
138
|
+
fail "OWNER_PID is empty on Windows after fix" \
|
|
139
|
+
"Expected empty, got '$TEST_OWNER_PID'"
|
|
140
|
+
fi
|
|
141
|
+
else
|
|
142
|
+
skip "OWNER_PID is empty on Windows" "not on Windows"
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
# ========== Test 2: start-server.sh passes empty BRAINSTORM_OWNER_PID ==========
|
|
146
|
+
|
|
147
|
+
if [[ "$is_windows" == "true" ]]; then
|
|
148
|
+
# Use a fake 'node' that captures the env var and exits
|
|
149
|
+
FAKE_NODE_DIR="$TEST_DIR/fake-bin"
|
|
150
|
+
mkdir -p "$FAKE_NODE_DIR"
|
|
151
|
+
cat > "$FAKE_NODE_DIR/node" <<'FAKENODE'
|
|
152
|
+
#!/usr/bin/env bash
|
|
153
|
+
echo "CAPTURED_OWNER_PID=${BRAINSTORM_OWNER_PID:-__UNSET__}"
|
|
154
|
+
exit 0
|
|
155
|
+
FAKENODE
|
|
156
|
+
chmod +x "$FAKE_NODE_DIR/node"
|
|
157
|
+
|
|
158
|
+
captured=$(PATH="$FAKE_NODE_DIR:$PATH" bash "$START_SCRIPT" --project-dir "$TEST_DIR/session" --foreground 2>/dev/null || true)
|
|
159
|
+
owner_pid_value=$(echo "$captured" | grep "CAPTURED_OWNER_PID=" | head -1 | sed 's/CAPTURED_OWNER_PID=//')
|
|
160
|
+
|
|
161
|
+
if [[ "$owner_pid_value" == "" || "$owner_pid_value" == "__UNSET__" ]]; then
|
|
162
|
+
pass "start-server.sh passes empty BRAINSTORM_OWNER_PID on Windows"
|
|
163
|
+
else
|
|
164
|
+
fail "start-server.sh passes empty BRAINSTORM_OWNER_PID on Windows" \
|
|
165
|
+
"Expected empty or unset, got '$owner_pid_value'"
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
rm -rf "$FAKE_NODE_DIR" "$TEST_DIR/session"
|
|
169
|
+
else
|
|
170
|
+
skip "start-server.sh passes empty BRAINSTORM_OWNER_PID" "not on Windows"
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# ========== Test 3: Auto-foreground detection on Windows ==========
|
|
174
|
+
|
|
175
|
+
echo ""
|
|
176
|
+
echo "--- Foreground Mode Detection ---"
|
|
177
|
+
|
|
178
|
+
if [[ "$is_windows" == "true" ]]; then
|
|
179
|
+
FAKE_NODE_DIR="$TEST_DIR/fake-bin"
|
|
180
|
+
mkdir -p "$FAKE_NODE_DIR"
|
|
181
|
+
cat > "$FAKE_NODE_DIR/node" <<'FAKENODE'
|
|
182
|
+
#!/usr/bin/env bash
|
|
183
|
+
echo "FOREGROUND_MODE=true"
|
|
184
|
+
exit 0
|
|
185
|
+
FAKENODE
|
|
186
|
+
chmod +x "$FAKE_NODE_DIR/node"
|
|
187
|
+
|
|
188
|
+
# Run WITHOUT --foreground flag — Windows should auto-detect
|
|
189
|
+
captured=$(PATH="$FAKE_NODE_DIR:$PATH" bash "$START_SCRIPT" --project-dir "$TEST_DIR/session2" 2>/dev/null || true)
|
|
190
|
+
|
|
191
|
+
if echo "$captured" | grep -q "FOREGROUND_MODE=true"; then
|
|
192
|
+
pass "Windows auto-detects foreground mode"
|
|
193
|
+
else
|
|
194
|
+
fail "Windows auto-detects foreground mode" \
|
|
195
|
+
"Expected foreground code path, output: $captured"
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
rm -rf "$FAKE_NODE_DIR" "$TEST_DIR/session2"
|
|
199
|
+
else
|
|
200
|
+
skip "Windows auto-detects foreground mode" "not on Windows"
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
# ========== Test 4: Server survives past 60-second lifecycle check ==========
|
|
204
|
+
|
|
205
|
+
echo ""
|
|
206
|
+
echo "--- Server Survival (lifecycle check) ---"
|
|
207
|
+
|
|
208
|
+
mkdir -p "$TEST_DIR/survival"
|
|
209
|
+
|
|
210
|
+
echo " Starting server (will wait ~75s to verify survival past lifecycle check)..."
|
|
211
|
+
|
|
212
|
+
BRAINSTORM_DIR="$TEST_DIR/survival" \
|
|
213
|
+
BRAINSTORM_HOST="127.0.0.1" \
|
|
214
|
+
BRAINSTORM_URL_HOST="localhost" \
|
|
215
|
+
BRAINSTORM_OWNER_PID="" \
|
|
216
|
+
BRAINSTORM_PORT=$((49152 + RANDOM % 16383)) \
|
|
217
|
+
node "$SERVER_JS" > "$TEST_DIR/survival/.server.log" 2>&1 &
|
|
218
|
+
SERVER_PID=$!
|
|
219
|
+
|
|
220
|
+
if ! wait_for_server_info "$TEST_DIR/survival"; then
|
|
221
|
+
fail "Server starts successfully" "Server did not write .server-info within 5 seconds"
|
|
222
|
+
kill "$SERVER_PID" 2>/dev/null || true
|
|
223
|
+
SERVER_PID=""
|
|
224
|
+
else
|
|
225
|
+
pass "Server starts successfully with empty OWNER_PID"
|
|
226
|
+
|
|
227
|
+
SERVER_PORT=$(get_port_from_info "$TEST_DIR/survival")
|
|
228
|
+
|
|
229
|
+
sleep 75
|
|
230
|
+
|
|
231
|
+
if kill -0 "$SERVER_PID" 2>/dev/null; then
|
|
232
|
+
pass "Server is still alive after 75 seconds"
|
|
233
|
+
else
|
|
234
|
+
fail "Server is still alive after 75 seconds" \
|
|
235
|
+
"Server died. Log tail: $(tail -5 "$TEST_DIR/survival/.server.log" 2>/dev/null)"
|
|
236
|
+
fi
|
|
237
|
+
|
|
238
|
+
if http_check "$SERVER_PORT"; then
|
|
239
|
+
pass "Server responds to HTTP after lifecycle check window"
|
|
240
|
+
else
|
|
241
|
+
fail "Server responds to HTTP after lifecycle check window" \
|
|
242
|
+
"HTTP request to port $SERVER_PORT failed"
|
|
243
|
+
fi
|
|
244
|
+
|
|
245
|
+
if grep -q "owner process exited" "$TEST_DIR/survival/.server.log" 2>/dev/null; then
|
|
246
|
+
fail "No 'owner process exited' in logs" \
|
|
247
|
+
"Found spurious owner-exit shutdown in log"
|
|
248
|
+
else
|
|
249
|
+
pass "No 'owner process exited' in logs"
|
|
250
|
+
fi
|
|
251
|
+
|
|
252
|
+
kill "$SERVER_PID" 2>/dev/null || true
|
|
253
|
+
wait "$SERVER_PID" 2>/dev/null || true
|
|
254
|
+
SERVER_PID=""
|
|
255
|
+
fi
|
|
256
|
+
|
|
257
|
+
# ========== Test 5: Bad OWNER_PID causes shutdown (control) ==========
|
|
258
|
+
|
|
259
|
+
echo ""
|
|
260
|
+
echo "--- Control: Bad OWNER_PID causes shutdown ---"
|
|
261
|
+
|
|
262
|
+
mkdir -p "$TEST_DIR/control"
|
|
263
|
+
|
|
264
|
+
# Find a PID that does not exist
|
|
265
|
+
BAD_PID=99999
|
|
266
|
+
while kill -0 "$BAD_PID" 2>/dev/null; do
|
|
267
|
+
BAD_PID=$((BAD_PID + 1))
|
|
268
|
+
done
|
|
269
|
+
|
|
270
|
+
BRAINSTORM_DIR="$TEST_DIR/control" \
|
|
271
|
+
BRAINSTORM_HOST="127.0.0.1" \
|
|
272
|
+
BRAINSTORM_URL_HOST="localhost" \
|
|
273
|
+
BRAINSTORM_OWNER_PID="$BAD_PID" \
|
|
274
|
+
BRAINSTORM_PORT=$((49152 + RANDOM % 16383)) \
|
|
275
|
+
node "$SERVER_JS" > "$TEST_DIR/control/.server.log" 2>&1 &
|
|
276
|
+
CONTROL_PID=$!
|
|
277
|
+
|
|
278
|
+
if ! wait_for_server_info "$TEST_DIR/control"; then
|
|
279
|
+
fail "Control server starts" "Server did not write .server-info within 5 seconds"
|
|
280
|
+
kill "$CONTROL_PID" 2>/dev/null || true
|
|
281
|
+
CONTROL_PID=""
|
|
282
|
+
else
|
|
283
|
+
pass "Control server starts with bad OWNER_PID=$BAD_PID"
|
|
284
|
+
|
|
285
|
+
echo " Waiting ~75s for lifecycle check to kill server..."
|
|
286
|
+
sleep 75
|
|
287
|
+
|
|
288
|
+
if kill -0 "$CONTROL_PID" 2>/dev/null; then
|
|
289
|
+
fail "Control server self-terminates with bad OWNER_PID" \
|
|
290
|
+
"Server is still alive (expected it to die)"
|
|
291
|
+
kill "$CONTROL_PID" 2>/dev/null || true
|
|
292
|
+
else
|
|
293
|
+
pass "Control server self-terminates with bad OWNER_PID"
|
|
294
|
+
fi
|
|
295
|
+
|
|
296
|
+
if grep -q "owner process exited" "$TEST_DIR/control/.server.log" 2>/dev/null; then
|
|
297
|
+
pass "Control server logs 'owner process exited'"
|
|
298
|
+
else
|
|
299
|
+
fail "Control server logs 'owner process exited'" \
|
|
300
|
+
"Log tail: $(tail -5 "$TEST_DIR/control/.server.log" 2>/dev/null)"
|
|
301
|
+
fi
|
|
302
|
+
fi
|
|
303
|
+
|
|
304
|
+
wait "$CONTROL_PID" 2>/dev/null || true
|
|
305
|
+
CONTROL_PID=""
|
|
306
|
+
|
|
307
|
+
# ========== Test 6: stop-server.sh cleanly stops the server ==========
|
|
308
|
+
|
|
309
|
+
echo ""
|
|
310
|
+
echo "--- Clean Shutdown ---"
|
|
311
|
+
|
|
312
|
+
mkdir -p "$TEST_DIR/stop-test"
|
|
313
|
+
|
|
314
|
+
BRAINSTORM_DIR="$TEST_DIR/stop-test" \
|
|
315
|
+
BRAINSTORM_HOST="127.0.0.1" \
|
|
316
|
+
BRAINSTORM_URL_HOST="localhost" \
|
|
317
|
+
BRAINSTORM_OWNER_PID="" \
|
|
318
|
+
BRAINSTORM_PORT=$((49152 + RANDOM % 16383)) \
|
|
319
|
+
node "$SERVER_JS" > "$TEST_DIR/stop-test/.server.log" 2>&1 &
|
|
320
|
+
STOP_TEST_PID=$!
|
|
321
|
+
echo "$STOP_TEST_PID" > "$TEST_DIR/stop-test/.server.pid"
|
|
322
|
+
|
|
323
|
+
if ! wait_for_server_info "$TEST_DIR/stop-test"; then
|
|
324
|
+
fail "Stop-test server starts" "Server did not start"
|
|
325
|
+
kill "$STOP_TEST_PID" 2>/dev/null || true
|
|
326
|
+
STOP_TEST_PID=""
|
|
327
|
+
else
|
|
328
|
+
bash "$STOP_SCRIPT" "$TEST_DIR/stop-test" >/dev/null 2>&1 || true
|
|
329
|
+
sleep 1
|
|
330
|
+
|
|
331
|
+
if ! kill -0 "$STOP_TEST_PID" 2>/dev/null; then
|
|
332
|
+
pass "stop-server.sh cleanly stops the server"
|
|
333
|
+
else
|
|
334
|
+
fail "stop-server.sh cleanly stops the server" \
|
|
335
|
+
"Server PID $STOP_TEST_PID is still alive after stop"
|
|
336
|
+
kill "$STOP_TEST_PID" 2>/dev/null || true
|
|
337
|
+
fi
|
|
338
|
+
fi
|
|
339
|
+
|
|
340
|
+
wait "$STOP_TEST_PID" 2>/dev/null || true
|
|
341
|
+
STOP_TEST_PID=""
|
|
342
|
+
|
|
343
|
+
# ========== Summary ==========
|
|
344
|
+
|
|
345
|
+
echo ""
|
|
346
|
+
echo "=== Results: $passed passed, $failed failed, $skipped skipped ==="
|
|
347
|
+
|
|
348
|
+
if [[ $failed -gt 0 ]]; then
|
|
349
|
+
exit 1
|
|
350
|
+
fi
|
|
351
|
+
exit 0
|