claude-mpm 5.4.59__py3-none-any.whl → 5.4.62__py3-none-any.whl

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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (128) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +5 -0
  3. claude_mpm/scripts/start_activity_logging.py +0 -0
  4. claude_mpm/services/agents/deployment/agent_template_builder.py +8 -0
  5. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  6. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  7. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  8. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  9. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  10. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  11. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  12. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  13. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  14. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  15. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  16. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  17. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  18. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  19. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  20. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  21. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  22. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  23. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  24. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  25. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  26. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  27. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  28. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  29. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  30. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  31. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  32. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  33. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  34. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  35. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  36. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  37. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  38. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  39. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  40. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  41. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  42. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  43. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  44. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  45. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  46. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  47. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  48. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  49. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  50. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  51. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  52. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  53. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  54. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  55. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  56. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  57. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  58. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  59. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  60. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  61. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  62. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  63. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  64. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  65. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  66. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  67. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  68. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  69. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  70. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  71. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  72. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  73. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  74. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  75. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  76. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  77. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  78. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  79. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  80. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  81. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  82. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  83. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  84. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  85. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  86. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  87. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  88. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  89. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  90. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  91. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  92. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  93. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  94. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  95. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  96. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  97. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  98. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  99. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  100. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  101. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  102. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  103. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  104. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  105. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  106. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  107. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  108. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  109. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  110. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  111. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  112. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  113. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  114. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  115. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  116. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  117. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  118. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  119. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  120. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  121. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  122. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.62.dist-info}/METADATA +1 -1
  123. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.62.dist-info}/RECORD +127 -10
  124. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.62.dist-info}/WHEEL +0 -0
  125. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.62.dist-info}/entry_points.txt +0 -0
  126. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.62.dist-info}/licenses/LICENSE +0 -0
  127. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.62.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  128. {claude_mpm-5.4.59.dist-info → claude_mpm-5.4.62.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,687 @@
1
+ # Reconnaissance-Then-Action Pattern
2
+
3
+ Complete guide to the reconnaissance-before-action philosophy for webapp testing.
4
+
5
+ ## Table of Contents
6
+
7
+ - [The Philosophy](#the-philosophy)
8
+ - [Why Reconnaissance First](#why-reconnaissance-first)
9
+ - [The Reconnaissance Process](#the-reconnaissance-process)
10
+ - [Server Status Checks](#server-status-checks)
11
+ - [Network Diagnostics](#network-diagnostics)
12
+ - [DOM Inspection](#dom-inspection)
13
+ - [Log Analysis](#log-analysis)
14
+ - [Performance Reconnaissance](#performance-reconnaissance)
15
+ - [Security Reconnaissance](#security-reconnaissance)
16
+ - [Reconnaissance Checklist](#reconnaissance-checklist)
17
+ - [Common Failures](#common-failures)
18
+
19
+ ## The Philosophy
20
+
21
+ **Reconnaissance-Then-Action** is the core principle of webapp testing:
22
+
23
+ 1. **Observe** the current state before acting
24
+ 2. **Understand** what you're working with
25
+ 3. **Plan** your actions based on reconnaissance
26
+ 4. **Execute** with confidence
27
+ 5. **Verify** the results completely
28
+
29
+ **The Iron Law:**
30
+ > Never test a webapp without first verifying the server state and waiting for the page to be fully loaded.
31
+
32
+ **Why this matters:**
33
+ - Tests fail mysteriously when servers aren't ready
34
+ - Actions fail when pages haven't finished loading
35
+ - Selectors break when DOM is still being built
36
+ - Network requests fail when services aren't available
37
+ - Time is wasted debugging problems that don't exist
38
+
39
+ ## Why Reconnaissance First
40
+
41
+ ### The Cost of Skipping Reconnaissance
42
+
43
+ **Without reconnaissance:**
44
+ ```python
45
+ # ❌ BAD: Jump straight to testing
46
+ page.goto('http://localhost:3000')
47
+ page.click('button.submit') # Fails - element not ready
48
+ # Error: Timeout 30000ms exceeded
49
+ ```
50
+
51
+ **With reconnaissance:**
52
+ ```python
53
+ # ✅ GOOD: Check state first
54
+ page.goto('http://localhost:3000')
55
+ page.wait_for_load_state('networkidle') # Wait for page ready
56
+ page.screenshot(path='/tmp/before.png') # Verify what we see
57
+ page.click('button.submit') # Succeeds - page is ready
58
+ ```
59
+
60
+ ### Real-World Benefits
61
+
62
+ **Time saved:**
63
+ - 5 seconds of reconnaissance saves 30 minutes of debugging
64
+ - One screenshot reveals problems that take hours to diagnose
65
+ - Server check prevents entire test suite failures
66
+
67
+ **Confidence gained:**
68
+ - Know exactly what state the system is in
69
+ - Understand why tests pass or fail
70
+ - Debug issues 10x faster with visual evidence
71
+
72
+ **Reliability improved:**
73
+ - Tests pass consistently
74
+ - Fewer false negatives
75
+ - Clear failure messages when problems occur
76
+
77
+ ## The Reconnaissance Process
78
+
79
+ ### Step 1: Verify Server State
80
+
81
+ **Check if server is running:**
82
+ ```bash
83
+ # Using lsof (most reliable)
84
+ lsof -i :3000 -sTCP:LISTEN
85
+
86
+ # Using curl (checks HTTP response)
87
+ curl -f http://localhost:3000/health
88
+ ```
89
+
90
+ **What to look for:**
91
+ - Is the port listening?
92
+ - Is the process alive?
93
+ - Does it respond to HTTP requests?
94
+ - What's the response time?
95
+
96
+ **Example output analysis:**
97
+ ```bash
98
+ $ lsof -i :3000 -sTCP:LISTEN
99
+ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
100
+ node 12345 user 20u IPv4 0x1234 0t0 TCP *:3000 (LISTEN)
101
+
102
+ # Good signs:
103
+ # ✅ Process is running (PID 12345)
104
+ # ✅ Listening on correct port (3000)
105
+ # ✅ Protocol is TCP
106
+ # ✅ State is LISTEN
107
+ ```
108
+
109
+ ### Step 2: Navigate and Wait
110
+
111
+ **Always wait for network idle on dynamic apps:**
112
+ ```python
113
+ page.goto('http://localhost:3000')
114
+ page.wait_for_load_state('networkidle') # CRITICAL
115
+ ```
116
+
117
+ **Why networkidle is essential:**
118
+ - JavaScript frameworks need time to initialize
119
+ - API calls must complete before DOM is ready
120
+ - Components may render multiple times
121
+ - Dynamic content loads asynchronously
122
+
123
+ **Wait hierarchy:**
124
+ 1. `domcontentloaded` - HTML parsed (too early for most apps)
125
+ 2. `load` - Resources loaded (images, CSS)
126
+ 3. `networkidle` - Network requests finished (best for testing)
127
+
128
+ ### Step 3: Visual Reconnaissance
129
+
130
+ **Take screenshots before acting:**
131
+ ```python
132
+ # Full page screenshot
133
+ page.screenshot(path='/tmp/reconnaissance.png', full_page=True)
134
+
135
+ # Element-specific screenshot
136
+ page.locator('.modal').screenshot(path='/tmp/modal.png')
137
+
138
+ # Custom viewport
139
+ page.set_viewport_size({'width': 1920, 'height': 1080})
140
+ page.screenshot(path='/tmp/desktop.png')
141
+ ```
142
+
143
+ **What screenshots reveal:**
144
+ - Is the page actually loaded?
145
+ - Are elements visible where expected?
146
+ - Is layout correct?
147
+ - Are there error messages?
148
+ - Is content what you expect?
149
+
150
+ ### Step 4: DOM Inspection
151
+
152
+ **Discover what's actually on the page:**
153
+ ```python
154
+ # Get full HTML
155
+ content = page.content()
156
+ print(content[:500]) # First 500 chars
157
+
158
+ # Find all buttons
159
+ buttons = page.locator('button').all()
160
+ print(f"Found {len(buttons)} buttons:")
161
+ for i, btn in enumerate(buttons):
162
+ text = btn.inner_text() if btn.is_visible() else "[hidden]"
163
+ print(f" [{i}] {text}")
164
+
165
+ # Find all links
166
+ links = page.locator('a[href]').all()
167
+ for link in links[:5]:
168
+ print(f" - {link.inner_text()} -> {link.get_attribute('href')}")
169
+
170
+ # Find all inputs
171
+ inputs = page.locator('input, textarea, select').all()
172
+ for inp in inputs:
173
+ name = inp.get_attribute('name') or inp.get_attribute('id') or "[unnamed]"
174
+ print(f" - {name}")
175
+ ```
176
+
177
+ **Example reconnaissance script:**
178
+ ```python
179
+ from playwright.sync_api import sync_playwright
180
+
181
+ def reconnaissance(url):
182
+ with sync_playwright() as p:
183
+ browser = p.chromium.launch(headless=True)
184
+ page = browser.new_page()
185
+
186
+ # Navigate and wait
187
+ page.goto(url)
188
+ page.wait_for_load_state('networkidle')
189
+
190
+ # Visual reconnaissance
191
+ page.screenshot(path='/tmp/recon.png', full_page=True)
192
+ print("Screenshot saved: /tmp/recon.png")
193
+
194
+ # Element reconnaissance
195
+ print("\nButtons:")
196
+ for i, btn in enumerate(page.locator('button').all()):
197
+ print(f" [{i}] {btn.inner_text()}")
198
+
199
+ print("\nLinks:")
200
+ for link in page.locator('a[href]').all()[:10]:
201
+ print(f" - {link.inner_text()}")
202
+
203
+ print("\nInputs:")
204
+ for inp in page.locator('input').all():
205
+ name = inp.get_attribute('name') or '[unnamed]'
206
+ print(f" - {name}")
207
+
208
+ browser.close()
209
+
210
+ reconnaissance('http://localhost:3000')
211
+ ```
212
+
213
+ ### Step 5: Console Log Reconnaissance
214
+
215
+ **Capture console output:**
216
+ ```python
217
+ console_logs = []
218
+
219
+ def handle_console(msg):
220
+ console_logs.append(f"[{msg.type}] {msg.text}")
221
+ print(f"Console: [{msg.type}] {msg.text}")
222
+
223
+ page.on("console", handle_console)
224
+ page.goto('http://localhost:3000')
225
+ page.wait_for_load_state('networkidle')
226
+
227
+ # Save logs
228
+ with open('/tmp/console.log', 'w') as f:
229
+ f.write('\n'.join(console_logs))
230
+ ```
231
+
232
+ **What console logs reveal:**
233
+ - JavaScript errors
234
+ - API failures
235
+ - Warning messages
236
+ - Debug output
237
+ - Performance timing
238
+
239
+ ## Server Status Checks
240
+
241
+ ### Using lsof (macOS/Linux)
242
+
243
+ **Basic check:**
244
+ ```bash
245
+ lsof -i :3000
246
+ ```
247
+
248
+ **Check if listening:**
249
+ ```bash
250
+ lsof -i :3000 -sTCP:LISTEN
251
+ ```
252
+
253
+ **Get just PID:**
254
+ ```bash
255
+ lsof -t -i :3000
256
+ ```
257
+
258
+ **Detailed output:**
259
+ ```bash
260
+ lsof -i :3000 -P -n
261
+ # -P: Don't resolve port names
262
+ # -n: Don't resolve hostnames
263
+ ```
264
+
265
+ ### Using ps (Process Status)
266
+
267
+ **Check if process is running:**
268
+ ```bash
269
+ ps aux | grep node
270
+ ps aux | grep python
271
+ ps aux | grep "npm.*start"
272
+ ```
273
+
274
+ **Check CPU and memory:**
275
+ ```bash
276
+ ps aux | grep 12345 # PID from lsof
277
+ ```
278
+
279
+ ### Using curl (HTTP Check)
280
+
281
+ **Basic health check:**
282
+ ```bash
283
+ curl http://localhost:3000
284
+ ```
285
+
286
+ **Check specific endpoint:**
287
+ ```bash
288
+ curl http://localhost:3000/health
289
+ ```
290
+
291
+ **Check with timeout:**
292
+ ```bash
293
+ curl --max-time 5 http://localhost:3000
294
+ ```
295
+
296
+ **Check and show response time:**
297
+ ```bash
298
+ curl -w "\nTime: %{time_total}s\n" http://localhost:3000
299
+ ```
300
+
301
+ **Silent success check:**
302
+ ```bash
303
+ if curl -f -s http://localhost:3000/health > /dev/null; then
304
+ echo "Server is healthy"
305
+ else
306
+ echo "Server is not responding"
307
+ fi
308
+ ```
309
+
310
+ ### Using netstat
311
+
312
+ **Check listening ports:**
313
+ ```bash
314
+ netstat -an | grep LISTEN | grep 3000
315
+ ```
316
+
317
+ **Show all TCP connections:**
318
+ ```bash
319
+ netstat -an | grep tcp
320
+ ```
321
+
322
+ ## Network Diagnostics
323
+
324
+ ### Using curl for Diagnostics
325
+
326
+ **Verbose output:**
327
+ ```bash
328
+ curl -v http://localhost:3000
329
+ ```
330
+
331
+ **Show response headers:**
332
+ ```bash
333
+ curl -I http://localhost:3000
334
+ ```
335
+
336
+ **Follow redirects:**
337
+ ```bash
338
+ curl -L http://localhost:3000
339
+ ```
340
+
341
+ **Save response:**
342
+ ```bash
343
+ curl -o response.html http://localhost:3000
344
+ ```
345
+
346
+ **Test POST request:**
347
+ ```bash
348
+ curl -X POST -H "Content-Type: application/json" \
349
+ -d '{"test":"data"}' \
350
+ http://localhost:3000/api/endpoint
351
+ ```
352
+
353
+ ### Network Timing
354
+
355
+ **Measure response time:**
356
+ ```bash
357
+ curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000
358
+ ```
359
+
360
+ **curl-format.txt:**
361
+ ```
362
+ time_namelookup: %{time_namelookup}s\n
363
+ time_connect: %{time_connect}s\n
364
+ time_appconnect: %{time_appconnect}s\n
365
+ time_pretransfer: %{time_pretransfer}s\n
366
+ time_redirect: %{time_redirect}s\n
367
+ time_starttransfer: %{time_starttransfer}s\n
368
+ ----------\n
369
+ time_total: %{time_total}s\n
370
+ ```
371
+
372
+ ### Using tcpdump (Advanced)
373
+
374
+ **Capture HTTP traffic:**
375
+ ```bash
376
+ sudo tcpdump -i lo0 -A -s 0 'tcp port 3000'
377
+ ```
378
+
379
+ **Save to file:**
380
+ ```bash
381
+ sudo tcpdump -i lo0 -w capture.pcap 'tcp port 3000'
382
+ ```
383
+
384
+ ## DOM Inspection
385
+
386
+ ### Element Discovery Pattern
387
+
388
+ **Find interactive elements:**
389
+ ```python
390
+ # Buttons
391
+ buttons = page.locator('button, input[type="button"], input[type="submit"]').all()
392
+
393
+ # Links
394
+ links = page.locator('a[href]').all()
395
+
396
+ # Form inputs
397
+ inputs = page.locator('input, textarea, select').all()
398
+
399
+ # Clickable elements
400
+ clickable = page.locator('[onclick], [role="button"]').all()
401
+ ```
402
+
403
+ ### Check Element State
404
+
405
+ **Visibility:**
406
+ ```python
407
+ element = page.locator('button.submit')
408
+ print(f"Visible: {element.is_visible()}")
409
+ print(f"Enabled: {element.is_enabled()}")
410
+ print(f"Editable: {element.is_editable()}")
411
+ ```
412
+
413
+ **Attributes:**
414
+ ```python
415
+ print(f"Text: {element.inner_text()}")
416
+ print(f"HTML: {element.inner_html()}")
417
+ print(f"Class: {element.get_attribute('class')}")
418
+ print(f"ID: {element.get_attribute('id')}")
419
+ ```
420
+
421
+ ### Find Selectors
422
+
423
+ **Test different selector strategies:**
424
+ ```python
425
+ # Try text selector
426
+ try:
427
+ page.locator('text=Submit').is_visible()
428
+ print("✅ Text selector works: 'text=Submit'")
429
+ except:
430
+ print("❌ Text selector failed")
431
+
432
+ # Try role selector
433
+ try:
434
+ page.locator('role=button[name="Submit"]').is_visible()
435
+ print("✅ Role selector works: 'role=button[name=\"Submit\"]'")
436
+ except:
437
+ print("❌ Role selector failed")
438
+
439
+ # Try CSS selector
440
+ try:
441
+ page.locator('button.submit').is_visible()
442
+ print("✅ CSS selector works: 'button.submit'")
443
+ except:
444
+ print("❌ CSS selector failed")
445
+ ```
446
+
447
+ ## Log Analysis
448
+
449
+ ### Server Logs
450
+
451
+ **Node.js console output:**
452
+ ```bash
453
+ npm start > server.log 2>&1 &
454
+ tail -f server.log
455
+ ```
456
+
457
+ **Look for:**
458
+ - Startup messages
459
+ - Port binding confirmation
460
+ - Error messages
461
+ - Warning messages
462
+ - Request logs
463
+
464
+ ### Application Logs
465
+
466
+ **Grep for errors:**
467
+ ```bash
468
+ grep -i error server.log
469
+ grep -i warning server.log
470
+ grep -i exception server.log
471
+ ```
472
+
473
+ **Filter by timestamp:**
474
+ ```bash
475
+ grep "2024-01-15 14:" server.log
476
+ ```
477
+
478
+ **Count errors:**
479
+ ```bash
480
+ grep -c "ERROR" server.log
481
+ ```
482
+
483
+ ## Performance Reconnaissance
484
+
485
+ ### Response Time Checks
486
+
487
+ **Measure with curl:**
488
+ ```bash
489
+ curl -w "Time: %{time_total}s\n" -o /dev/null -s http://localhost:3000
490
+ ```
491
+
492
+ **Measure with Playwright:**
493
+ ```python
494
+ import time
495
+
496
+ start = time.time()
497
+ page.goto('http://localhost:3000')
498
+ page.wait_for_load_state('networkidle')
499
+ elapsed = time.time() - start
500
+
501
+ print(f"Page load time: {elapsed:.2f}s")
502
+ ```
503
+
504
+ ### Resource Usage
505
+
506
+ **Check CPU and memory:**
507
+ ```bash
508
+ pid=$(lsof -t -i :3000)
509
+ ps -p $pid -o %cpu,%mem,rss,vsz
510
+ ```
511
+
512
+ **Monitor continuously:**
513
+ ```bash
514
+ watch -n 1 'ps -p $(lsof -t -i :3000) -o %cpu,%mem,rss'
515
+ ```
516
+
517
+ ## Security Reconnaissance
518
+
519
+ ### Port Scanning
520
+
521
+ **Check open ports:**
522
+ ```bash
523
+ nmap localhost
524
+ ```
525
+
526
+ **Specific port:**
527
+ ```bash
528
+ nmap -p 3000 localhost
529
+ ```
530
+
531
+ ### SSL/TLS Check
532
+
533
+ **Test HTTPS:**
534
+ ```bash
535
+ curl -k https://localhost:3000
536
+ ```
537
+
538
+ **Check certificate:**
539
+ ```bash
540
+ openssl s_client -connect localhost:3000
541
+ ```
542
+
543
+ ### Header Analysis
544
+
545
+ **Check security headers:**
546
+ ```bash
547
+ curl -I http://localhost:3000 | grep -i "security\|cors\|content-security"
548
+ ```
549
+
550
+ ## Reconnaissance Checklist
551
+
552
+ ### Pre-Test Checklist
553
+
554
+ - [ ] Server is running (lsof check)
555
+ - [ ] Port is accessible (curl check)
556
+ - [ ] Server responds to health check
557
+ - [ ] Response time is reasonable (< 2s)
558
+ - [ ] No errors in server logs
559
+ - [ ] Environment variables are set
560
+ - [ ] Dependencies are installed
561
+
562
+ ### During-Test Checklist
563
+
564
+ - [ ] Page navigation successful
565
+ - [ ] Waited for networkidle
566
+ - [ ] Screenshot captured
567
+ - [ ] Console logs captured
568
+ - [ ] Expected elements are visible
569
+ - [ ] No JavaScript errors
570
+ - [ ] Form fields are editable
571
+ - [ ] Buttons are clickable
572
+
573
+ ### Post-Action Checklist
574
+
575
+ - [ ] Action completed without errors
576
+ - [ ] Expected state change occurred
577
+ - [ ] No new console errors
578
+ - [ ] Screenshot shows expected result
579
+ - [ ] Server still responding
580
+ - [ ] No memory leaks (check server resources)
581
+
582
+ ## Common Failures
583
+
584
+ ### Failure: Server Not Running
585
+
586
+ **Symptoms:**
587
+ - Connection refused errors
588
+ - Timeout errors
589
+ - lsof returns no results
590
+
591
+ **Reconnaissance steps:**
592
+ ```bash
593
+ # Check if server is running
594
+ lsof -i :3000
595
+
596
+ # Check if process exists
597
+ ps aux | grep node
598
+
599
+ # Check server logs
600
+ cat server.log | tail -20
601
+ ```
602
+
603
+ **Solution:**
604
+ - Start server manually
605
+ - Use with_server.py script
606
+ - Check for port conflicts
607
+ - Review startup errors
608
+
609
+ ### Failure: Page Not Fully Loaded
610
+
611
+ **Symptoms:**
612
+ - Element not found errors
613
+ - Stale element errors
614
+ - Timeout waiting for selector
615
+
616
+ **Reconnaissance steps:**
617
+ ```python
618
+ # Take screenshot to see what's actually loaded
619
+ page.screenshot(path='/tmp/debug.png', full_page=True)
620
+
621
+ # Check network state
622
+ page.wait_for_load_state('networkidle')
623
+
624
+ # Check for loading indicators
625
+ loading = page.locator('.loading, .spinner').is_visible()
626
+ print(f"Still loading: {loading}")
627
+ ```
628
+
629
+ **Solution:**
630
+ - Always wait for networkidle
631
+ - Wait for specific elements
632
+ - Check for loading indicators
633
+ - Increase timeouts if needed
634
+
635
+ ### Failure: Wrong Element Selected
636
+
637
+ **Symptoms:**
638
+ - Action has no effect
639
+ - Wrong element is clicked
640
+ - Unexpected behavior
641
+
642
+ **Reconnaissance steps:**
643
+ ```python
644
+ # Find all matching elements
645
+ elements = page.locator('button').all()
646
+ print(f"Found {len(elements)} buttons")
647
+ for i, el in enumerate(elements):
648
+ print(f"[{i}] {el.inner_text()}")
649
+
650
+ # Highlight element before clicking
651
+ page.locator('button.submit').evaluate('el => el.style.border = "3px solid red"')
652
+ page.screenshot(path='/tmp/highlighted.png')
653
+ ```
654
+
655
+ **Solution:**
656
+ - Use more specific selectors
657
+ - Use data-testid attributes
658
+ - Verify element before clicking
659
+ - Check element count
660
+
661
+ ### Failure: Network Request Failed
662
+
663
+ **Symptoms:**
664
+ - API errors in console
665
+ - Empty data
666
+ - Timeout errors
667
+
668
+ **Reconnaissance steps:**
669
+ ```python
670
+ # Monitor network requests
671
+ def handle_response(response):
672
+ print(f"Response: {response.url} - {response.status}")
673
+
674
+ page.on("response", handle_response)
675
+
676
+ # Wait for specific API call
677
+ with page.expect_response('**/api/data') as response_info:
678
+ page.click('button.load')
679
+ response = response_info.value
680
+ print(f"Status: {response.status}")
681
+ ```
682
+
683
+ **Solution:**
684
+ - Check API server is running
685
+ - Verify CORS configuration
686
+ - Check network timeouts
687
+ - Mock API responses if needed