claude-mpm 4.25.10__py3-none-any.whl → 5.1.8__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 (507) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +1055 -2230
  4. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  5. claude_mpm/agents/WORKFLOW.md +4 -4
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent_loader.py +10 -35
  9. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +576 -66
  10. claude_mpm/agents/templates/context-management-examples.md +544 -0
  11. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  12. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  13. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  14. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  15. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  16. claude_mpm/cli/__init__.py +28 -3
  17. claude_mpm/cli/commands/__init__.py +2 -0
  18. claude_mpm/cli/commands/agent_source.py +774 -0
  19. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  20. claude_mpm/cli/commands/agents.py +959 -36
  21. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  22. claude_mpm/cli/commands/agents_discover.py +338 -0
  23. claude_mpm/cli/commands/auto_configure.py +537 -239
  24. claude_mpm/cli/commands/config.py +7 -4
  25. claude_mpm/cli/commands/configure.py +924 -45
  26. claude_mpm/cli/commands/configure_navigation.py +63 -46
  27. claude_mpm/cli/commands/doctor.py +10 -2
  28. claude_mpm/cli/commands/local_deploy.py +1 -4
  29. claude_mpm/cli/commands/postmortem.py +401 -0
  30. claude_mpm/cli/commands/run.py +1 -39
  31. claude_mpm/cli/commands/skill_source.py +694 -0
  32. claude_mpm/cli/commands/skills.py +322 -19
  33. claude_mpm/cli/executor.py +22 -3
  34. claude_mpm/cli/interactive/agent_wizard.py +1028 -43
  35. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  36. claude_mpm/cli/parsers/agents_parser.py +256 -4
  37. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  38. claude_mpm/cli/parsers/base_parser.py +25 -0
  39. claude_mpm/cli/parsers/config_parser.py +96 -43
  40. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  41. claude_mpm/cli/parsers/skills_parser.py +7 -0
  42. claude_mpm/cli/parsers/source_parser.py +138 -0
  43. claude_mpm/cli/startup.py +456 -103
  44. claude_mpm/cli/startup_display.py +4 -4
  45. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  46. claude_mpm/commands/mpm-agents-detect.md +9 -0
  47. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  48. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  49. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  50. claude_mpm/commands/mpm-doctor.md +9 -0
  51. claude_mpm/commands/mpm-help.md +14 -2
  52. claude_mpm/commands/mpm-init.md +9 -0
  53. claude_mpm/commands/mpm-monitor.md +9 -0
  54. claude_mpm/commands/mpm-postmortem.md +123 -0
  55. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  56. claude_mpm/commands/mpm-status.md +9 -0
  57. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  58. claude_mpm/commands/mpm-ticket-view.md +552 -0
  59. claude_mpm/commands/mpm-version.md +9 -0
  60. claude_mpm/commands/mpm.md +10 -0
  61. claude_mpm/config/agent_presets.py +488 -0
  62. claude_mpm/config/agent_sources.py +325 -0
  63. claude_mpm/config/skill_presets.py +392 -0
  64. claude_mpm/config/skill_sources.py +590 -0
  65. claude_mpm/constants.py +1 -0
  66. claude_mpm/core/claude_runner.py +5 -34
  67. claude_mpm/core/config.py +16 -0
  68. claude_mpm/core/framework/__init__.py +3 -16
  69. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  70. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  71. claude_mpm/core/interactive_session.py +83 -7
  72. claude_mpm/core/oneshot_session.py +71 -8
  73. claude_mpm/core/protocols/__init__.py +23 -0
  74. claude_mpm/core/protocols/runner_protocol.py +103 -0
  75. claude_mpm/core/protocols/session_protocol.py +131 -0
  76. claude_mpm/core/shared/singleton_manager.py +11 -4
  77. claude_mpm/core/system_context.py +38 -0
  78. claude_mpm/core/unified_config.py +22 -0
  79. claude_mpm/experimental/cli_enhancements.py +1 -5
  80. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  85. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  86. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  87. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  88. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  89. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  90. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  91. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  92. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  93. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  94. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  95. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  96. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  97. claude_mpm/models/git_repository.py +198 -0
  98. claude_mpm/services/agents/agent_builder.py +45 -9
  99. claude_mpm/services/agents/agent_preset_service.py +238 -0
  100. claude_mpm/services/agents/agent_selection_service.py +484 -0
  101. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  102. claude_mpm/services/agents/cache_git_manager.py +621 -0
  103. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  104. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  105. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  106. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  107. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  108. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  109. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  110. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  111. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  112. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  113. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  114. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  115. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  116. claude_mpm/services/agents/git_source_manager.py +629 -0
  117. claude_mpm/services/agents/loading/framework_agent_loader.py +1 -4
  118. claude_mpm/services/agents/local_template_manager.py +47 -9
  119. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  120. claude_mpm/services/agents/sources/__init__.py +13 -0
  121. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  122. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  123. claude_mpm/services/agents/startup_sync.py +239 -0
  124. claude_mpm/services/agents/toolchain_detector.py +474 -0
  125. claude_mpm/services/analysis/__init__.py +25 -0
  126. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  127. claude_mpm/services/analysis/postmortem_service.py +765 -0
  128. claude_mpm/services/command_deployment_service.py +200 -6
  129. claude_mpm/services/core/base.py +7 -2
  130. claude_mpm/services/core/interfaces/__init__.py +1 -3
  131. claude_mpm/services/core/interfaces/health.py +1 -4
  132. claude_mpm/services/core/models/__init__.py +2 -11
  133. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  134. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  135. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  136. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  137. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  138. claude_mpm/services/diagnostics/doctor_reporter.py +34 -6
  139. claude_mpm/services/git/__init__.py +21 -0
  140. claude_mpm/services/git/git_operations_service.py +494 -0
  141. claude_mpm/services/github/__init__.py +21 -0
  142. claude_mpm/services/github/github_cli_service.py +397 -0
  143. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  144. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  145. claude_mpm/services/instructions/__init__.py +9 -0
  146. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  147. claude_mpm/services/local_ops/__init__.py +3 -13
  148. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  149. claude_mpm/services/local_ops/health_manager.py +1 -4
  150. claude_mpm/services/mcp_config_manager.py +75 -145
  151. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  152. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  153. claude_mpm/services/mcp_service_verifier.py +6 -3
  154. claude_mpm/services/monitor/daemon.py +28 -8
  155. claude_mpm/services/monitor/daemon_manager.py +96 -19
  156. claude_mpm/services/pr/__init__.py +14 -0
  157. claude_mpm/services/pr/pr_template_service.py +329 -0
  158. claude_mpm/services/project/project_organizer.py +4 -0
  159. claude_mpm/services/runner_configuration_service.py +16 -3
  160. claude_mpm/services/session_management_service.py +16 -4
  161. claude_mpm/services/skills/__init__.py +18 -0
  162. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  163. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  164. claude_mpm/services/socketio/server/core.py +1 -4
  165. claude_mpm/services/socketio/server/main.py +1 -3
  166. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  167. claude_mpm/services/unified/unified_deployment.py +1 -5
  168. claude_mpm/services/visualization/__init__.py +1 -5
  169. claude_mpm/templates/questions/__init__.py +2 -7
  170. claude_mpm/templates/questions/pr_strategy.py +1 -4
  171. claude_mpm/templates/questions/project_init.py +1 -4
  172. claude_mpm/templates/questions/ticket_mgmt.py +1 -4
  173. claude_mpm/utils/agent_dependency_loader.py +77 -10
  174. claude_mpm/utils/agent_filters.py +288 -0
  175. claude_mpm/utils/gitignore.py +3 -0
  176. claude_mpm/utils/migration.py +372 -0
  177. claude_mpm/utils/progress.py +387 -0
  178. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +356 -112
  179. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +188 -439
  180. claude_mpm/agents/templates/agent-manager.json +0 -273
  181. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  182. claude_mpm/agents/templates/api_qa.json +0 -183
  183. claude_mpm/agents/templates/clerk-ops.json +0 -235
  184. claude_mpm/agents/templates/code_analyzer.json +0 -101
  185. claude_mpm/agents/templates/content-agent.json +0 -358
  186. claude_mpm/agents/templates/dart_engineer.json +0 -307
  187. claude_mpm/agents/templates/data_engineer.json +0 -225
  188. claude_mpm/agents/templates/documentation.json +0 -238
  189. claude_mpm/agents/templates/engineer.json +0 -210
  190. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  191. claude_mpm/agents/templates/golang_engineer.json +0 -270
  192. claude_mpm/agents/templates/imagemagick.json +0 -264
  193. claude_mpm/agents/templates/java_engineer.json +0 -346
  194. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  195. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  196. claude_mpm/agents/templates/memory_manager.json +0 -158
  197. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  198. claude_mpm/agents/templates/ops.json +0 -185
  199. claude_mpm/agents/templates/php-engineer.json +0 -287
  200. claude_mpm/agents/templates/product_owner.json +0 -338
  201. claude_mpm/agents/templates/project_organizer.json +0 -144
  202. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  203. claude_mpm/agents/templates/python_engineer.json +0 -387
  204. claude_mpm/agents/templates/qa.json +0 -243
  205. claude_mpm/agents/templates/react_engineer.json +0 -239
  206. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  207. claude_mpm/agents/templates/research.json +0 -258
  208. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  209. claude_mpm/agents/templates/rust_engineer.json +0 -275
  210. claude_mpm/agents/templates/security.json +0 -202
  211. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  212. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  213. claude_mpm/agents/templates/ticketing.json +0 -181
  214. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  215. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  216. claude_mpm/agents/templates/version_control.json +0 -159
  217. claude_mpm/agents/templates/web_qa.json +0 -400
  218. claude_mpm/agents/templates/web_ui.json +0 -189
  219. claude_mpm/cli/README.md +0 -253
  220. claude_mpm/cli/commands/mcp_install_commands.py.backup +0 -284
  221. claude_mpm/cli/commands/mpm_init/README.md +0 -365
  222. claude_mpm/cli_module/refactoring_guide.md +0 -253
  223. claude_mpm/commands/mpm-tickets.md +0 -151
  224. claude_mpm/config/agent_capabilities.yaml +0 -658
  225. claude_mpm/config/async_logging_config.yaml +0 -145
  226. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +0 -34
  227. claude_mpm/d2/.gitignore +0 -22
  228. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +0 -273
  229. claude_mpm/d2/FLASK_INTEGRATION.md +0 -156
  230. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +0 -452
  231. claude_mpm/d2/QUICKSTART.md +0 -186
  232. claude_mpm/d2/README.md +0 -232
  233. claude_mpm/d2/STORE_FIX_SUMMARY.md +0 -167
  234. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +0 -180
  235. claude_mpm/d2/TESTING.md +0 -288
  236. claude_mpm/d2/index.html +0 -118
  237. claude_mpm/d2/package.json +0 -19
  238. claude_mpm/d2/src/App.svelte +0 -110
  239. claude_mpm/d2/src/components/Header.svelte +0 -153
  240. claude_mpm/d2/src/components/MainContent.svelte +0 -74
  241. claude_mpm/d2/src/components/Sidebar.svelte +0 -85
  242. claude_mpm/d2/src/components/tabs/EventsTab.svelte +0 -326
  243. claude_mpm/d2/src/lib/socketio.js +0 -144
  244. claude_mpm/d2/src/main.js +0 -7
  245. claude_mpm/d2/src/stores/events.js +0 -114
  246. claude_mpm/d2/src/stores/socket.js +0 -108
  247. claude_mpm/d2/src/stores/theme.js +0 -65
  248. claude_mpm/d2/svelte.config.js +0 -12
  249. claude_mpm/d2/vite.config.js +0 -15
  250. claude_mpm/dashboard/.claude-mpm/memories/README.md +0 -36
  251. claude_mpm/dashboard/BUILD_NUMBER +0 -1
  252. claude_mpm/dashboard/README.md +0 -121
  253. claude_mpm/dashboard/VERSION +0 -1
  254. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  255. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +0 -273
  256. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +0 -75
  257. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  258. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +0 -141
  259. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  260. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +0 -36
  261. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  262. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +0 -89
  263. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +0 -215
  264. claude_mpm/dashboard/react/entries/events.tsx +0 -165
  265. claude_mpm/dashboard/react/hooks/useEvents.ts +0 -191
  266. claude_mpm/dashboard/react/hooks/useSocket.ts +0 -225
  267. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  268. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +0 -170
  269. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  270. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  271. claude_mpm/dashboard/static/built/components/activity-tree.js.map +0 -1
  272. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  273. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  274. claude_mpm/dashboard/static/built/components/agent-inference.js.map +0 -1
  275. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  276. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  277. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  278. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  279. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  280. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  281. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  282. claude_mpm/dashboard/static/built/components/code-tree.js.map +0 -1
  283. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  284. claude_mpm/dashboard/static/built/components/code-viewer.js.map +0 -1
  285. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  286. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  287. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  288. claude_mpm/dashboard/static/built/components/event-processor.js.map +0 -1
  289. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  290. claude_mpm/dashboard/static/built/components/event-viewer.js.map +0 -1
  291. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  292. claude_mpm/dashboard/static/built/components/export-manager.js.map +0 -1
  293. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  294. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  295. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  296. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +0 -1
  297. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  298. claude_mpm/dashboard/static/built/components/file-viewer.js.map +0 -1
  299. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  300. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +0 -1
  301. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  302. claude_mpm/dashboard/static/built/components/hud-manager.js.map +0 -1
  303. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  304. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +0 -1
  305. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  306. claude_mpm/dashboard/static/built/components/module-viewer.js.map +0 -1
  307. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  308. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  309. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  310. claude_mpm/dashboard/static/built/components/session-manager.js.map +0 -1
  311. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  312. claude_mpm/dashboard/static/built/components/socket-manager.js.map +0 -1
  313. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  314. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +0 -1
  315. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  316. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +0 -1
  317. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  318. claude_mpm/dashboard/static/built/components/working-directory.js.map +0 -1
  319. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  320. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  321. claude_mpm/dashboard/static/built/dashboard.js.map +0 -1
  322. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  323. claude_mpm/dashboard/static/built/react/events.js +0 -30
  324. claude_mpm/dashboard/static/built/react/events.js.map +0 -1
  325. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  326. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  327. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  328. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  329. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  330. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  331. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  332. claude_mpm/dashboard/static/built/socket-client.js.map +0 -1
  333. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  334. claude_mpm/dashboard/static/events.html +0 -607
  335. claude_mpm/dashboard/static/index.html +0 -635
  336. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +0 -170
  337. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  338. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  339. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  340. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  342. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  343. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  344. claude_mpm/dashboard/static/legacy/files.html +0 -747
  345. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  346. claude_mpm/dashboard/static/monitors.html +0 -431
  347. claude_mpm/dashboard/static/navigation-test-results.md +0 -118
  348. claude_mpm/dashboard/static/production/events.html +0 -659
  349. claude_mpm/dashboard/static/production/main.html +0 -698
  350. claude_mpm/dashboard/static/production/monitors.html +0 -483
  351. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  352. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  353. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  354. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  355. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +0 -36
  356. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +0 -39
  357. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +0 -38
  358. claude_mpm/hooks/README.md +0 -143
  359. claude_mpm/hooks/templates/README.md +0 -180
  360. claude_mpm/hooks/templates/settings.json.example +0 -147
  361. claude_mpm/schemas/agent_schema.json +0 -596
  362. claude_mpm/schemas/frontmatter_schema.json +0 -165
  363. claude_mpm/services/event_bus/README.md +0 -244
  364. claude_mpm/services/events/README.md +0 -303
  365. claude_mpm/services/framework_claude_md_generator/README.md +0 -119
  366. claude_mpm/services/mcp_gateway/README.md +0 -185
  367. claude_mpm/services/socketio/handlers/connection.py.backup +0 -217
  368. claude_mpm/services/socketio/handlers/hook.py.backup +0 -154
  369. claude_mpm/services/static/.gitkeep +0 -2
  370. claude_mpm/services/version_control/VERSION +0 -1
  371. claude_mpm/skills/bundled/.gitkeep +0 -2
  372. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  373. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  374. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  375. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  376. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  377. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  378. claude_mpm/skills/bundled/collaboration/git-worktrees.md +0 -317
  379. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  380. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  381. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  382. claude_mpm/skills/bundled/collaboration/stacked-prs.md +0 -251
  383. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  384. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  385. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  386. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  387. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +0 -63
  388. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  389. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  390. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  391. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  392. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  393. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  394. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  395. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  396. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  397. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  398. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  399. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  400. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  401. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  402. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  403. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  404. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  405. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  406. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  407. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +0 -611
  408. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +0 -596
  409. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +0 -260
  410. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +0 -315
  411. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +0 -436
  412. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +0 -433
  413. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +0 -452
  414. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +0 -404
  415. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +0 -420
  416. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +0 -202
  417. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  418. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +0 -54
  419. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +0 -322
  420. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  421. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +0 -202
  422. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  423. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  424. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  425. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  426. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  427. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +0 -202
  428. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  429. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  430. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  431. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  435. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +0 -22
  436. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +0 -2
  437. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +0 -202
  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/react/flexlayout-react.md +0 -742
  452. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  458. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  459. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +0 -495
  460. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +0 -599
  461. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +0 -535
  462. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +0 -613
  463. claude_mpm/skills/bundled/tauri/tauri-event-system.md +0 -648
  464. claude_mpm/skills/bundled/tauri/tauri-file-system.md +0 -673
  465. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +0 -767
  466. claude_mpm/skills/bundled/tauri/tauri-performance.md +0 -669
  467. claude_mpm/skills/bundled/tauri/tauri-state-management.md +0 -573
  468. claude_mpm/skills/bundled/tauri/tauri-testing.md +0 -384
  469. claude_mpm/skills/bundled/tauri/tauri-window-management.md +0 -628
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +0 -158
  472. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  473. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  478. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  479. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +0 -458
  480. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +0 -411
  481. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +0 -317
  482. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +0 -270
  483. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +0 -436
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +0 -202
  490. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  491. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  492. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  493. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  494. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  495. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  496. claude_mpm/templates/questions/EXAMPLES.md +0 -501
  497. claude_mpm/tools/README_SOCKETIO_DEBUG.md +0 -224
  498. claude_mpm/tools/code_tree_analyzer/README.md +0 -64
  499. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  500. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  501. /claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +0 -0
  502. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  503. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  504. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  505. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  506. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  507. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.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