claude-mpm 4.21.0__py3-none-any.whl → 5.0.2__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.
Files changed (497) 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 +632 -334
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  11. claude_mpm/agents/templates/context-management-examples.md +544 -0
  12. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  13. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  14. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  15. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  16. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  17. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  18. claude_mpm/cli/__init__.py +38 -2
  19. claude_mpm/cli/commands/agent_source.py +774 -0
  20. claude_mpm/cli/commands/agent_state_manager.py +125 -20
  21. claude_mpm/cli/commands/agents.py +684 -13
  22. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  23. claude_mpm/cli/commands/agents_discover.py +338 -0
  24. claude_mpm/cli/commands/aggregate.py +1 -1
  25. claude_mpm/cli/commands/analyze.py +3 -3
  26. claude_mpm/cli/commands/auto_configure.py +2 -6
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/config.py +7 -4
  29. claude_mpm/cli/commands/configure.py +478 -44
  30. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  31. claude_mpm/cli/commands/configure_navigation.py +63 -46
  32. claude_mpm/cli/commands/debug.py +12 -12
  33. claude_mpm/cli/commands/doctor.py +10 -2
  34. claude_mpm/cli/commands/hook_errors.py +277 -0
  35. claude_mpm/cli/commands/local_deploy.py +1 -4
  36. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  37. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  38. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  39. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  40. claude_mpm/cli/commands/run.py +124 -128
  41. claude_mpm/cli/commands/skill_source.py +694 -0
  42. claude_mpm/cli/commands/skills.py +435 -1
  43. claude_mpm/cli/executor.py +78 -3
  44. claude_mpm/cli/interactive/agent_wizard.py +919 -41
  45. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  46. claude_mpm/cli/parsers/agents_parser.py +173 -4
  47. claude_mpm/cli/parsers/base_parser.py +49 -0
  48. claude_mpm/cli/parsers/config_parser.py +96 -43
  49. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  50. claude_mpm/cli/parsers/skills_parser.py +138 -0
  51. claude_mpm/cli/parsers/source_parser.py +138 -0
  52. claude_mpm/cli/startup.py +499 -84
  53. claude_mpm/cli/startup_display.py +480 -0
  54. claude_mpm/cli/utils.py +1 -1
  55. claude_mpm/cli_module/commands.py +1 -1
  56. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  57. claude_mpm/commands/mpm-agents-detect.md +9 -0
  58. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  59. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  60. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  61. claude_mpm/commands/mpm-doctor.md +9 -0
  62. claude_mpm/commands/mpm-help.md +14 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/mpm-session-resume.md +381 -0
  66. claude_mpm/commands/mpm-status.md +9 -0
  67. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  68. claude_mpm/commands/mpm-ticket-view.md +552 -0
  69. claude_mpm/commands/mpm-version.md +9 -0
  70. claude_mpm/commands/mpm.md +11 -0
  71. claude_mpm/config/agent_presets.py +258 -0
  72. claude_mpm/config/agent_sources.py +325 -0
  73. claude_mpm/config/skill_sources.py +590 -0
  74. claude_mpm/constants.py +12 -0
  75. claude_mpm/core/api_validator.py +1 -1
  76. claude_mpm/core/claude_runner.py +17 -10
  77. claude_mpm/core/config.py +24 -0
  78. claude_mpm/core/constants.py +1 -1
  79. claude_mpm/core/framework/__init__.py +3 -16
  80. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  81. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  82. claude_mpm/core/hook_error_memory.py +381 -0
  83. claude_mpm/core/hook_manager.py +41 -2
  84. claude_mpm/core/interactive_session.py +112 -5
  85. claude_mpm/core/logger.py +3 -1
  86. claude_mpm/core/oneshot_session.py +94 -4
  87. claude_mpm/dashboard/static/css/activity.css +69 -69
  88. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  89. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  90. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  91. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  92. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  93. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  94. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  95. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  96. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  97. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  98. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  99. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  100. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  101. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  102. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  103. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  104. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  105. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  106. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  107. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  108. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  109. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  110. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  111. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  112. claude_mpm/dashboard/templates/code_simple.html +23 -23
  113. claude_mpm/dashboard/templates/index.html +18 -18
  114. claude_mpm/experimental/cli_enhancements.py +1 -5
  115. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  116. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  117. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  118. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  119. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  120. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  121. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  122. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  123. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  124. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  125. claude_mpm/models/git_repository.py +198 -0
  126. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  127. claude_mpm/scripts/start_activity_logging.py +3 -1
  128. claude_mpm/services/agents/agent_builder.py +45 -9
  129. claude_mpm/services/agents/agent_preset_service.py +238 -0
  130. claude_mpm/services/agents/agent_selection_service.py +484 -0
  131. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  132. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  133. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  134. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  135. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  136. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  138. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  139. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  140. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  141. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  142. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  143. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  144. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  145. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  146. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  147. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  148. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  149. claude_mpm/services/agents/git_source_manager.py +629 -0
  150. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  151. claude_mpm/services/agents/local_template_manager.py +50 -10
  152. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  153. claude_mpm/services/agents/sources/__init__.py +13 -0
  154. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  155. claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
  156. claude_mpm/services/agents/startup_sync.py +239 -0
  157. claude_mpm/services/agents/toolchain_detector.py +474 -0
  158. claude_mpm/services/cli/session_pause_manager.py +1 -1
  159. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  160. claude_mpm/services/command_deployment_service.py +92 -1
  161. claude_mpm/services/core/base.py +26 -11
  162. claude_mpm/services/core/interfaces/__init__.py +1 -3
  163. claude_mpm/services/core/interfaces/health.py +1 -4
  164. claude_mpm/services/core/models/__init__.py +2 -11
  165. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  166. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  167. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  168. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  169. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  171. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  172. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  173. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  174. claude_mpm/services/event_bus/direct_relay.py +3 -3
  175. claude_mpm/services/event_bus/event_bus.py +36 -3
  176. claude_mpm/services/event_bus/relay.py +23 -7
  177. claude_mpm/services/events/consumers/logging.py +1 -2
  178. claude_mpm/services/git/__init__.py +21 -0
  179. claude_mpm/services/git/git_operations_service.py +494 -0
  180. claude_mpm/services/github/__init__.py +21 -0
  181. claude_mpm/services/github/github_cli_service.py +397 -0
  182. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  183. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  184. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  185. claude_mpm/services/instructions/__init__.py +9 -0
  186. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  187. claude_mpm/services/local_ops/__init__.py +3 -13
  188. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  189. claude_mpm/services/local_ops/health_manager.py +1 -4
  190. claude_mpm/services/local_ops/process_manager.py +1 -1
  191. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  192. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  193. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  194. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  195. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  196. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  197. claude_mpm/services/memory/failure_tracker.py +19 -4
  198. claude_mpm/services/memory/optimizer.py +1 -1
  199. claude_mpm/services/model/model_router.py +8 -9
  200. claude_mpm/services/monitor/daemon.py +1 -1
  201. claude_mpm/services/monitor/server.py +2 -2
  202. claude_mpm/services/native_agent_converter.py +356 -0
  203. claude_mpm/services/port_manager.py +1 -1
  204. claude_mpm/services/pr/__init__.py +14 -0
  205. claude_mpm/services/pr/pr_template_service.py +329 -0
  206. claude_mpm/services/project/documentation_manager.py +2 -1
  207. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  208. claude_mpm/services/runner_configuration_service.py +1 -0
  209. claude_mpm/services/self_upgrade_service.py +165 -7
  210. claude_mpm/services/skills/__init__.py +18 -0
  211. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  212. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  213. claude_mpm/services/skills_config.py +547 -0
  214. claude_mpm/services/skills_deployer.py +955 -0
  215. claude_mpm/services/socketio/handlers/connection.py +1 -1
  216. claude_mpm/services/socketio/handlers/git.py +2 -2
  217. claude_mpm/services/socketio/server/core.py +1 -4
  218. claude_mpm/services/socketio/server/main.py +1 -3
  219. claude_mpm/services/system_instructions_service.py +1 -3
  220. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  221. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  222. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  223. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  224. claude_mpm/services/unified/unified_deployment.py +1 -5
  225. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  226. claude_mpm/services/visualization/__init__.py +1 -5
  227. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  228. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  229. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  230. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  231. claude_mpm/skills/skills_registry.py +0 -1
  232. claude_mpm/templates/questions/__init__.py +38 -0
  233. claude_mpm/templates/questions/base.py +193 -0
  234. claude_mpm/templates/questions/pr_strategy.py +311 -0
  235. claude_mpm/templates/questions/project_init.py +385 -0
  236. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  237. claude_mpm/tools/__main__.py +8 -8
  238. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  239. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  240. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  241. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  242. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  243. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  244. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  245. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  246. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  247. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  248. claude_mpm/utils/agent_dependency_loader.py +80 -13
  249. claude_mpm/utils/dependency_cache.py +3 -1
  250. claude_mpm/utils/gitignore.py +241 -0
  251. claude_mpm/utils/log_cleanup.py +3 -3
  252. claude_mpm/utils/progress.py +383 -0
  253. claude_mpm/utils/robust_installer.py +3 -5
  254. claude_mpm/utils/structured_questions.py +619 -0
  255. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  256. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
  257. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  258. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  259. claude_mpm/agents/templates/agent-manager.json +0 -273
  260. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  261. claude_mpm/agents/templates/api_qa.json +0 -180
  262. claude_mpm/agents/templates/clerk-ops.json +0 -235
  263. claude_mpm/agents/templates/code_analyzer.json +0 -101
  264. claude_mpm/agents/templates/content-agent.json +0 -358
  265. claude_mpm/agents/templates/dart_engineer.json +0 -307
  266. claude_mpm/agents/templates/data_engineer.json +0 -225
  267. claude_mpm/agents/templates/documentation.json +0 -211
  268. claude_mpm/agents/templates/engineer.json +0 -210
  269. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  270. claude_mpm/agents/templates/golang_engineer.json +0 -270
  271. claude_mpm/agents/templates/imagemagick.json +0 -264
  272. claude_mpm/agents/templates/java_engineer.json +0 -346
  273. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  274. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  275. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  276. claude_mpm/agents/templates/memory_manager.json +0 -158
  277. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  278. claude_mpm/agents/templates/ops.json +0 -185
  279. claude_mpm/agents/templates/php-engineer.json +0 -287
  280. claude_mpm/agents/templates/product_owner.json +0 -338
  281. claude_mpm/agents/templates/project_organizer.json +0 -140
  282. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  283. claude_mpm/agents/templates/python_engineer.json +0 -387
  284. claude_mpm/agents/templates/qa.json +0 -242
  285. claude_mpm/agents/templates/react_engineer.json +0 -238
  286. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  287. claude_mpm/agents/templates/research.json +0 -188
  288. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  289. claude_mpm/agents/templates/rust_engineer.json +0 -275
  290. claude_mpm/agents/templates/security.json +0 -202
  291. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  292. claude_mpm/agents/templates/ticketing.json +0 -177
  293. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  294. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  295. claude_mpm/agents/templates/version_control.json +0 -157
  296. claude_mpm/agents/templates/web_qa.json +0 -399
  297. claude_mpm/agents/templates/web_ui.json +0 -189
  298. claude_mpm/commands/mpm-tickets.md +0 -102
  299. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  300. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  301. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  302. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  303. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  304. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  305. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  306. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  307. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  308. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  309. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  310. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  311. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  312. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  313. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  314. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  315. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  316. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  317. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  318. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  319. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  320. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  321. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  322. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  323. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  324. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  325. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  326. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  327. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  328. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  329. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  330. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  332. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  333. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  334. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  335. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  337. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  338. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  339. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  340. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  341. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  343. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  344. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  345. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  346. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  347. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  349. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  351. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  352. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  353. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  354. claude_mpm/dashboard/static/built/react/events.js +0 -30
  355. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  356. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  357. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  358. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  359. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  360. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  361. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  362. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  363. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  364. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  370. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  382. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  383. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  384. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  385. claude_mpm/dashboard/static/events.html +0 -607
  386. claude_mpm/dashboard/static/index.html +0 -635
  387. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  388. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  389. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  390. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  391. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  392. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  393. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  394. claude_mpm/dashboard/static/legacy/files.html +0 -747
  395. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  396. claude_mpm/dashboard/static/monitors.html +0 -431
  397. claude_mpm/dashboard/static/production/events.html +0 -659
  398. claude_mpm/dashboard/static/production/main.html +0 -698
  399. claude_mpm/dashboard/static/production/monitors.html +0 -483
  400. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  401. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  402. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  403. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  404. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  405. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  406. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  407. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  408. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  409. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  410. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  411. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  412. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  413. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  414. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  415. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  416. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  417. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  418. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  419. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  420. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  421. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  422. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  423. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  424. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  425. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  426. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  427. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  432. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  433. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  434. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  435. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  436. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  437. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  438. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  439. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  440. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  441. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  442. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  443. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  444. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  445. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  446. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  447. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  448. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  449. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  450. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  451. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  452. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  453. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  454. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  455. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  456. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  457. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  458. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  459. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  460. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  461. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  462. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  463. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  464. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  465. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  466. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  467. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  468. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  469. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  472. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  473. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  478. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  479. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  480. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  481. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  482. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  483. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  484. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  485. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  486. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  487. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  488. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  489. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  490. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  491. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  492. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  493. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  494. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  495. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  496. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  497. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.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