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.
Files changed (135) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +13 -0
  3. package/.codex/INSTALL.md +67 -0
  4. package/.cursor-plugin/plugin.json +18 -0
  5. package/.gitattributes +18 -0
  6. package/.github/FUNDING.yml +3 -0
  7. package/.github/ISSUE_TEMPLATE/bug_report.md +52 -0
  8. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  9. package/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
  10. package/.github/ISSUE_TEMPLATE/platform_support.md +23 -0
  11. package/.github/PULL_REQUEST_TEMPLATE.md +87 -0
  12. package/.opencode/INSTALL.md +83 -0
  13. package/.opencode/plugins/superpowers.js +107 -0
  14. package/CHANGELOG.md +13 -0
  15. package/CODE_OF_CONDUCT.md +128 -0
  16. package/GEMINI.md +2 -0
  17. package/LICENSE +21 -0
  18. package/README.md +187 -0
  19. package/RELEASE-NOTES.md +1057 -0
  20. package/agents/code-reviewer.md +48 -0
  21. package/commands/brainstorm.md +5 -0
  22. package/commands/execute-plan.md +5 -0
  23. package/commands/write-plan.md +5 -0
  24. package/docs/README.codex.md +126 -0
  25. package/docs/README.opencode.md +130 -0
  26. package/docs/plans/2025-11-22-opencode-support-design.md +294 -0
  27. package/docs/plans/2025-11-22-opencode-support-implementation.md +1095 -0
  28. package/docs/plans/2025-11-28-skills-improvements-from-user-feedback.md +711 -0
  29. package/docs/plans/2026-01-17-visual-brainstorming.md +571 -0
  30. package/docs/superpowers/plans/2026-01-22-document-review-system.md +301 -0
  31. package/docs/superpowers/plans/2026-02-19-visual-brainstorming-refactor.md +523 -0
  32. package/docs/superpowers/plans/2026-03-11-zero-dep-brainstorm-server.md +479 -0
  33. package/docs/superpowers/specs/2026-01-22-document-review-system-design.md +136 -0
  34. package/docs/superpowers/specs/2026-02-19-visual-brainstorming-refactor-design.md +162 -0
  35. package/docs/superpowers/specs/2026-03-11-zero-dep-brainstorm-server-design.md +118 -0
  36. package/docs/testing.md +303 -0
  37. package/docs/windows/polyglot-hooks.md +212 -0
  38. package/gemini-extension.json +6 -0
  39. package/hooks/hooks-cursor.json +10 -0
  40. package/hooks/hooks.json +16 -0
  41. package/hooks/run-hook.cmd +46 -0
  42. package/hooks/session-start +57 -0
  43. package/package.json +5 -0
  44. package/skills/brainstorming/SKILL.md +164 -0
  45. package/skills/brainstorming/scripts/frame-template.html +214 -0
  46. package/skills/brainstorming/scripts/helper.js +88 -0
  47. package/skills/brainstorming/scripts/server.cjs +338 -0
  48. package/skills/brainstorming/scripts/start-server.sh +153 -0
  49. package/skills/brainstorming/scripts/stop-server.sh +55 -0
  50. package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  51. package/skills/brainstorming/visual-companion.md +286 -0
  52. package/skills/dispatching-parallel-agents/SKILL.md +182 -0
  53. package/skills/executing-plans/SKILL.md +70 -0
  54. package/skills/finishing-a-development-branch/SKILL.md +200 -0
  55. package/skills/receiving-code-review/SKILL.md +213 -0
  56. package/skills/requesting-code-review/SKILL.md +105 -0
  57. package/skills/requesting-code-review/code-reviewer.md +146 -0
  58. package/skills/subagent-driven-development/SKILL.md +277 -0
  59. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  60. package/skills/subagent-driven-development/implementer-prompt.md +113 -0
  61. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  62. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  63. package/skills/systematic-debugging/SKILL.md +296 -0
  64. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  65. package/skills/systematic-debugging/condition-based-waiting.md +115 -0
  66. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  67. package/skills/systematic-debugging/find-polluter.sh +63 -0
  68. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  69. package/skills/systematic-debugging/test-academic.md +14 -0
  70. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  71. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  72. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  73. package/skills/test-driven-development/SKILL.md +371 -0
  74. package/skills/test-driven-development/testing-anti-patterns.md +299 -0
  75. package/skills/using-git-worktrees/SKILL.md +218 -0
  76. package/skills/using-superpowers/SKILL.md +115 -0
  77. package/skills/using-superpowers/references/codex-tools.md +25 -0
  78. package/skills/using-superpowers/references/gemini-tools.md +33 -0
  79. package/skills/verification-before-completion/SKILL.md +139 -0
  80. package/skills/writing-plans/SKILL.md +145 -0
  81. package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  82. package/skills/writing-skills/SKILL.md +655 -0
  83. package/skills/writing-skills/anthropic-best-practices.md +1150 -0
  84. package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  85. package/skills/writing-skills/graphviz-conventions.dot +172 -0
  86. package/skills/writing-skills/persuasion-principles.md +187 -0
  87. package/skills/writing-skills/render-graphs.js +168 -0
  88. package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
  89. package/tests/brainstorm-server/package-lock.json +36 -0
  90. package/tests/brainstorm-server/package.json +10 -0
  91. package/tests/brainstorm-server/server.test.js +424 -0
  92. package/tests/brainstorm-server/windows-lifecycle.test.sh +351 -0
  93. package/tests/brainstorm-server/ws-protocol.test.js +392 -0
  94. package/tests/claude-code/README.md +158 -0
  95. package/tests/claude-code/analyze-token-usage.py +168 -0
  96. package/tests/claude-code/run-skill-tests.sh +187 -0
  97. package/tests/claude-code/test-document-review-system.sh +177 -0
  98. package/tests/claude-code/test-helpers.sh +202 -0
  99. package/tests/claude-code/test-subagent-driven-development-integration.sh +314 -0
  100. package/tests/claude-code/test-subagent-driven-development.sh +165 -0
  101. package/tests/explicit-skill-requests/prompts/action-oriented.txt +3 -0
  102. package/tests/explicit-skill-requests/prompts/after-planning-flow.txt +17 -0
  103. package/tests/explicit-skill-requests/prompts/claude-suggested-it.txt +11 -0
  104. package/tests/explicit-skill-requests/prompts/i-know-what-sdd-means.txt +8 -0
  105. package/tests/explicit-skill-requests/prompts/mid-conversation-execute-plan.txt +3 -0
  106. package/tests/explicit-skill-requests/prompts/please-use-brainstorming.txt +1 -0
  107. package/tests/explicit-skill-requests/prompts/skip-formalities.txt +3 -0
  108. package/tests/explicit-skill-requests/prompts/subagent-driven-development-please.txt +1 -0
  109. package/tests/explicit-skill-requests/prompts/use-systematic-debugging.txt +1 -0
  110. package/tests/explicit-skill-requests/run-all.sh +70 -0
  111. package/tests/explicit-skill-requests/run-claude-describes-sdd.sh +100 -0
  112. package/tests/explicit-skill-requests/run-extended-multiturn-test.sh +113 -0
  113. package/tests/explicit-skill-requests/run-haiku-test.sh +144 -0
  114. package/tests/explicit-skill-requests/run-multiturn-test.sh +143 -0
  115. package/tests/explicit-skill-requests/run-test.sh +136 -0
  116. package/tests/opencode/run-tests.sh +163 -0
  117. package/tests/opencode/setup.sh +73 -0
  118. package/tests/opencode/test-plugin-loading.sh +72 -0
  119. package/tests/opencode/test-priority.sh +198 -0
  120. package/tests/opencode/test-tools.sh +104 -0
  121. package/tests/skill-triggering/prompts/dispatching-parallel-agents.txt +8 -0
  122. package/tests/skill-triggering/prompts/executing-plans.txt +1 -0
  123. package/tests/skill-triggering/prompts/requesting-code-review.txt +3 -0
  124. package/tests/skill-triggering/prompts/systematic-debugging.txt +11 -0
  125. package/tests/skill-triggering/prompts/test-driven-development.txt +7 -0
  126. package/tests/skill-triggering/prompts/writing-plans.txt +10 -0
  127. package/tests/skill-triggering/run-all.sh +60 -0
  128. package/tests/skill-triggering/run-test.sh +88 -0
  129. package/tests/subagent-driven-dev/go-fractals/design.md +81 -0
  130. package/tests/subagent-driven-dev/go-fractals/plan.md +172 -0
  131. package/tests/subagent-driven-dev/go-fractals/scaffold.sh +45 -0
  132. package/tests/subagent-driven-dev/run-test.sh +106 -0
  133. package/tests/subagent-driven-dev/svelte-todo/design.md +70 -0
  134. package/tests/subagent-driven-dev/svelte-todo/plan.md +222 -0
  135. 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