claude-mpm 4.24.0__py3-none-any.whl → 5.0.9__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 (502) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +4 -4
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +38 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +2 -6
  30. claude_mpm/cli/commands/config.py +7 -4
  31. claude_mpm/cli/commands/configure.py +769 -45
  32. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  33. claude_mpm/cli/commands/configure_navigation.py +63 -46
  34. claude_mpm/cli/commands/debug.py +12 -12
  35. claude_mpm/cli/commands/doctor.py +10 -2
  36. claude_mpm/cli/commands/hook_errors.py +277 -0
  37. claude_mpm/cli/commands/local_deploy.py +1 -4
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mpm_init/core.py +49 -1
  40. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  41. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  42. claude_mpm/cli/commands/postmortem.py +401 -0
  43. claude_mpm/cli/commands/run.py +123 -165
  44. claude_mpm/cli/commands/skill_source.py +694 -0
  45. claude_mpm/cli/commands/skills.py +757 -20
  46. claude_mpm/cli/executor.py +78 -3
  47. claude_mpm/cli/interactive/agent_wizard.py +955 -45
  48. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  49. claude_mpm/cli/parsers/agents_parser.py +256 -4
  50. claude_mpm/cli/parsers/base_parser.py +53 -0
  51. claude_mpm/cli/parsers/config_parser.py +96 -43
  52. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  53. claude_mpm/cli/parsers/skills_parser.py +145 -0
  54. claude_mpm/cli/parsers/source_parser.py +138 -0
  55. claude_mpm/cli/startup.py +538 -106
  56. claude_mpm/cli/startup_display.py +480 -0
  57. claude_mpm/cli/utils.py +1 -1
  58. claude_mpm/cli_module/commands.py +1 -1
  59. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  60. claude_mpm/commands/mpm-agents-detect.md +9 -0
  61. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  62. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  63. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  64. claude_mpm/commands/mpm-doctor.md +9 -0
  65. claude_mpm/commands/mpm-help.md +14 -2
  66. claude_mpm/commands/mpm-init.md +27 -2
  67. claude_mpm/commands/mpm-monitor.md +9 -0
  68. claude_mpm/commands/mpm-postmortem.md +123 -0
  69. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  70. claude_mpm/commands/mpm-status.md +9 -0
  71. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  72. claude_mpm/commands/mpm-ticket-view.md +552 -0
  73. claude_mpm/commands/mpm-version.md +9 -0
  74. claude_mpm/commands/mpm.md +10 -0
  75. claude_mpm/config/agent_presets.py +488 -0
  76. claude_mpm/config/agent_sources.py +325 -0
  77. claude_mpm/config/skill_presets.py +392 -0
  78. claude_mpm/config/skill_sources.py +590 -0
  79. claude_mpm/constants.py +13 -0
  80. claude_mpm/core/claude_runner.py +5 -34
  81. claude_mpm/core/config.py +16 -0
  82. claude_mpm/core/constants.py +1 -1
  83. claude_mpm/core/framework/__init__.py +3 -16
  84. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  85. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  86. claude_mpm/core/hook_error_memory.py +381 -0
  87. claude_mpm/core/hook_manager.py +41 -2
  88. claude_mpm/core/interactive_session.py +91 -10
  89. claude_mpm/core/logger.py +3 -1
  90. claude_mpm/core/oneshot_session.py +71 -8
  91. claude_mpm/core/protocols/__init__.py +23 -0
  92. claude_mpm/core/protocols/runner_protocol.py +103 -0
  93. claude_mpm/core/protocols/session_protocol.py +131 -0
  94. claude_mpm/core/shared/singleton_manager.py +11 -4
  95. claude_mpm/core/system_context.py +38 -0
  96. claude_mpm/dashboard/static/css/activity.css +69 -69
  97. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  98. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  103. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  104. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  105. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  106. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  107. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  108. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  109. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  110. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  111. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  112. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  113. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  114. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  115. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  116. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  117. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  118. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  119. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  120. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  121. claude_mpm/dashboard/templates/code_simple.html +23 -23
  122. claude_mpm/dashboard/templates/index.html +18 -18
  123. claude_mpm/experimental/cli_enhancements.py +1 -5
  124. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  125. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  126. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  127. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  128. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  131. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  136. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  137. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  139. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  140. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  141. claude_mpm/models/git_repository.py +198 -0
  142. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  143. claude_mpm/scripts/start_activity_logging.py +3 -1
  144. claude_mpm/services/agents/agent_builder.py +45 -9
  145. claude_mpm/services/agents/agent_preset_service.py +238 -0
  146. claude_mpm/services/agents/agent_selection_service.py +484 -0
  147. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  148. claude_mpm/services/agents/cache_git_manager.py +621 -0
  149. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  150. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  151. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  156. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  157. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  158. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  159. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  160. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  161. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  162. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  163. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  164. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  165. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  166. claude_mpm/services/agents/git_source_manager.py +629 -0
  167. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  168. claude_mpm/services/agents/local_template_manager.py +50 -10
  169. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  170. claude_mpm/services/agents/sources/__init__.py +13 -0
  171. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  172. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  173. claude_mpm/services/agents/startup_sync.py +239 -0
  174. claude_mpm/services/agents/toolchain_detector.py +474 -0
  175. claude_mpm/services/analysis/__init__.py +25 -0
  176. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  177. claude_mpm/services/analysis/postmortem_service.py +765 -0
  178. claude_mpm/services/cli/session_pause_manager.py +1 -1
  179. claude_mpm/services/command_deployment_service.py +200 -6
  180. claude_mpm/services/core/base.py +7 -2
  181. claude_mpm/services/core/interfaces/__init__.py +1 -3
  182. claude_mpm/services/core/interfaces/health.py +1 -4
  183. claude_mpm/services/core/models/__init__.py +2 -11
  184. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  185. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  186. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  187. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  188. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  189. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  190. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  191. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  192. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  193. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  194. claude_mpm/services/event_bus/direct_relay.py +3 -3
  195. claude_mpm/services/events/consumers/logging.py +1 -2
  196. claude_mpm/services/git/__init__.py +21 -0
  197. claude_mpm/services/git/git_operations_service.py +494 -0
  198. claude_mpm/services/github/__init__.py +21 -0
  199. claude_mpm/services/github/github_cli_service.py +397 -0
  200. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  201. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  202. claude_mpm/services/instructions/__init__.py +9 -0
  203. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  204. claude_mpm/services/local_ops/__init__.py +3 -13
  205. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  206. claude_mpm/services/local_ops/health_manager.py +1 -4
  207. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  208. claude_mpm/services/mcp_config_manager.py +75 -145
  209. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  210. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  211. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  212. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  213. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  214. claude_mpm/services/mcp_service_verifier.py +6 -3
  215. claude_mpm/services/model/model_router.py +1 -2
  216. claude_mpm/services/monitor/daemon.py +29 -9
  217. claude_mpm/services/monitor/daemon_manager.py +96 -19
  218. claude_mpm/services/monitor/server.py +2 -2
  219. claude_mpm/services/port_manager.py +1 -1
  220. claude_mpm/services/pr/__init__.py +14 -0
  221. claude_mpm/services/pr/pr_template_service.py +329 -0
  222. claude_mpm/services/project/documentation_manager.py +2 -1
  223. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  224. claude_mpm/services/runner_configuration_service.py +16 -3
  225. claude_mpm/services/session_management_service.py +16 -4
  226. claude_mpm/services/skills/__init__.py +18 -0
  227. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  228. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  229. claude_mpm/services/skills_config.py +547 -0
  230. claude_mpm/services/skills_deployer.py +955 -0
  231. claude_mpm/services/socketio/handlers/connection.py +1 -1
  232. claude_mpm/services/socketio/handlers/git.py +1 -1
  233. claude_mpm/services/socketio/server/core.py +1 -4
  234. claude_mpm/services/socketio/server/main.py +1 -3
  235. claude_mpm/services/system_instructions_service.py +1 -3
  236. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  237. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  238. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  239. claude_mpm/services/unified/unified_deployment.py +1 -5
  240. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  241. claude_mpm/services/visualization/__init__.py +1 -5
  242. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  243. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  244. claude_mpm/skills/skills_registry.py +0 -1
  245. claude_mpm/templates/questions/__init__.py +38 -0
  246. claude_mpm/templates/questions/base.py +193 -0
  247. claude_mpm/templates/questions/pr_strategy.py +311 -0
  248. claude_mpm/templates/questions/project_init.py +385 -0
  249. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  250. claude_mpm/tools/__main__.py +8 -8
  251. claude_mpm/utils/agent_dependency_loader.py +77 -10
  252. claude_mpm/utils/agent_filters.py +288 -0
  253. claude_mpm/utils/dependency_cache.py +3 -1
  254. claude_mpm/utils/gitignore.py +241 -0
  255. claude_mpm/utils/migration.py +372 -0
  256. claude_mpm/utils/progress.py +387 -0
  257. claude_mpm/utils/robust_installer.py +2 -4
  258. claude_mpm/utils/structured_questions.py +619 -0
  259. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
  260. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
  261. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  262. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  263. claude_mpm/agents/templates/agent-manager.json +0 -273
  264. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  265. claude_mpm/agents/templates/api_qa.json +0 -183
  266. claude_mpm/agents/templates/clerk-ops.json +0 -235
  267. claude_mpm/agents/templates/code_analyzer.json +0 -101
  268. claude_mpm/agents/templates/content-agent.json +0 -358
  269. claude_mpm/agents/templates/dart_engineer.json +0 -307
  270. claude_mpm/agents/templates/data_engineer.json +0 -225
  271. claude_mpm/agents/templates/documentation.json +0 -238
  272. claude_mpm/agents/templates/engineer.json +0 -210
  273. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  274. claude_mpm/agents/templates/golang_engineer.json +0 -270
  275. claude_mpm/agents/templates/imagemagick.json +0 -264
  276. claude_mpm/agents/templates/java_engineer.json +0 -346
  277. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  278. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  279. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  280. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  281. claude_mpm/agents/templates/memory_manager.json +0 -158
  282. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  283. claude_mpm/agents/templates/ops.json +0 -185
  284. claude_mpm/agents/templates/php-engineer.json +0 -287
  285. claude_mpm/agents/templates/product_owner.json +0 -338
  286. claude_mpm/agents/templates/project_organizer.json +0 -144
  287. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  288. claude_mpm/agents/templates/python_engineer.json +0 -387
  289. claude_mpm/agents/templates/qa.json +0 -243
  290. claude_mpm/agents/templates/react_engineer.json +0 -239
  291. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  292. claude_mpm/agents/templates/research.json +0 -188
  293. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  294. claude_mpm/agents/templates/rust_engineer.json +0 -275
  295. claude_mpm/agents/templates/security.json +0 -202
  296. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  297. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  298. claude_mpm/agents/templates/ticketing.json +0 -178
  299. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  300. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  301. claude_mpm/agents/templates/version_control.json +0 -159
  302. claude_mpm/agents/templates/web_qa.json +0 -400
  303. claude_mpm/agents/templates/web_ui.json +0 -189
  304. claude_mpm/commands/mpm-tickets.md +0 -151
  305. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  306. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  307. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  308. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  309. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  310. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  311. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  312. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  313. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  314. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  315. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  316. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  317. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  318. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  319. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  320. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  321. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  322. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  323. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  324. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  325. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  326. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  327. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  328. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  329. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  330. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  331. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  332. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  333. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  334. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  335. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  336. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  337. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  338. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  339. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  340. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  341. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  343. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  344. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  345. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  346. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  347. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  349. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  351. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  352. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  353. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  354. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  355. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  357. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  358. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  359. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  360. claude_mpm/dashboard/static/built/react/events.js +0 -30
  361. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  362. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  363. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  364. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  365. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  366. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  367. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  368. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  369. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  370. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  382. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  383. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  384. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  385. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  388. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  389. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  390. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  391. claude_mpm/dashboard/static/events.html +0 -607
  392. claude_mpm/dashboard/static/index.html +0 -635
  393. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  394. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  395. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  396. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  397. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  398. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  399. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  400. claude_mpm/dashboard/static/legacy/files.html +0 -747
  401. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  402. claude_mpm/dashboard/static/monitors.html +0 -431
  403. claude_mpm/dashboard/static/production/events.html +0 -659
  404. claude_mpm/dashboard/static/production/main.html +0 -698
  405. claude_mpm/dashboard/static/production/monitors.html +0 -483
  406. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  407. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  408. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  409. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  410. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  411. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  412. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  413. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  414. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  415. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  416. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  417. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  418. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  419. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  420. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  421. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  422. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  423. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  424. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  425. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  426. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  427. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  432. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  433. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  434. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  435. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  436. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  437. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  438. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  439. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  440. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  441. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  442. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  443. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  444. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  445. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  446. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  447. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  448. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  449. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  450. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  451. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  452. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  453. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  454. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  455. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  456. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  457. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  458. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  459. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  460. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  461. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  462. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  463. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  464. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  465. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  466. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  467. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  468. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  469. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  470. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  471. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  472. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  473. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  474. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  475. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  476. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  477. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  478. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  479. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  480. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  481. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  482. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  483. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  495. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  496. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  497. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  498. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  499. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  500. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
  501. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  502. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -1,668 +0,0 @@
1
- # Advanced Tracing Techniques
2
-
3
- Advanced methods for tracing bugs when manual inspection isn't sufficient: instrumentation, stack traces, test pollution detection, and async tracing.
4
-
5
- ## When Manual Tracing Isn't Enough
6
-
7
- Manual code inspection works well when:
8
- - Code path is clear
9
- - Stack traces are available
10
- - Single-threaded execution
11
- - You can identify all callers
12
-
13
- **Use advanced techniques when:**
14
- - Can't identify which code path triggers the issue
15
- - Multiple async operations interleave
16
- - Race conditions or timing issues
17
- - Need to find which test causes pollution
18
- - External code (libraries) involved
19
- - Production issues you can't reproduce locally
20
-
21
- ## Stack Trace Instrumentation
22
-
23
- ### Purpose
24
-
25
- Capture complete call stack at strategic points to understand execution flow.
26
-
27
- ### Basic Stack Trace Capture
28
-
29
- ```typescript
30
- function suspiciousOperation(param: string) {
31
- // Capture stack trace BEFORE the operation
32
- const stack = new Error().stack;
33
- console.error('DEBUG suspiciousOperation:', {
34
- param,
35
- cwd: process.cwd(),
36
- timestamp: Date.now(),
37
- stack
38
- });
39
-
40
- // Now do the operation
41
- performOperation(param);
42
- }
43
- ```
44
-
45
- **Key points:**
46
- - Use `console.error()` in tests (regular logger may be suppressed)
47
- - Log BEFORE the operation, not after it fails
48
- - Include context: parameters, environment, state
49
- - Capture stack with `new Error().stack`
50
-
51
- ### Analyzing Stack Traces
52
-
53
- **Run and capture output:**
54
- ```bash
55
- npm test 2>&1 | grep 'DEBUG suspiciousOperation'
56
- ```
57
-
58
- **Look for:**
59
- - Test file names in stack traces
60
- - Line numbers that trigger the call
61
- - Patterns: same test? same parameters?
62
- - Call frequency: how many times called?
63
-
64
- **Example output:**
65
- ```
66
- DEBUG suspiciousOperation: {
67
- param: '',
68
- cwd: '/Users/jesse/project/packages/core',
69
- stack: 'Error
70
- at suspiciousOperation (file.ts:10)
71
- at WorktreeManager.create (worktree.ts:45)
72
- at Session.initialize (session.ts:78)
73
- at Project.create (project.ts:23)
74
- at Test.<anonymous> (project.test.ts:12)
75
- at Test.run (node:internal/test)'
76
- }
77
- ```
78
-
79
- **Analysis:** The call originates from `project.test.ts:12` with empty parameter.
80
-
81
- ### Conditional Instrumentation
82
-
83
- Only log when conditions are suspicious:
84
-
85
- ```typescript
86
- function gitInit(directory: string) {
87
- // Only log if directory is empty or equals cwd
88
- if (!directory || directory === process.cwd()) {
89
- console.error('SUSPICIOUS git init:', {
90
- directory,
91
- cwd: process.cwd(),
92
- nodeEnv: process.env.NODE_ENV,
93
- stack: new Error().stack
94
- });
95
- }
96
-
97
- execFileAsync('git', ['init'], { cwd: directory });
98
- }
99
- ```
100
-
101
- This reduces noise while capturing problematic cases.
102
-
103
- ### Stack Trace in Production
104
-
105
- **Warning:** Stack traces have performance cost. Use carefully in production.
106
-
107
- ```typescript
108
- class ErrorTracker {
109
- private static captureInterval = 100; // Only capture 1% of calls
110
- private static counter = 0;
111
-
112
- static maybeCapture(operation: string, data: any) {
113
- this.counter++;
114
- if (this.counter % this.captureInterval === 0) {
115
- // Sample 1% of operations
116
- logger.warn('Sampled operation', {
117
- operation,
118
- data,
119
- stack: new Error().stack
120
- });
121
- }
122
- }
123
- }
124
- ```
125
-
126
- ## Finding Test Pollution
127
-
128
- ### What is Test Pollution?
129
-
130
- Tests that create files, directories, or state that persists after the test completes.
131
-
132
- **Common polluters:**
133
- - Creating files/directories outside temp dir
134
- - Not cleaning up in afterEach
135
- - Modifying global state
136
- - Creating git repositories
137
- - Writing to current directory
138
-
139
- ### Detection Strategy
140
-
141
- **Symptoms:**
142
- - Files appear in source code directory
143
- - Tests fail when run together but pass individually
144
- - Side effects from one test affect another
145
- - Cleanup code not running
146
-
147
- ### Manual Detection
148
-
149
- **Check for artifacts after test run:**
150
- ```bash
151
- # Before tests
152
- ls -la src/
153
-
154
- # Run tests
155
- npm test
156
-
157
- # After tests - did anything appear?
158
- ls -la src/
159
- ```
160
-
161
- **Common artifacts:**
162
- - `.git` directories
163
- - `node_modules/` subdirectories
164
- - Temp files not cleaned up
165
- - Config files created
166
- - Log files
167
-
168
- ### Automated Detection with Bisection
169
-
170
- Use the `find-polluter.sh` script to automatically find which test creates pollution:
171
-
172
- ```bash
173
- #!/bin/bash
174
- # find-polluter.sh
175
- # Usage: ./find-polluter.sh <artifact> <test-pattern>
176
- # Example: ./find-polluter.sh '.git' 'src/**/*.test.ts'
177
-
178
- ARTIFACT=$1
179
- TEST_PATTERN=$2
180
-
181
- if [ -z "$ARTIFACT" ] || [ -z "$TEST_PATTERN" ]; then
182
- echo "Usage: $0 <artifact> <test-pattern>"
183
- echo "Example: $0 '.git' 'src/**/*.test.ts'"
184
- exit 1
185
- fi
186
-
187
- # Get list of test files
188
- TEST_FILES=($(ls $TEST_PATTERN))
189
-
190
- echo "Testing ${#TEST_FILES[@]} files for artifact: $ARTIFACT"
191
-
192
- for test_file in "${TEST_FILES[@]}"; do
193
- echo "Testing: $test_file"
194
-
195
- # Remove artifact if exists
196
- rm -rf "$ARTIFACT" 2>/dev/null
197
-
198
- # Run single test file
199
- npm test -- "$test_file"
200
-
201
- # Check if artifact was created
202
- if [ -e "$ARTIFACT" ]; then
203
- echo "FOUND POLLUTER: $test_file"
204
- exit 0
205
- fi
206
- done
207
-
208
- echo "No polluter found"
209
- exit 1
210
- ```
211
-
212
- **Usage:**
213
- ```bash
214
- # Find which test creates .git directory
215
- ./find-polluter.sh '.git' 'src/**/*.test.ts'
216
-
217
- # Find which test creates node_modules
218
- ./find-polluter.sh 'node_modules' 'src/**/*.test.ts'
219
- ```
220
-
221
- **Advanced version with binary search:**
222
- ```bash
223
- #!/bin/bash
224
- # find-polluter-fast.sh - Uses binary search for faster detection
225
-
226
- ARTIFACT=$1
227
- TEST_PATTERN=$2
228
- TEST_FILES=($(ls $TEST_PATTERN))
229
-
230
- function test_files() {
231
- local files=("$@")
232
- rm -rf "$ARTIFACT" 2>/dev/null
233
- npm test -- "${files[@]}"
234
- [ -e "$ARTIFACT" ]
235
- }
236
-
237
- function binary_search() {
238
- local files=("$@")
239
- local count=${#files[@]}
240
-
241
- if [ $count -eq 0 ]; then
242
- echo "No polluter found"
243
- return 1
244
- fi
245
-
246
- if [ $count -eq 1 ]; then
247
- if test_files "${files[@]}"; then
248
- echo "FOUND POLLUTER: ${files[0]}"
249
- return 0
250
- fi
251
- return 1
252
- fi
253
-
254
- # Split in half
255
- local mid=$((count / 2))
256
- local left=("${files[@]:0:mid}")
257
- local right=("${files[@]:mid}")
258
-
259
- # Test left half
260
- if test_files "${left[@]}"; then
261
- binary_search "${left[@]}"
262
- else
263
- binary_search "${right[@]}"
264
- fi
265
- }
266
-
267
- binary_search "${TEST_FILES[@]}"
268
- ```
269
-
270
- ### Preventing Test Pollution
271
-
272
- **Best practices:**
273
- 1. **Always use temp directories:**
274
- ```typescript
275
- let tempDir: string;
276
-
277
- beforeEach(() => {
278
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'test-'));
279
- });
280
-
281
- afterEach(() => {
282
- fs.rmSync(tempDir, { recursive: true });
283
- });
284
- ```
285
-
286
- 2. **Validate test isolation:**
287
- ```typescript
288
- // Guard against operations outside temp dir
289
- if (process.env.NODE_ENV === 'test') {
290
- if (!directory.includes(os.tmpdir())) {
291
- throw new Error(`Test safety: operation outside tmpdir: ${directory}`);
292
- }
293
- }
294
- ```
295
-
296
- 3. **Use cleanup verification:**
297
- ```typescript
298
- afterEach(() => {
299
- // Clean up
300
- fs.rmSync(tempDir, { recursive: true });
301
-
302
- // Verify no artifacts in source
303
- const gitInSource = fs.existsSync(path.join(__dirname, '.git'));
304
- if (gitInSource) {
305
- throw new Error('Test pollution: .git created in source directory');
306
- }
307
- });
308
- ```
309
-
310
- ## Async Operation Tracing
311
-
312
- ### The Challenge
313
-
314
- Async operations obscure call chains:
315
- ```typescript
316
- async function a() {
317
- await b();
318
- }
319
-
320
- async function b() {
321
- await c();
322
- }
323
-
324
- async function c() {
325
- throw new Error('Something failed');
326
- }
327
- ```
328
-
329
- Stack trace might only show:
330
- ```
331
- Error: Something failed
332
- at c (file.ts:10)
333
- ```
334
-
335
- Missing the full chain: `a → b → c`
336
-
337
- ### Node.js Async Stack Traces
338
-
339
- **Enable async stack traces:**
340
- ```bash
341
- node --async-stack-traces test.js
342
- ```
343
-
344
- Or in code:
345
- ```typescript
346
- // At application entry point
347
- Error.stackTraceLimit = 50; // Capture deeper stacks
348
- ```
349
-
350
- **In package.json:**
351
- ```json
352
- {
353
- "scripts": {
354
- "test": "node --async-stack-traces ./node_modules/.bin/jest"
355
- }
356
- }
357
- ```
358
-
359
- ### Trace IDs for Async Operations
360
-
361
- When multiple async operations interleave, use trace IDs:
362
-
363
- ```typescript
364
- import { randomUUID } from 'crypto';
365
- import { AsyncLocalStorage } from 'async_hooks';
366
-
367
- const asyncLocalStorage = new AsyncLocalStorage();
368
-
369
- function withTraceId<T>(fn: () => T): T {
370
- const traceId = randomUUID();
371
- return asyncLocalStorage.run({ traceId }, fn);
372
- }
373
-
374
- function getTraceId(): string {
375
- const store = asyncLocalStorage.getStore() as { traceId: string };
376
- return store?.traceId || 'no-trace-id';
377
- }
378
-
379
- // Usage
380
- async function operationA() {
381
- console.log(`[${getTraceId()}] Starting operation A`);
382
- await operationB();
383
- }
384
-
385
- async function operationB() {
386
- console.log(`[${getTraceId()}] Starting operation B`);
387
- await operationC();
388
- }
389
-
390
- // Run with trace ID
391
- await withTraceId(async () => {
392
- await operationA();
393
- });
394
- ```
395
-
396
- **Output:**
397
- ```
398
- [abc-123] Starting operation A
399
- [abc-123] Starting operation B
400
- [abc-123] Starting operation C
401
- ```
402
-
403
- All operations from same call chain have same trace ID.
404
-
405
- ### Debugging Race Conditions
406
-
407
- **Problem:** Operations complete in wrong order, causing bugs.
408
-
409
- **Solution: Add timing instrumentation:**
410
-
411
- ```typescript
412
- class TimingTracer {
413
- private events: Array<{ time: number; event: string; data: any }> = [];
414
-
415
- record(event: string, data: any = {}) {
416
- this.events.push({
417
- time: Date.now(),
418
- event,
419
- data
420
- });
421
- }
422
-
423
- dump() {
424
- const sorted = this.events.sort((a, b) => a.time - b.time);
425
- console.error('=== Timing Trace ===');
426
- let start = sorted[0]?.time || 0;
427
- sorted.forEach(({ time, event, data }) => {
428
- console.error(`+${time - start}ms: ${event}`, data);
429
- start = time;
430
- });
431
- }
432
- }
433
-
434
- // Usage
435
- const tracer = new TimingTracer();
436
-
437
- async function operation() {
438
- tracer.record('start');
439
-
440
- const promise1 = async1().then(() => tracer.record('async1 done'));
441
- const promise2 = async2().then(() => tracer.record('async2 done'));
442
-
443
- await Promise.all([promise1, promise2]);
444
-
445
- tracer.record('both done');
446
- tracer.dump();
447
- }
448
- ```
449
-
450
- **Output shows operation order:**
451
- ```
452
- === Timing Trace ===
453
- +0ms: start {}
454
- +45ms: async2 done {}
455
- +67ms: async1 done {}
456
- +67ms: both done {}
457
- ```
458
-
459
- Shows async2 completed before async1.
460
-
461
- ## Debugging Third-Party Libraries
462
-
463
- ### When Library Behavior is Unexpected
464
-
465
- **Strategy:**
466
- 1. Verify you're using the API correctly
467
- 2. Check library version and changelog
468
- 3. Read library source code
469
- 4. Add instrumentation around library calls
470
-
471
- ### Wrapping Library Calls
472
-
473
- ```typescript
474
- // Wrap library function to add tracing
475
- import { originalFunction } from 'third-party-lib';
476
-
477
- const tracedFunction = (...args: any[]) => {
478
- console.error('Calling library function:', {
479
- args,
480
- stack: new Error().stack
481
- });
482
-
483
- const result = originalFunction(...args);
484
-
485
- console.error('Library function result:', result);
486
-
487
- return result;
488
- };
489
-
490
- // Use traced version
491
- export { tracedFunction as originalFunction };
492
- ```
493
-
494
- ### Checking Library Source
495
-
496
- **When to read library source:**
497
- - Documentation is unclear
498
- - Behavior differs from documentation
499
- - Need to understand edge cases
500
- - Debugging library bug
501
-
502
- **How to read library source:**
503
- ```bash
504
- # Find library location
505
- npm ls third-party-lib
506
-
507
- # View source
508
- code node_modules/third-party-lib/src/
509
-
510
- # Or on GitHub
511
- open https://github.com/author/third-party-lib
512
- ```
513
-
514
- ## Environment-Specific Issues
515
-
516
- ### Capturing Environment Context
517
-
518
- ```typescript
519
- function captureEnvironment() {
520
- return {
521
- nodeVersion: process.version,
522
- platform: process.platform,
523
- arch: process.arch,
524
- cwd: process.cwd(),
525
- env: {
526
- NODE_ENV: process.env.NODE_ENV,
527
- CI: process.env.CI,
528
- // Add relevant env vars
529
- },
530
- memory: process.memoryUsage(),
531
- uptime: process.uptime()
532
- };
533
- }
534
-
535
- // Log with every error
536
- try {
537
- riskyOperation();
538
- } catch (error) {
539
- console.error('Operation failed:', {
540
- error,
541
- environment: captureEnvironment(),
542
- stack: error.stack
543
- });
544
- throw error;
545
- }
546
- ```
547
-
548
- ### Reproducing Production Issues Locally
549
-
550
- **Techniques:**
551
- 1. **Match environment:**
552
- ```bash
553
- nvm use <production-node-version>
554
- export NODE_ENV=production
555
- ```
556
-
557
- 2. **Use production data (sanitized):**
558
- ```bash
559
- # Dump production DB to local
560
- pg_dump production_db | psql local_db
561
- ```
562
-
563
- 3. **Enable production logging locally:**
564
- ```typescript
565
- if (process.env.DEBUG_PROD) {
566
- logger.level = 'debug';
567
- }
568
- ```
569
-
570
- 4. **Replay production requests:**
571
- ```typescript
572
- // Log requests in production
573
- app.use((req, res, next) => {
574
- logger.info('Request', {
575
- method: req.method,
576
- url: req.url,
577
- headers: req.headers,
578
- body: req.body
579
- });
580
- next();
581
- });
582
-
583
- // Replay locally
584
- const productionRequest = loadFromLogs();
585
- await fetch('http://localhost:3000' + productionRequest.url, {
586
- method: productionRequest.method,
587
- headers: productionRequest.headers,
588
- body: productionRequest.body
589
- });
590
- ```
591
-
592
- ## Performance Profiling for Root Cause
593
-
594
- Sometimes "bug" is performance issue. Trace to find bottleneck.
595
-
596
- ### Node.js Built-in Profiler
597
-
598
- ```bash
599
- # Generate CPU profile
600
- node --cpu-prof app.js
601
-
602
- # Analyze with Chrome DevTools
603
- open chrome://inspect
604
- ```
605
-
606
- ### Custom Performance Tracing
607
-
608
- ```typescript
609
- class PerformanceTracer {
610
- private timers = new Map<string, number>();
611
-
612
- start(label: string) {
613
- this.timers.set(label, Date.now());
614
- }
615
-
616
- end(label: string): number {
617
- const start = this.timers.get(label);
618
- if (!start) throw new Error(`No timer: ${label}`);
619
-
620
- const duration = Date.now() - start;
621
- console.log(`${label}: ${duration}ms`);
622
- this.timers.delete(label);
623
- return duration;
624
- }
625
-
626
- async measure<T>(label: string, fn: () => T): Promise<T> {
627
- this.start(label);
628
- try {
629
- return await fn();
630
- } finally {
631
- this.end(label);
632
- }
633
- }
634
- }
635
-
636
- // Usage
637
- const tracer = new PerformanceTracer();
638
-
639
- await tracer.measure('database query', async () => {
640
- return await db.query('SELECT ...');
641
- });
642
-
643
- await tracer.measure('API call', async () => {
644
- return await fetch('https://api.example.com');
645
- });
646
- ```
647
-
648
- **Output:**
649
- ```
650
- database query: 1243ms ← BOTTLENECK FOUND
651
- API call: 89ms
652
- ```
653
-
654
- ## Summary
655
-
656
- **Stack traces:** Capture call chains with `new Error().stack`
657
- **Test pollution:** Use bisection to find polluting tests
658
- **Async tracing:** Use trace IDs and async stack traces
659
- **Library issues:** Wrap calls, read source, verify API usage
660
- **Environment issues:** Match production environment, replay requests
661
- **Performance:** Profile to find bottlenecks
662
-
663
- **When to use:**
664
- - Manual tracing hits dead end
665
- - Multiple async operations involved
666
- - Test pollution occurring
667
- - Race conditions or timing issues
668
- - Need production-level debugging