claude-mpm 4.21.3__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 (484) 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 +11 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -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 +10 -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/interfaces/__init__.py +1 -3
  162. claude_mpm/services/core/interfaces/health.py +1 -4
  163. claude_mpm/services/core/models/__init__.py +2 -11
  164. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  165. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  166. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  167. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  168. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  169. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  171. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  172. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  173. claude_mpm/services/event_bus/direct_relay.py +3 -3
  174. claude_mpm/services/event_bus/event_bus.py +36 -3
  175. claude_mpm/services/events/consumers/logging.py +1 -2
  176. claude_mpm/services/git/__init__.py +21 -0
  177. claude_mpm/services/git/git_operations_service.py +494 -0
  178. claude_mpm/services/github/__init__.py +21 -0
  179. claude_mpm/services/github/github_cli_service.py +397 -0
  180. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  181. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  182. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  183. claude_mpm/services/instructions/__init__.py +9 -0
  184. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  185. claude_mpm/services/local_ops/__init__.py +3 -13
  186. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  187. claude_mpm/services/local_ops/health_manager.py +1 -4
  188. claude_mpm/services/local_ops/process_manager.py +1 -1
  189. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  190. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  191. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  192. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  193. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  194. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  195. claude_mpm/services/memory/optimizer.py +1 -1
  196. claude_mpm/services/model/model_router.py +8 -9
  197. claude_mpm/services/monitor/daemon.py +1 -1
  198. claude_mpm/services/monitor/server.py +2 -2
  199. claude_mpm/services/native_agent_converter.py +356 -0
  200. claude_mpm/services/port_manager.py +1 -1
  201. claude_mpm/services/pr/__init__.py +14 -0
  202. claude_mpm/services/pr/pr_template_service.py +329 -0
  203. claude_mpm/services/project/documentation_manager.py +2 -1
  204. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  205. claude_mpm/services/runner_configuration_service.py +1 -0
  206. claude_mpm/services/self_upgrade_service.py +165 -7
  207. claude_mpm/services/skills/__init__.py +18 -0
  208. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  209. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  210. claude_mpm/services/skills_config.py +547 -0
  211. claude_mpm/services/skills_deployer.py +955 -0
  212. claude_mpm/services/socketio/handlers/connection.py +1 -1
  213. claude_mpm/services/socketio/handlers/git.py +2 -2
  214. claude_mpm/services/socketio/server/core.py +1 -4
  215. claude_mpm/services/socketio/server/main.py +1 -3
  216. claude_mpm/services/system_instructions_service.py +1 -3
  217. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  218. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  219. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  220. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  221. claude_mpm/services/unified/unified_deployment.py +1 -5
  222. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  223. claude_mpm/services/visualization/__init__.py +1 -5
  224. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  225. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  226. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  227. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  228. claude_mpm/skills/skills_registry.py +0 -1
  229. claude_mpm/templates/questions/__init__.py +38 -0
  230. claude_mpm/templates/questions/base.py +193 -0
  231. claude_mpm/templates/questions/pr_strategy.py +311 -0
  232. claude_mpm/templates/questions/project_init.py +385 -0
  233. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  234. claude_mpm/tools/__main__.py +8 -8
  235. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  236. claude_mpm/utils/agent_dependency_loader.py +80 -13
  237. claude_mpm/utils/dependency_cache.py +3 -1
  238. claude_mpm/utils/gitignore.py +241 -0
  239. claude_mpm/utils/log_cleanup.py +3 -3
  240. claude_mpm/utils/progress.py +383 -0
  241. claude_mpm/utils/robust_installer.py +3 -5
  242. claude_mpm/utils/structured_questions.py +619 -0
  243. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  244. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
  245. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  246. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  247. claude_mpm/agents/templates/agent-manager.json +0 -273
  248. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  249. claude_mpm/agents/templates/api_qa.json +0 -180
  250. claude_mpm/agents/templates/clerk-ops.json +0 -235
  251. claude_mpm/agents/templates/code_analyzer.json +0 -101
  252. claude_mpm/agents/templates/content-agent.json +0 -358
  253. claude_mpm/agents/templates/dart_engineer.json +0 -307
  254. claude_mpm/agents/templates/data_engineer.json +0 -225
  255. claude_mpm/agents/templates/documentation.json +0 -211
  256. claude_mpm/agents/templates/engineer.json +0 -210
  257. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  258. claude_mpm/agents/templates/golang_engineer.json +0 -270
  259. claude_mpm/agents/templates/imagemagick.json +0 -264
  260. claude_mpm/agents/templates/java_engineer.json +0 -346
  261. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  262. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  263. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  264. claude_mpm/agents/templates/memory_manager.json +0 -158
  265. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  266. claude_mpm/agents/templates/ops.json +0 -185
  267. claude_mpm/agents/templates/php-engineer.json +0 -287
  268. claude_mpm/agents/templates/product_owner.json +0 -338
  269. claude_mpm/agents/templates/project_organizer.json +0 -140
  270. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  271. claude_mpm/agents/templates/python_engineer.json +0 -387
  272. claude_mpm/agents/templates/qa.json +0 -242
  273. claude_mpm/agents/templates/react_engineer.json +0 -238
  274. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  275. claude_mpm/agents/templates/research.json +0 -188
  276. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  277. claude_mpm/agents/templates/rust_engineer.json +0 -275
  278. claude_mpm/agents/templates/security.json +0 -202
  279. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  280. claude_mpm/agents/templates/ticketing.json +0 -177
  281. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  282. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  283. claude_mpm/agents/templates/version_control.json +0 -157
  284. claude_mpm/agents/templates/web_qa.json +0 -399
  285. claude_mpm/agents/templates/web_ui.json +0 -189
  286. claude_mpm/commands/mpm-tickets.md +0 -102
  287. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  288. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  289. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  290. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  291. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  292. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  293. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  294. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  295. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  296. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  297. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  298. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  299. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  300. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  301. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  302. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  303. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  304. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  305. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  306. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  307. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  308. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  309. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  310. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  311. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  312. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  313. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  314. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  315. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  316. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  317. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  318. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  319. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  320. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  321. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  322. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  323. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  324. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  325. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  326. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  327. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  328. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  329. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  330. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  332. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  333. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  334. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  335. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  337. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  338. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  339. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  340. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  341. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  342. claude_mpm/dashboard/static/built/react/events.js +0 -30
  343. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  344. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  345. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  346. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  347. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  348. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  349. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  350. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  351. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  352. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  353. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  354. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  355. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  356. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  357. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  358. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  359. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  370. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  371. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  372. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  373. claude_mpm/dashboard/static/events.html +0 -607
  374. claude_mpm/dashboard/static/index.html +0 -635
  375. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  376. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  377. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  378. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  379. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  380. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  381. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  382. claude_mpm/dashboard/static/legacy/files.html +0 -747
  383. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  384. claude_mpm/dashboard/static/monitors.html +0 -431
  385. claude_mpm/dashboard/static/production/events.html +0 -659
  386. claude_mpm/dashboard/static/production/main.html +0 -698
  387. claude_mpm/dashboard/static/production/monitors.html +0 -483
  388. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  389. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  390. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  391. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  392. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  393. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  394. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  395. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  396. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  397. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  398. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  399. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  400. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  401. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  402. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  403. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  404. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  405. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  406. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  407. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  408. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  409. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  410. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  411. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  412. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  413. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  414. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  415. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  416. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  417. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  418. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  419. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  420. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  421. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  422. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  423. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  424. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  425. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  426. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  427. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  428. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  429. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  430. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  431. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  435. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  436. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  437. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  438. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  439. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  440. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  441. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  442. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  443. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  444. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  445. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  446. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  447. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  448. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  449. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  450. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  451. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  452. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  458. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  459. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  460. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  461. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  462. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  463. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  464. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  465. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  467. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  468. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  469. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  470. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  471. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  472. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  473. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  474. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  475. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  476. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  477. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  478. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  479. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  480. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  481. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  482. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  483. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  484. {claude_mpm-4.21.3.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