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,587 +0,0 @@
1
- # Real-World Tracing Examples
2
-
3
- Detailed examples showing complete root cause tracing processes with full trace chains and solutions.
4
-
5
- ## Example 1: Git Init in Wrong Directory
6
-
7
- ### The Symptom
8
-
9
- **Observed behavior:**
10
- ```bash
11
- $ npm test
12
- ...
13
- Error: fatal: .git directory created in /Users/jesse/project/packages/core
14
- ```
15
-
16
- Tests were creating a `.git` directory in the source code folder instead of a temporary directory.
17
-
18
- ### Initial Investigation
19
-
20
- **First thought:** "Just validate the directory parameter in git init"
21
-
22
- **WRONG:** This would be a symptom fix. We need to find WHY the directory is wrong.
23
-
24
- ### The Trace
25
-
26
- #### Step 1: Find Immediate Cause
27
-
28
- ```typescript
29
- // worktree-manager.ts:45
30
- async function createSessionWorktree(projectDir: string, sessionId: string) {
31
- // This line creates .git in wrong place
32
- await execFileAsync('git', ['init'], { cwd: projectDir });
33
- }
34
- ```
35
-
36
- **Discovery:** `projectDir` is an empty string `''`
37
- **Why is this wrong:** Empty string as `cwd` resolves to `process.cwd()` (current directory)
38
-
39
- #### Step 2: Where Does Empty String Come From?
40
-
41
- ```typescript
42
- // session.ts:34
43
- static async create(name: string, projectDir: string) {
44
- const session = new Session(name);
45
- await session.initializeWorkspace(projectDir); // ← calls worktree manager
46
- return session;
47
- }
48
- ```
49
-
50
- **Discovery:** Session.create() receives `projectDir = ''`
51
- **Question:** Where does Session.create() get this value?
52
-
53
- #### Step 3: Trace to Caller
54
-
55
- ```typescript
56
- // project.ts:67
57
- static async create(name: string, directory: string) {
58
- await Session.create(name, directory); // ← passes directory through
59
- // ...
60
- }
61
- ```
62
-
63
- **Discovery:** Project.create() also receives `directory = ''`
64
- **Question:** What calls Project.create() with empty string?
65
-
66
- #### Step 4: Check Test Code
67
-
68
- ```typescript
69
- // project.test.ts:12
70
- const context = setupCoreTest();
71
- const PROJECT_DIR = context.tempDir; // ← Accessed at module load time!
72
-
73
- describe('Project', () => {
74
- it('should create project', async () => {
75
- await Project.create('test-project', PROJECT_DIR);
76
- });
77
- });
78
- ```
79
-
80
- **Discovery:** `PROJECT_DIR` is set to `context.tempDir` at module load time
81
- **Question:** What is `context.tempDir` at module load time?
82
-
83
- #### Step 5: Root Cause Found
84
-
85
- ```typescript
86
- // test-setup.ts
87
- export function setupCoreTest() {
88
- let _tempDir = ''; // ← Initial value is empty string
89
-
90
- beforeEach(() => {
91
- _tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'test-'));
92
- });
93
-
94
- afterEach(() => {
95
- if (_tempDir) fs.rmSync(_tempDir, { recursive: true });
96
- });
97
-
98
- return {
99
- tempDir: _tempDir // ← Returns empty string at module load time
100
- };
101
- }
102
- ```
103
-
104
- **ROOT CAUSE:** The test accesses `context.tempDir` at module load time (when defining `PROJECT_DIR`), but `_tempDir` is only set during `beforeEach`. At module load time, it's still `''`.
105
-
106
- ### The Solution
107
-
108
- #### Fix at Source
109
-
110
- ```typescript
111
- export function setupCoreTest() {
112
- let _tempDir: string | null = null; // ← null instead of empty string
113
-
114
- beforeEach(() => {
115
- _tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'test-'));
116
- });
117
-
118
- afterEach(() => {
119
- if (_tempDir) fs.rmSync(_tempDir, { recursive: true });
120
- _tempDir = null;
121
- });
122
-
123
- return {
124
- get tempDir(): string {
125
- if (!_tempDir) {
126
- throw new Error('tempDir accessed before beforeEach ran');
127
- }
128
- return _tempDir;
129
- }
130
- };
131
- }
132
- ```
133
-
134
- **Why this works:**
135
- - Accessing `context.tempDir` at module load time now throws immediately
136
- - Forces tests to access it only within test cases
137
- - Clear error message guides developers to fix
138
-
139
- #### Add Defense-in-Depth
140
-
141
- ```typescript
142
- // Layer 1: Project.create() validates directory
143
- static async create(name: string, directory: string) {
144
- if (!directory || directory.trim() === '') {
145
- throw new Error('Project directory cannot be empty');
146
- }
147
- // ...
148
- }
149
-
150
- // Layer 2: WorkspaceManager validates not empty
151
- async function initializeWorkspace(projectDir: string) {
152
- if (!projectDir) {
153
- throw new Error('projectDir cannot be empty');
154
- }
155
- // ...
156
- }
157
-
158
- // Layer 3: NODE_ENV guard refuses git init outside tmpdir
159
- async function createSessionWorktree(projectDir: string, sessionId: string) {
160
- if (process.env.NODE_ENV === 'test' && !projectDir.includes('tmp')) {
161
- throw new Error(`Test safety: refusing git init outside tmpdir: ${projectDir}`);
162
- }
163
- await execFileAsync('git', ['init'], { cwd: projectDir });
164
- }
165
-
166
- // Layer 4: Stack trace logging before git init
167
- async function createSessionWorktree(projectDir: string, sessionId: string) {
168
- if (!projectDir || projectDir === process.cwd()) {
169
- console.error('DEBUG git init:', {
170
- projectDir,
171
- cwd: process.cwd(),
172
- stack: new Error().stack
173
- });
174
- }
175
- await execFileAsync('git', ['init'], { cwd: projectDir });
176
- }
177
- ```
178
-
179
- ### Results
180
-
181
- - 1847 tests passed
182
- - Zero `.git` pollution
183
- - Clear error message for similar issues
184
- - Multiple layers prevent similar bugs
185
-
186
- ### Time Saved
187
-
188
- **With root cause tracing:** 45 minutes
189
- **Without (symptom fixes):** 3+ hours of whack-a-mole
190
-
191
- ## Example 2: Database Connection URL Wrong
192
-
193
- ### The Symptom
194
-
195
- ```
196
- Error: Connection failed: database "undefined" does not exist
197
- at Database.connect (database.ts:34)
198
- ```
199
-
200
- Application crashes on startup because database name is undefined.
201
-
202
- ### The Trace
203
-
204
- #### Step 1: Find Immediate Cause
205
-
206
- ```typescript
207
- // database.ts:34
208
- async function connect(url: string) {
209
- this.connection = await pg.connect(url); // ← Crashes here
210
- }
211
- ```
212
-
213
- **Discovery:** `url = "postgresql://localhost/undefined"`
214
- **Why is this wrong:** Database name is literally the string "undefined"
215
-
216
- #### Step 2: Where Does URL Come From?
217
-
218
- ```typescript
219
- // database.ts:12
220
- constructor(config: DatabaseConfig) {
221
- this.url = `postgresql://${config.host}/${config.database}`; // ← constructs URL
222
- }
223
- ```
224
-
225
- **Discovery:** `config.database = undefined`
226
- **Question:** Where does config come from?
227
-
228
- #### Step 3: Trace to Configuration Loading
229
-
230
- ```typescript
231
- // app.ts:23
232
- const dbConfig: DatabaseConfig = {
233
- host: process.env.DATABASE_HOST || 'localhost',
234
- database: process.env.DATABASE_NAME, // ← No default value!
235
- port: parseInt(process.env.DATABASE_PORT || '5432')
236
- };
237
- ```
238
-
239
- **Discovery:** `DATABASE_NAME` environment variable is not set
240
- **Question:** Why isn't it set?
241
-
242
- #### Step 4: Check Environment Setup
243
-
244
- ```typescript
245
- // .env file
246
- DATABASE_HOST=localhost
247
- DATABASE_PORT=5432
248
- # DATABASE_NAME missing!
249
- ```
250
-
251
- **ROOT CAUSE:** Environment variable not defined, and code doesn't validate required variables.
252
-
253
- ### The Solution
254
-
255
- #### Fix at Source
256
-
257
- ```typescript
258
- // config.ts - Load and validate environment
259
- export function loadDatabaseConfig(): DatabaseConfig {
260
- const requiredEnvVars = ['DATABASE_NAME', 'DATABASE_HOST'];
261
- const missing = requiredEnvVars.filter(v => !process.env[v]);
262
-
263
- if (missing.length > 0) {
264
- throw new Error(`Required environment variables missing: ${missing.join(', ')}`);
265
- }
266
-
267
- return {
268
- host: process.env.DATABASE_HOST!,
269
- database: process.env.DATABASE_NAME!,
270
- port: parseInt(process.env.DATABASE_PORT || '5432')
271
- };
272
- }
273
- ```
274
-
275
- #### Add Defense-in-Depth
276
-
277
- ```typescript
278
- // Layer 1: Type-safe config with validation
279
- interface DatabaseConfig {
280
- host: string;
281
- database: string;
282
- port: number;
283
- }
284
-
285
- // Layer 2: Constructor validates config
286
- constructor(config: DatabaseConfig) {
287
- if (!config.database || config.database === 'undefined') {
288
- throw new Error('Database name cannot be empty or undefined');
289
- }
290
- this.url = `postgresql://${config.host}/${config.database}`;
291
- }
292
-
293
- // Layer 3: Validate URL before connect
294
- async function connect(url: string) {
295
- if (url.includes('/undefined')) {
296
- throw new Error(`Invalid database URL: ${url}`);
297
- }
298
- this.connection = await pg.connect(url);
299
- }
300
- ```
301
-
302
- ### Results
303
-
304
- - Application fails fast at startup with clear error
305
- - Developers immediately know which env var is missing
306
- - Prevents confusing "database undefined does not exist" error
307
-
308
- ## Example 3: User ID = 0 in Database Query
309
-
310
- ### The Symptom
311
-
312
- ```
313
- Error: Cannot query user: id cannot be 0
314
- at UserRepository.findById (user-repository.ts:45)
315
- ```
316
-
317
- Database query fails because user ID is 0 (invalid).
318
-
319
- ### The Trace
320
-
321
- #### Step 1: Find Immediate Cause
322
-
323
- ```typescript
324
- // user-repository.ts:45
325
- async findById(id: number): Promise<User> {
326
- if (id === 0) {
327
- throw new Error('Cannot query user: id cannot be 0');
328
- }
329
- return await this.db.query('SELECT * FROM users WHERE id = ?', [id]);
330
- }
331
- ```
332
-
333
- **Discovery:** `id = 0` being passed to query
334
- **Question:** Where does this come from?
335
-
336
- #### Step 2: Trace to Caller
337
-
338
- ```typescript
339
- // auth-middleware.ts:67
340
- async authenticate(req: Request): Promise<User> {
341
- const userId = this.extractUserId(req);
342
- return await this.userRepo.findById(userId); // ← userId is 0
343
- }
344
- ```
345
-
346
- **Discovery:** `extractUserId()` returns 0
347
- **Question:** Why does it return 0?
348
-
349
- #### Step 3: Check ID Extraction
350
-
351
- ```typescript
352
- // auth-middleware.ts:34
353
- private extractUserId(req: Request): number {
354
- const token = req.headers.authorization?.replace('Bearer ', '');
355
- if (!token) return 0; // ← Default to 0 if no token!
356
-
357
- const decoded = jwt.verify(token, SECRET);
358
- return decoded.userId;
359
- }
360
- ```
361
-
362
- **Discovery:** Returns 0 when no authorization header
363
- **Question:** Why is there no authorization header?
364
-
365
- #### Step 4: Check Request Handling
366
-
367
- ```typescript
368
- // router.ts:23
369
- app.get('/api/user/profile', async (req, res) => {
370
- const user = await authMiddleware.authenticate(req); // ← Called on public route!
371
- res.json(user);
372
- });
373
- ```
374
-
375
- **ROOT CAUSE:** Authentication middleware called on public route that doesn't require authentication. When no token present, it defaults to userId=0.
376
-
377
- ### The Solution
378
-
379
- #### Fix at Source
380
-
381
- ```typescript
382
- // router.ts - Separate public and protected routes
383
- app.get('/api/public/profile', async (req, res) => {
384
- // Public route - no authentication
385
- res.json({ message: 'Public profile' });
386
- });
387
-
388
- app.get('/api/user/profile',
389
- requireAuth(), // ← Middleware throws if no auth
390
- async (req, res) => {
391
- const user = await authMiddleware.authenticate(req);
392
- res.json(user);
393
- }
394
- );
395
- ```
396
-
397
- #### Add Defense-in-Depth
398
-
399
- ```typescript
400
- // Layer 1: Don't default to 0, throw instead
401
- private extractUserId(req: Request): number {
402
- const token = req.headers.authorization?.replace('Bearer ', '');
403
- if (!token) {
404
- throw new UnauthorizedError('No authorization token provided');
405
- }
406
-
407
- const decoded = jwt.verify(token, SECRET);
408
- return decoded.userId;
409
- }
410
-
411
- // Layer 2: Validate userId before query
412
- async findById(id: number): Promise<User> {
413
- if (!id || id <= 0) {
414
- throw new Error(`Invalid user ID: ${id}`);
415
- }
416
- return await this.db.query('SELECT * FROM users WHERE id = ?', [id]);
417
- }
418
-
419
- // Layer 3: Type system (use branded types)
420
- type UserId = number & { readonly __brand: 'UserId' };
421
-
422
- function validateUserId(id: number): UserId {
423
- if (!id || id <= 0) throw new Error('Invalid user ID');
424
- return id as UserId;
425
- }
426
- ```
427
-
428
- ### Results
429
-
430
- - Authentication errors are clear and immediate
431
- - Protected routes always require authentication
432
- - No magic "0" default that causes confusing errors
433
-
434
- ## Example 4: React Component Renders Wrong Data
435
-
436
- ### The Symptom
437
-
438
- ```
439
- Component shows data from previous user after logout/login
440
- ```
441
-
442
- User logs out, logs in as different user, but sees previous user's data briefly.
443
-
444
- ### The Trace
445
-
446
- #### Step 1: Observe Behavior
447
-
448
- - User A logs in → sees correct data
449
- - User A logs out → data clears
450
- - User B logs in → sees User A's data for ~100ms
451
- - After 100ms → sees correct User B data
452
-
453
- **Discovery:** Stale data being shown before new data loads
454
-
455
- #### Step 2: Check Component Data Source
456
-
457
- ```typescript
458
- // UserDashboard.tsx
459
- function UserDashboard() {
460
- const user = useSelector(state => state.auth.user);
461
- const data = useSelector(state => state.userData.data);
462
-
463
- useEffect(() => {
464
- dispatch(fetchUserData(user.id)); // ← Fetches new data
465
- }, [user.id]);
466
-
467
- return <div>{data.name}</div>; // ← Shows stale data during fetch
468
- }
469
- ```
470
-
471
- **Discovery:** Redux store still has old user's data when new user logs in
472
- **Question:** Why isn't the old data cleared?
473
-
474
- #### Step 3: Check Login/Logout Actions
475
-
476
- ```typescript
477
- // auth.actions.ts
478
- export function logout() {
479
- return { type: 'LOGOUT' }; // ← Only clears auth state
480
- }
481
-
482
- // auth.reducer.ts
483
- case 'LOGOUT':
484
- return { user: null }; // ← Only clears user
485
-
486
- // userData.reducer.ts (SEPARATE REDUCER)
487
- case 'FETCH_USER_DATA':
488
- return { ...state, data: action.payload }; // ← Never cleared!
489
- ```
490
-
491
- **ROOT CAUSE:** Logout action only clears auth state, not user data. User data reducer never listens to LOGOUT action.
492
-
493
- ### The Solution
494
-
495
- #### Fix at Source
496
-
497
- ```typescript
498
- // userData.reducer.ts
499
- import { LOGOUT } from './auth.actions';
500
-
501
- case LOGOUT:
502
- return initialState; // ← Clear data on logout
503
-
504
- case 'FETCH_USER_DATA':
505
- return { ...state, data: action.payload };
506
- ```
507
-
508
- #### Add Defense-in-Depth
509
-
510
- ```typescript
511
- // Layer 1: Clear all data on logout
512
- export function logout() {
513
- return (dispatch) => {
514
- dispatch({ type: 'LOGOUT' });
515
- dispatch({ type: 'CLEAR_USER_DATA' });
516
- dispatch({ type: 'CLEAR_PREFERENCES' });
517
- dispatch({ type: 'CLEAR_CACHE' });
518
- };
519
- }
520
-
521
- // Layer 2: Check user ID matches before showing data
522
- function UserDashboard() {
523
- const user = useSelector(state => state.auth.user);
524
- const userData = useSelector(state => state.userData.data);
525
-
526
- // Don't show data if user IDs don't match
527
- const dataIsValid = userData && userData.userId === user?.id;
528
-
529
- return <div>{dataIsValid ? userData.name : 'Loading...'}</div>;
530
- }
531
-
532
- // Layer 3: Reset all reducers on logout
533
- const appReducer = combineReducers({
534
- auth: authReducer,
535
- userData: userDataReducer,
536
- // ...
537
- });
538
-
539
- const rootReducer = (state, action) => {
540
- if (action.type === 'LOGOUT') {
541
- state = undefined; // ← Reset entire store
542
- }
543
- return appReducer(state, action);
544
- };
545
- ```
546
-
547
- ### Results
548
-
549
- - No stale data shown after logout
550
- - Clean state for each user session
551
- - Prevents data leakage between users
552
-
553
- ## Common Patterns Across Examples
554
-
555
- ### Pattern: Unvalidated Input at Boundaries
556
-
557
- **Examples:**
558
- - Git init: Empty string not caught at entry point
559
- - Database: Missing env var not validated at startup
560
- - User ID: Missing token defaulted to 0
561
-
562
- **Solution:** Validate at system boundaries (entry points, config loading)
563
-
564
- ### Pattern: State Not Cleared on Transitions
565
-
566
- **Examples:**
567
- - Test setup: tempDir accessed before initialization
568
- - React: User data not cleared on logout
569
-
570
- **Solution:** Explicit state transitions with cleanup
571
-
572
- ### Pattern: Magic Default Values
573
-
574
- **Examples:**
575
- - Empty string defaulting to process.cwd()
576
- - 0 as default user ID
577
- - undefined becoming string "undefined"
578
-
579
- **Solution:** No magic defaults - fail fast with errors
580
-
581
- ## Takeaways
582
-
583
- 1. **Never stop at symptoms** - Always trace to root cause
584
- 2. **Fix at source** - Don't add bandaids at error point
585
- 3. **Add defense** - Multiple layers catch similar issues
586
- 4. **Document trace** - Write down call chain as you go
587
- 5. **Verify fix** - Ensure fix addresses root cause, not just symptom