claude-mpm 4.15.6__py3-none-any.whl → 4.21.0__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 (194) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_ENGINEER.md +286 -0
  3. claude_mpm/agents/BASE_PM.md +272 -23
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +49 -0
  5. claude_mpm/agents/agent_loader.py +4 -4
  6. claude_mpm/agents/templates/engineer.json +5 -1
  7. claude_mpm/agents/templates/php-engineer.json +10 -4
  8. claude_mpm/agents/templates/python_engineer.json +8 -3
  9. claude_mpm/agents/templates/rust_engineer.json +12 -7
  10. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  11. claude_mpm/cli/commands/__init__.py +2 -0
  12. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  13. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  14. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  15. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  16. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  17. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  18. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  19. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  20. claude_mpm/cli/commands/skills.py +488 -0
  21. claude_mpm/cli/executor.py +2 -0
  22. claude_mpm/cli/parsers/base_parser.py +7 -0
  23. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  24. claude_mpm/cli/parsers/skills_parser.py +137 -0
  25. claude_mpm/cli/startup.py +57 -0
  26. claude_mpm/commands/mpm-auto-configure.md +52 -0
  27. claude_mpm/commands/mpm-help.md +3 -0
  28. claude_mpm/commands/mpm-init.md +112 -6
  29. claude_mpm/commands/mpm-version.md +113 -0
  30. claude_mpm/commands/mpm.md +1 -0
  31. claude_mpm/config/agent_config.py +2 -2
  32. claude_mpm/constants.py +12 -0
  33. claude_mpm/core/config.py +42 -0
  34. claude_mpm/core/factories.py +1 -1
  35. claude_mpm/core/interfaces.py +56 -1
  36. claude_mpm/core/optimized_agent_loader.py +3 -3
  37. claude_mpm/hooks/__init__.py +8 -0
  38. claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
  39. claude_mpm/hooks/session_resume_hook.py +121 -0
  40. claude_mpm/models/resume_log.py +340 -0
  41. claude_mpm/services/agents/auto_config_manager.py +1 -1
  42. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  43. claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
  44. claude_mpm/services/agents/deployment/agent_validator.py +17 -1
  45. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  46. claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
  47. claude_mpm/services/agents/local_template_manager.py +1 -1
  48. claude_mpm/services/agents/recommender.py +47 -0
  49. claude_mpm/services/cli/resume_service.py +617 -0
  50. claude_mpm/services/cli/session_manager.py +87 -0
  51. claude_mpm/services/cli/session_pause_manager.py +504 -0
  52. claude_mpm/services/cli/session_resume_helper.py +372 -0
  53. claude_mpm/services/core/interfaces.py +56 -1
  54. claude_mpm/services/core/models/agent_config.py +3 -0
  55. claude_mpm/services/core/models/process.py +4 -0
  56. claude_mpm/services/core/path_resolver.py +1 -1
  57. claude_mpm/services/diagnostics/models.py +21 -0
  58. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  59. claude_mpm/services/local_ops/__init__.py +2 -0
  60. claude_mpm/services/mcp_config_manager.py +7 -131
  61. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  62. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  63. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  64. claude_mpm/services/session_manager.py +205 -1
  65. claude_mpm/services/unified/deployment_strategies/local.py +1 -1
  66. claude_mpm/services/version_service.py +104 -1
  67. claude_mpm/skills/__init__.py +21 -0
  68. claude_mpm/skills/agent_skills_injector.py +324 -0
  69. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  70. claude_mpm/skills/bundled/api-documentation.md +393 -0
  71. claude_mpm/skills/bundled/async-testing.md +571 -0
  72. claude_mpm/skills/bundled/code-review.md +143 -0
  73. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  74. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  75. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  76. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  77. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  78. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  79. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  80. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  81. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  82. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  83. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  84. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  85. claude_mpm/skills/bundled/database-migration.md +199 -0
  86. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  87. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  88. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  89. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  90. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  91. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  92. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  93. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  94. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  95. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  96. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  97. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  98. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  99. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  100. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  101. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  102. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  103. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  104. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  105. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  106. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  107. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  108. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  109. claude_mpm/skills/bundled/git-workflow.md +414 -0
  110. claude_mpm/skills/bundled/imagemagick.md +204 -0
  111. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  112. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  113. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  114. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  115. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  116. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  117. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  118. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  119. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  120. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  121. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  122. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  123. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  124. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  125. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  126. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  127. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  128. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  129. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  130. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  131. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  132. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  133. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  134. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  135. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  136. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  137. claude_mpm/skills/bundled/pdf.md +141 -0
  138. claude_mpm/skills/bundled/performance-profiling.md +567 -0
  139. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  140. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  141. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  142. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  143. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  144. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  145. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  146. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  147. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  148. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  149. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  150. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  151. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  152. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  153. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  154. claude_mpm/skills/bundled/security-scanning.md +327 -0
  155. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  156. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  157. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  158. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  159. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  160. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  161. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  162. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  163. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  164. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  165. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  166. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  167. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  168. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  169. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  170. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  171. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  172. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  173. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  174. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  175. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  176. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  177. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  178. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  179. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  180. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  181. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  182. claude_mpm/skills/bundled/xlsx.md +157 -0
  183. claude_mpm/skills/registry.py +97 -9
  184. claude_mpm/skills/skills_registry.py +348 -0
  185. claude_mpm/skills/skills_service.py +739 -0
  186. claude_mpm/utils/agent_dependency_loader.py +2 -2
  187. {claude_mpm-4.15.6.dist-info → claude_mpm-4.21.0.dist-info}/METADATA +211 -33
  188. {claude_mpm-4.15.6.dist-info → claude_mpm-4.21.0.dist-info}/RECORD +192 -60
  189. claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
  190. claude_mpm/cli/commands/mpm_init.py +0 -2008
  191. {claude_mpm-4.15.6.dist-info → claude_mpm-4.21.0.dist-info}/WHEEL +0 -0
  192. {claude_mpm-4.15.6.dist-info → claude_mpm-4.21.0.dist-info}/entry_points.txt +0 -0
  193. {claude_mpm-4.15.6.dist-info → claude_mpm-4.21.0.dist-info}/licenses/LICENSE +0 -0
  194. {claude_mpm-4.15.6.dist-info → claude_mpm-4.21.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,758 @@
1
+ # Server Management Reference
2
+
3
+ Complete guide to server lifecycle management, port management, and process control for webapp testing.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Server Lifecycle](#server-lifecycle)
8
+ - [Port Management](#port-management)
9
+ - [Process Management](#process-management)
10
+ - [Environment Configuration](#environment-configuration)
11
+ - [Health Checks](#health-checks)
12
+ - [Graceful Shutdown](#graceful-shutdown)
13
+ - [Multi-Server Configurations](#multi-server-configurations)
14
+ - [Troubleshooting](#troubleshooting)
15
+
16
+ ## Server Lifecycle
17
+
18
+ ### Using with_server.py Helper Script
19
+
20
+ The `with_server.py` script manages the complete server lifecycle:
21
+ - Starts server(s)
22
+ - Waits for server(s) to be ready
23
+ - Runs your automation script
24
+ - Cleans up server(s) automatically
25
+
26
+ **Always run with `--help` first:**
27
+ ```bash
28
+ python scripts/with_server.py --help
29
+ ```
30
+
31
+ ### Single Server Management
32
+
33
+ **Basic usage:**
34
+ ```bash
35
+ python scripts/with_server.py --server "npm run dev" --port 5173 -- python automation.py
36
+ ```
37
+
38
+ **With custom timeout:**
39
+ ```bash
40
+ python scripts/with_server.py --server "npm start" --port 3000 --timeout 60 -- python test.py
41
+ ```
42
+
43
+ **Django example:**
44
+ ```bash
45
+ python scripts/with_server.py --server "python manage.py runserver 8000" --port 8000 -- python test.py
46
+ ```
47
+
48
+ **Flask example:**
49
+ ```bash
50
+ python scripts/with_server.py --server "flask run --port 5000" --port 5000 -- python test.py
51
+ ```
52
+
53
+ **Node.js Express example:**
54
+ ```bash
55
+ python scripts/with_server.py --server "node server.js" --port 3000 -- python test.py
56
+ ```
57
+
58
+ ### Multiple Server Management
59
+
60
+ **Frontend + Backend:**
61
+ ```bash
62
+ python scripts/with_server.py \
63
+ --server "cd backend && python server.py" --port 3000 \
64
+ --server "cd frontend && npm run dev" --port 5173 \
65
+ -- python test.py
66
+ ```
67
+
68
+ **Microservices:**
69
+ ```bash
70
+ python scripts/with_server.py \
71
+ --server "cd auth-service && npm start" --port 3001 \
72
+ --server "cd api-service && npm start" --port 3002 \
73
+ --server "cd frontend && npm start" --port 3000 \
74
+ -- python test.py
75
+ ```
76
+
77
+ **Database + API + Frontend:**
78
+ ```bash
79
+ python scripts/with_server.py \
80
+ --server "docker-compose up db" --port 5432 \
81
+ --server "cd api && npm start" --port 4000 \
82
+ --server "cd web && npm start" --port 3000 \
83
+ -- python test.py
84
+ ```
85
+
86
+ ### Manual Server Management
87
+
88
+ When you need more control than `with_server.py` provides:
89
+
90
+ **Start server in background:**
91
+ ```bash
92
+ # Node.js
93
+ npm run dev > /tmp/server.log 2>&1 &
94
+ echo $! > /tmp/server.pid
95
+
96
+ # Python
97
+ python manage.py runserver > /tmp/server.log 2>&1 &
98
+ echo $! > /tmp/server.pid
99
+
100
+ # Flask
101
+ FLASK_APP=app.py flask run > /tmp/server.log 2>&1 &
102
+ echo $! > /tmp/server.pid
103
+ ```
104
+
105
+ **Check if server is ready:**
106
+ ```bash
107
+ # Using curl
108
+ curl -f http://localhost:3000/health
109
+ if [ $? -eq 0 ]; then echo "Server ready"; fi
110
+
111
+ # Using lsof
112
+ lsof -i :3000 -sTCP:LISTEN
113
+ ```
114
+
115
+ **Stop server:**
116
+ ```bash
117
+ # Using saved PID
118
+ kill $(cat /tmp/server.pid)
119
+
120
+ # Using port
121
+ lsof -t -i :3000 | xargs kill
122
+
123
+ # Force kill if not responding
124
+ lsof -t -i :3000 | xargs kill -9
125
+ ```
126
+
127
+ ## Port Management
128
+
129
+ ### Check Port Availability
130
+
131
+ **Using lsof (macOS/Linux):**
132
+ ```bash
133
+ # Check if port is in use
134
+ lsof -i :3000
135
+
136
+ # Check specific protocol
137
+ lsof -i TCP:3000
138
+ lsof -i UDP:3000
139
+
140
+ # List all listening ports
141
+ lsof -i -sTCP:LISTEN
142
+ ```
143
+
144
+ **Using netstat (cross-platform):**
145
+ ```bash
146
+ # Check specific port
147
+ netstat -an | grep :3000
148
+
149
+ # List all listening TCP ports
150
+ netstat -an | grep LISTEN
151
+ ```
152
+
153
+ **Using nc (netcat):**
154
+ ```bash
155
+ # Check if port is open
156
+ nc -zv localhost 3000
157
+
158
+ # Check range of ports
159
+ nc -zv localhost 3000-3010
160
+ ```
161
+
162
+ **Python check:**
163
+ ```python
164
+ import socket
165
+
166
+ def is_port_available(port):
167
+ try:
168
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
169
+ s.bind(('localhost', port))
170
+ return True
171
+ except OSError:
172
+ return False
173
+
174
+ print(f"Port 3000 available: {is_port_available(3000)}")
175
+ ```
176
+
177
+ ### Find Process Using Port
178
+
179
+ ```bash
180
+ # Get PID of process using port
181
+ lsof -t -i :3000
182
+
183
+ # Get detailed info
184
+ lsof -i :3000
185
+
186
+ # Output example:
187
+ # COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
188
+ # node 12345 user 20u IPv4 0x1234 0t0 TCP *:3000 (LISTEN)
189
+ ```
190
+
191
+ ### Kill Process on Port
192
+
193
+ ```bash
194
+ # Kill process (graceful)
195
+ lsof -t -i :3000 | xargs kill
196
+
197
+ # Force kill if not responding
198
+ lsof -t -i :3000 | xargs kill -9
199
+
200
+ # Alternative using port number
201
+ kill $(lsof -t -i :3000)
202
+ ```
203
+
204
+ ### Choose Alternative Port
205
+
206
+ **Check multiple ports:**
207
+ ```bash
208
+ for port in 3000 3001 3002 3003; do
209
+ if ! lsof -i :$port > /dev/null; then
210
+ echo "Port $port is available"
211
+ break
212
+ fi
213
+ done
214
+ ```
215
+
216
+ **Python find available port:**
217
+ ```python
218
+ import socket
219
+
220
+ def find_available_port(start=3000, end=3100):
221
+ for port in range(start, end):
222
+ try:
223
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
224
+ s.bind(('localhost', port))
225
+ return port
226
+ except OSError:
227
+ continue
228
+ return None
229
+
230
+ port = find_available_port()
231
+ print(f"Available port: {port}")
232
+ ```
233
+
234
+ ## Process Management
235
+
236
+ ### pm2 (Node.js Process Manager)
237
+
238
+ **Install pm2:**
239
+ ```bash
240
+ npm install -g pm2
241
+ ```
242
+
243
+ **Basic commands:**
244
+ ```bash
245
+ # Start server
246
+ pm2 start npm --name "my-app" -- start
247
+
248
+ # Start with environment
249
+ pm2 start npm --name "my-app" -- start --update-env
250
+
251
+ # List running processes
252
+ pm2 list
253
+
254
+ # Monitor processes
255
+ pm2 monit
256
+
257
+ # Show logs
258
+ pm2 logs my-app
259
+
260
+ # Stop process
261
+ pm2 stop my-app
262
+
263
+ # Restart process
264
+ pm2 restart my-app
265
+
266
+ # Delete process
267
+ pm2 delete my-app
268
+
269
+ # Stop all
270
+ pm2 stop all
271
+ ```
272
+
273
+ **Ecosystem file (pm2.config.js):**
274
+ ```javascript
275
+ module.exports = {
276
+ apps: [{
277
+ name: 'frontend',
278
+ script: 'npm',
279
+ args: 'start',
280
+ cwd: './frontend',
281
+ env: {
282
+ PORT: 3000,
283
+ NODE_ENV: 'development'
284
+ }
285
+ }, {
286
+ name: 'backend',
287
+ script: 'npm',
288
+ args: 'start',
289
+ cwd: './backend',
290
+ env: {
291
+ PORT: 4000,
292
+ NODE_ENV: 'development'
293
+ }
294
+ }]
295
+ }
296
+ ```
297
+
298
+ **Start from ecosystem:**
299
+ ```bash
300
+ pm2 start pm2.config.js
301
+ ```
302
+
303
+ ### systemd (Linux System Service)
304
+
305
+ **Create service file (/etc/systemd/system/myapp.service):**
306
+ ```ini
307
+ [Unit]
308
+ Description=My Web Application
309
+ After=network.target
310
+
311
+ [Service]
312
+ Type=simple
313
+ User=www-data
314
+ WorkingDirectory=/var/www/myapp
315
+ ExecStart=/usr/bin/node server.js
316
+ Restart=on-failure
317
+ Environment=NODE_ENV=production
318
+ Environment=PORT=3000
319
+
320
+ [Install]
321
+ WantedBy=multi-user.target
322
+ ```
323
+
324
+ **Service commands:**
325
+ ```bash
326
+ # Reload systemd
327
+ sudo systemctl daemon-reload
328
+
329
+ # Start service
330
+ sudo systemctl start myapp
331
+
332
+ # Stop service
333
+ sudo systemctl stop myapp
334
+
335
+ # Restart service
336
+ sudo systemctl restart myapp
337
+
338
+ # Enable on boot
339
+ sudo systemctl enable myapp
340
+
341
+ # Check status
342
+ sudo systemctl status myapp
343
+
344
+ # View logs
345
+ sudo journalctl -u myapp -f
346
+ ```
347
+
348
+ ### Docker Container Management
349
+
350
+ **Run server in container:**
351
+ ```bash
352
+ # Start container
353
+ docker run -d -p 3000:3000 --name myapp myapp:latest
354
+
355
+ # Check if container is running
356
+ docker ps | grep myapp
357
+
358
+ # Stop container
359
+ docker stop myapp
360
+
361
+ # Remove container
362
+ docker rm myapp
363
+
364
+ # View logs
365
+ docker logs -f myapp
366
+ ```
367
+
368
+ **Docker Compose:**
369
+ ```yaml
370
+ # docker-compose.yml
371
+ version: '3'
372
+ services:
373
+ frontend:
374
+ build: ./frontend
375
+ ports:
376
+ - "3000:3000"
377
+ environment:
378
+ - NODE_ENV=development
379
+
380
+ backend:
381
+ build: ./backend
382
+ ports:
383
+ - "4000:4000"
384
+ environment:
385
+ - NODE_ENV=development
386
+ ```
387
+
388
+ **Compose commands:**
389
+ ```bash
390
+ # Start all services
391
+ docker-compose up -d
392
+
393
+ # Stop all services
394
+ docker-compose down
395
+
396
+ # View logs
397
+ docker-compose logs -f
398
+
399
+ # Restart service
400
+ docker-compose restart frontend
401
+ ```
402
+
403
+ ## Environment Configuration
404
+
405
+ ### Environment Variables
406
+
407
+ **Setting environment variables:**
408
+ ```bash
409
+ # Linux/macOS
410
+ export PORT=3000
411
+ export NODE_ENV=development
412
+
413
+ # Windows (cmd)
414
+ set PORT=3000
415
+ set NODE_ENV=development
416
+
417
+ # Windows (PowerShell)
418
+ $env:PORT=3000
419
+ $env:NODE_ENV="development"
420
+ ```
421
+
422
+ **Using .env file:**
423
+ ```bash
424
+ # .env
425
+ PORT=3000
426
+ NODE_ENV=development
427
+ DATABASE_URL=postgresql://localhost/mydb
428
+ API_KEY=secret123
429
+ ```
430
+
431
+ **Load .env in Python:**
432
+ ```python
433
+ from dotenv import load_dotenv
434
+ import os
435
+
436
+ load_dotenv()
437
+ port = os.getenv('PORT', 3000)
438
+ ```
439
+
440
+ **Load .env in Node.js:**
441
+ ```javascript
442
+ require('dotenv').config();
443
+ const port = process.env.PORT || 3000;
444
+ ```
445
+
446
+ ### Configuration Files
447
+
448
+ **Package.json scripts:**
449
+ ```json
450
+ {
451
+ "scripts": {
452
+ "start": "node server.js",
453
+ "dev": "nodemon server.js",
454
+ "test": "NODE_ENV=test jest",
455
+ "start:prod": "NODE_ENV=production node server.js"
456
+ }
457
+ }
458
+ ```
459
+
460
+ **Python settings.py:**
461
+ ```python
462
+ import os
463
+
464
+ PORT = int(os.getenv('PORT', 8000))
465
+ DEBUG = os.getenv('DEBUG', 'False') == 'True'
466
+ DATABASE_URL = os.getenv('DATABASE_URL', 'sqlite:///db.sqlite3')
467
+ ```
468
+
469
+ ## Health Checks
470
+
471
+ ### Implementing Health Check Endpoint
472
+
473
+ **Express.js:**
474
+ ```javascript
475
+ app.get('/health', (req, res) => {
476
+ res.status(200).json({
477
+ status: 'ok',
478
+ timestamp: new Date().toISOString(),
479
+ uptime: process.uptime()
480
+ });
481
+ });
482
+ ```
483
+
484
+ **Flask:**
485
+ ```python
486
+ @app.route('/health')
487
+ def health():
488
+ return jsonify({
489
+ 'status': 'ok',
490
+ 'timestamp': datetime.now().isoformat()
491
+ })
492
+ ```
493
+
494
+ **Django:**
495
+ ```python
496
+ from django.http import JsonResponse
497
+ from datetime import datetime
498
+
499
+ def health_check(request):
500
+ return JsonResponse({
501
+ 'status': 'ok',
502
+ 'timestamp': datetime.now().isoformat()
503
+ })
504
+ ```
505
+
506
+ ### Checking Health from Tests
507
+
508
+ **Using curl:**
509
+ ```bash
510
+ curl -f http://localhost:3000/health
511
+ ```
512
+
513
+ **Using Python requests:**
514
+ ```python
515
+ import requests
516
+
517
+ def wait_for_server(url, timeout=30):
518
+ start = time.time()
519
+ while time.time() - start < timeout:
520
+ try:
521
+ response = requests.get(f"{url}/health", timeout=1)
522
+ if response.status_code == 200:
523
+ return True
524
+ except requests.RequestException:
525
+ time.sleep(0.5)
526
+ return False
527
+
528
+ if wait_for_server('http://localhost:3000'):
529
+ print("Server is ready")
530
+ ```
531
+
532
+ **Using Playwright:**
533
+ ```python
534
+ def wait_for_server_ready(page, url, timeout=30000):
535
+ page.goto(f"{url}/health", timeout=timeout)
536
+ response = page.wait_for_response(f"{url}/health")
537
+ return response.status == 200
538
+ ```
539
+
540
+ ## Graceful Shutdown
541
+
542
+ ### Signal Handling
543
+
544
+ **Node.js graceful shutdown:**
545
+ ```javascript
546
+ const server = app.listen(3000);
547
+
548
+ process.on('SIGTERM', () => {
549
+ console.log('SIGTERM received, closing server...');
550
+ server.close(() => {
551
+ console.log('Server closed');
552
+ process.exit(0);
553
+ });
554
+ });
555
+
556
+ process.on('SIGINT', () => {
557
+ console.log('SIGINT received, closing server...');
558
+ server.close(() => {
559
+ console.log('Server closed');
560
+ process.exit(0);
561
+ });
562
+ });
563
+ ```
564
+
565
+ **Python graceful shutdown:**
566
+ ```python
567
+ import signal
568
+ import sys
569
+
570
+ def signal_handler(sig, frame):
571
+ print('Shutting down gracefully...')
572
+ # Clean up resources
573
+ sys.exit(0)
574
+
575
+ signal.signal(signal.SIGTERM, signal_handler)
576
+ signal.signal(signal.SIGINT, signal_handler)
577
+ ```
578
+
579
+ ### Cleanup Tasks
580
+
581
+ **Close database connections:**
582
+ ```javascript
583
+ process.on('SIGTERM', async () => {
584
+ await db.close();
585
+ await cache.disconnect();
586
+ server.close(() => process.exit(0));
587
+ });
588
+ ```
589
+
590
+ **Finish in-flight requests:**
591
+ ```javascript
592
+ server.close(() => {
593
+ console.log('All requests finished');
594
+ process.exit(0);
595
+ });
596
+
597
+ // Force exit after timeout
598
+ setTimeout(() => {
599
+ console.error('Forcing shutdown');
600
+ process.exit(1);
601
+ }, 10000);
602
+ ```
603
+
604
+ ## Multi-Server Configurations
605
+
606
+ ### Development Stack
607
+
608
+ **Full-stack development:**
609
+ ```bash
610
+ # Terminal 1: Database
611
+ docker run -d -p 5432:5432 postgres
612
+
613
+ # Terminal 2: Backend API
614
+ cd backend && npm run dev
615
+
616
+ # Terminal 3: Frontend
617
+ cd frontend && npm start
618
+
619
+ # Or use with_server.py for all at once
620
+ python scripts/with_server.py \
621
+ --server "docker run -p 5432:5432 postgres" --port 5432 \
622
+ --server "cd backend && npm run dev" --port 4000 \
623
+ --server "cd frontend && npm start" --port 3000 \
624
+ -- python test.py
625
+ ```
626
+
627
+ ### Microservices Testing
628
+
629
+ **Multiple independent services:**
630
+ ```bash
631
+ python scripts/with_server.py \
632
+ --server "cd auth-service && npm start" --port 3001 \
633
+ --server "cd user-service && npm start" --port 3002 \
634
+ --server "cd payment-service && npm start" --port 3003 \
635
+ --server "cd gateway && npm start" --port 3000 \
636
+ -- python integration_test.py
637
+ ```
638
+
639
+ ### Reverse Proxy Setup
640
+
641
+ **Nginx configuration:**
642
+ ```nginx
643
+ server {
644
+ listen 80;
645
+
646
+ location /api {
647
+ proxy_pass http://localhost:4000;
648
+ }
649
+
650
+ location / {
651
+ proxy_pass http://localhost:3000;
652
+ }
653
+ }
654
+ ```
655
+
656
+ ## Troubleshooting
657
+
658
+ ### Server Won't Start
659
+
660
+ **Port already in use:**
661
+ ```bash
662
+ # Find what's using the port
663
+ lsof -i :3000
664
+
665
+ # Kill the process
666
+ lsof -t -i :3000 | xargs kill
667
+ ```
668
+
669
+ **Permission denied:**
670
+ ```bash
671
+ # Ports < 1024 require root (avoid if possible)
672
+ sudo node server.js # NOT RECOMMENDED
673
+
674
+ # Use port >= 1024 instead
675
+ PORT=3000 node server.js
676
+ ```
677
+
678
+ **Missing dependencies:**
679
+ ```bash
680
+ # Node.js
681
+ npm install
682
+
683
+ # Python
684
+ pip install -r requirements.txt
685
+
686
+ # Check for errors
687
+ npm start 2>&1 | tee server.log
688
+ ```
689
+
690
+ ### Server Crashes During Test
691
+
692
+ **Check logs:**
693
+ ```bash
694
+ # If using with_server.py, check stderr
695
+ python scripts/with_server.py --server "npm start" --port 3000 -- python test.py 2>&1
696
+
697
+ # Check application logs
698
+ tail -f server.log
699
+
700
+ # Docker logs
701
+ docker logs -f container_name
702
+ ```
703
+
704
+ **Memory issues:**
705
+ ```bash
706
+ # Increase Node.js memory
707
+ NODE_OPTIONS="--max-old-space-size=4096" npm start
708
+
709
+ # Monitor memory
710
+ top -pid $(lsof -t -i :3000)
711
+ ```
712
+
713
+ ### Server Not Responding
714
+
715
+ **Check if process is alive:**
716
+ ```bash
717
+ ps aux | grep node
718
+ ps aux | grep python
719
+ ```
720
+
721
+ **Check network connectivity:**
722
+ ```bash
723
+ # Test localhost
724
+ curl http://localhost:3000
725
+
726
+ # Test network interface
727
+ curl http://127.0.0.1:3000
728
+
729
+ # Check if listening on correct interface
730
+ lsof -i -sTCP:LISTEN | grep 3000
731
+ ```
732
+
733
+ **Firewall issues:**
734
+ ```bash
735
+ # macOS
736
+ sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
737
+
738
+ # Linux
739
+ sudo ufw status
740
+ ```
741
+
742
+ ### Timeout Issues
743
+
744
+ **Increase timeout in with_server.py:**
745
+ ```bash
746
+ python scripts/with_server.py --server "npm start" --port 3000 --timeout 60 -- python test.py
747
+ ```
748
+
749
+ **Check server startup time:**
750
+ ```bash
751
+ time npm start
752
+ ```
753
+
754
+ **Optimize startup:**
755
+ - Reduce initial data loading
756
+ - Use lazy initialization
757
+ - Optimize dependency loading
758
+ - Use production builds for testing