claude-mpm 4.20.3__py3-none-any.whl → 4.25.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (454) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +23 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/base_agent.json +6 -3
  7. claude_mpm/agents/frontmatter_validator.py +1 -1
  8. claude_mpm/agents/templates/api_qa.json +5 -2
  9. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  10. claude_mpm/agents/templates/documentation.json +33 -6
  11. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  12. claude_mpm/agents/templates/php-engineer.json +10 -4
  13. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  14. claude_mpm/agents/templates/project_organizer.json +7 -3
  15. claude_mpm/agents/templates/qa.json +2 -1
  16. claude_mpm/agents/templates/react_engineer.json +1 -0
  17. claude_mpm/agents/templates/research.json +82 -12
  18. claude_mpm/agents/templates/security.json +4 -4
  19. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  20. claude_mpm/agents/templates/ticketing.json +10 -6
  21. claude_mpm/agents/templates/version_control.json +4 -2
  22. claude_mpm/agents/templates/web_qa.json +2 -1
  23. claude_mpm/cli/README.md +253 -0
  24. claude_mpm/cli/__init__.py +11 -1
  25. claude_mpm/cli/commands/aggregate.py +1 -1
  26. claude_mpm/cli/commands/analyze.py +3 -3
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  29. claude_mpm/cli/commands/debug.py +12 -12
  30. claude_mpm/cli/commands/hook_errors.py +277 -0
  31. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  32. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  33. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  34. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  35. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  36. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  37. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  38. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  39. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  40. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  41. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  42. claude_mpm/cli/commands/run.py +124 -128
  43. claude_mpm/cli/commands/skills.py +522 -34
  44. claude_mpm/cli/executor.py +56 -0
  45. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  46. claude_mpm/cli/parsers/base_parser.py +28 -0
  47. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  48. claude_mpm/cli/parsers/skills_parser.py +138 -0
  49. claude_mpm/cli/startup.py +111 -8
  50. claude_mpm/cli/startup_display.py +480 -0
  51. claude_mpm/cli/utils.py +1 -1
  52. claude_mpm/cli_module/commands.py +1 -1
  53. claude_mpm/cli_module/refactoring_guide.md +253 -0
  54. claude_mpm/commands/mpm-help.md +3 -0
  55. claude_mpm/commands/mpm-init.md +19 -3
  56. claude_mpm/commands/mpm-resume.md +372 -0
  57. claude_mpm/commands/mpm-tickets.md +56 -7
  58. claude_mpm/commands/mpm.md +1 -0
  59. claude_mpm/config/agent_capabilities.yaml +658 -0
  60. claude_mpm/config/async_logging_config.yaml +145 -0
  61. claude_mpm/constants.py +12 -0
  62. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  63. claude_mpm/core/api_validator.py +1 -1
  64. claude_mpm/core/claude_runner.py +14 -1
  65. claude_mpm/core/config.py +8 -0
  66. claude_mpm/core/constants.py +1 -1
  67. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  68. claude_mpm/core/hook_error_memory.py +381 -0
  69. claude_mpm/core/hook_manager.py +41 -2
  70. claude_mpm/core/interactive_session.py +48 -3
  71. claude_mpm/core/interfaces.py +56 -1
  72. claude_mpm/core/logger.py +3 -1
  73. claude_mpm/core/oneshot_session.py +39 -0
  74. claude_mpm/d2/.gitignore +22 -0
  75. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  76. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  77. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  78. claude_mpm/d2/QUICKSTART.md +186 -0
  79. claude_mpm/d2/README.md +232 -0
  80. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  81. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  82. claude_mpm/d2/TESTING.md +288 -0
  83. claude_mpm/d2/index.html +118 -0
  84. claude_mpm/d2/package.json +19 -0
  85. claude_mpm/d2/src/App.svelte +110 -0
  86. claude_mpm/d2/src/components/Header.svelte +153 -0
  87. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  88. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  89. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  90. claude_mpm/d2/src/lib/socketio.js +144 -0
  91. claude_mpm/d2/src/main.js +7 -0
  92. claude_mpm/d2/src/stores/events.js +114 -0
  93. claude_mpm/d2/src/stores/socket.js +108 -0
  94. claude_mpm/d2/src/stores/theme.js +65 -0
  95. claude_mpm/d2/svelte.config.js +12 -0
  96. claude_mpm/d2/vite.config.js +15 -0
  97. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  98. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  99. claude_mpm/dashboard/README.md +121 -0
  100. claude_mpm/dashboard/VERSION +1 -0
  101. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  102. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  103. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  104. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  105. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  106. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  107. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  108. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  109. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  110. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  111. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  112. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  114. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  117. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  118. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  119. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  120. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  121. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  122. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  123. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  124. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  125. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  127. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  128. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  129. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  130. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  131. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  132. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  135. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  136. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  140. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  141. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  142. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  143. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  144. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  145. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  146. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  147. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  148. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  149. claude_mpm/dashboard/static/css/activity.css +69 -69
  150. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  151. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  152. claude_mpm/dashboard/static/index.html +22 -22
  153. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  154. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  155. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  156. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  157. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  158. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  159. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  160. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  161. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  162. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  163. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  164. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  165. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  166. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  167. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  168. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  169. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  170. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  171. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  172. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  173. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  174. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  175. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  176. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  177. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  178. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  179. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  180. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  181. claude_mpm/dashboard/static/production/main.html +21 -21
  182. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  183. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  184. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  185. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  186. claude_mpm/dashboard/templates/code_simple.html +23 -23
  187. claude_mpm/dashboard/templates/index.html +18 -18
  188. claude_mpm/hooks/README.md +143 -0
  189. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  190. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  191. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  192. claude_mpm/hooks/templates/README.md +180 -0
  193. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  194. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  195. claude_mpm/hooks/templates/settings.json.example +147 -0
  196. claude_mpm/schemas/agent_schema.json +596 -0
  197. claude_mpm/schemas/frontmatter_schema.json +165 -0
  198. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  199. claude_mpm/scripts/start_activity_logging.py +3 -1
  200. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  201. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  202. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  203. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  204. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  205. claude_mpm/services/agents/local_template_manager.py +3 -1
  206. claude_mpm/services/cli/session_pause_manager.py +504 -0
  207. claude_mpm/services/cli/session_resume_helper.py +36 -16
  208. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  209. claude_mpm/services/core/base.py +26 -11
  210. claude_mpm/services/core/interfaces.py +56 -1
  211. claude_mpm/services/core/models/agent_config.py +3 -0
  212. claude_mpm/services/core/models/process.py +4 -0
  213. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  214. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  215. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  216. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  217. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  218. claude_mpm/services/diagnostics/models.py +21 -0
  219. claude_mpm/services/event_bus/README.md +244 -0
  220. claude_mpm/services/event_bus/direct_relay.py +3 -3
  221. claude_mpm/services/event_bus/event_bus.py +36 -3
  222. claude_mpm/services/event_bus/relay.py +23 -7
  223. claude_mpm/services/events/README.md +303 -0
  224. claude_mpm/services/events/consumers/logging.py +1 -2
  225. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  226. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  227. claude_mpm/services/local_ops/__init__.py +2 -0
  228. claude_mpm/services/local_ops/process_manager.py +1 -1
  229. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  230. claude_mpm/services/mcp_gateway/README.md +185 -0
  231. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  232. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  233. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  235. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  236. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  237. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  238. claude_mpm/services/memory/failure_tracker.py +19 -4
  239. claude_mpm/services/memory/optimizer.py +1 -1
  240. claude_mpm/services/model/model_router.py +8 -9
  241. claude_mpm/services/monitor/daemon.py +1 -1
  242. claude_mpm/services/monitor/server.py +2 -2
  243. claude_mpm/services/native_agent_converter.py +356 -0
  244. claude_mpm/services/port_manager.py +1 -1
  245. claude_mpm/services/project/documentation_manager.py +2 -1
  246. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  247. claude_mpm/services/runner_configuration_service.py +1 -0
  248. claude_mpm/services/self_upgrade_service.py +165 -7
  249. claude_mpm/services/skills_config.py +547 -0
  250. claude_mpm/services/skills_deployer.py +955 -0
  251. claude_mpm/services/socketio/handlers/connection.py +1 -1
  252. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  253. claude_mpm/services/socketio/handlers/git.py +2 -2
  254. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  255. claude_mpm/services/static/.gitkeep +2 -0
  256. claude_mpm/services/system_instructions_service.py +1 -3
  257. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  258. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  259. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  260. claude_mpm/services/version_control/VERSION +1 -0
  261. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  262. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  263. claude_mpm/skills/__init__.py +3 -3
  264. claude_mpm/skills/agent_skills_injector.py +42 -49
  265. claude_mpm/skills/bundled/.gitkeep +2 -0
  266. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
  267. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
  268. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  269. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  270. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  271. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  272. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  273. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +46 -41
  274. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  275. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  276. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +36 -73
  277. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  278. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  279. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
  280. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  281. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  282. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  283. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  284. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  285. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +28 -72
  286. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -0
  287. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  288. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  289. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +272 -0
  290. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  291. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  292. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  293. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  294. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  295. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  296. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  297. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  298. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  299. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  300. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  301. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
  302. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  303. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  304. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  305. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  306. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
  307. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  308. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
  309. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  310. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  311. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  312. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  313. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  314. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  315. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  316. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
  317. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  318. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  319. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  320. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  321. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  322. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  323. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  324. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  325. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  326. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  327. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  328. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  329. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  330. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  331. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  332. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  333. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  334. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  335. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  336. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  337. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  338. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  339. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  340. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  341. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  342. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  343. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  344. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  345. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  346. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  347. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  348. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  349. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  350. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  351. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  352. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
  353. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  354. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  358. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  359. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +86 -250
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  363. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  364. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
  367. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  369. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  370. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  371. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  372. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  373. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  374. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  375. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  376. claude_mpm/skills/skills_registry.py +44 -48
  377. claude_mpm/skills/skills_service.py +117 -108
  378. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  379. claude_mpm/templates/questions/__init__.py +43 -0
  380. claude_mpm/templates/questions/base.py +193 -0
  381. claude_mpm/templates/questions/pr_strategy.py +314 -0
  382. claude_mpm/templates/questions/project_init.py +388 -0
  383. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  384. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  385. claude_mpm/tools/__main__.py +8 -8
  386. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  387. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  388. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  389. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  390. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  391. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  392. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  393. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  394. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  395. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  396. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  397. claude_mpm/utils/agent_dependency_loader.py +3 -3
  398. claude_mpm/utils/dependency_cache.py +3 -1
  399. claude_mpm/utils/gitignore.py +241 -0
  400. claude_mpm/utils/log_cleanup.py +3 -3
  401. claude_mpm/utils/robust_installer.py +3 -5
  402. claude_mpm/utils/structured_questions.py +619 -0
  403. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
  404. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
  405. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  406. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  407. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  408. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  409. claude_mpm/cli/commands/mpm_init.py +0 -2093
  410. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  411. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  412. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  413. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  414. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  415. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  416. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  417. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  418. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  419. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  420. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  421. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  422. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  423. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  424. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  425. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  426. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  444. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  445. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  446. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  447. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  448. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  449. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  450. /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
  451. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  452. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  453. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  454. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * File Viewer Component
3
- *
3
+ *
4
4
  * A simple file content viewer that displays file contents in a modal window.
5
5
  * This component handles file loading via HTTP requests and displays the content
6
6
  * with basic syntax highlighting support.
@@ -24,7 +24,7 @@ class FileViewer {
24
24
 
25
25
  this.createModal();
26
26
  this.setupEventHandlers();
27
-
27
+
28
28
  this.initialized = true;
29
29
  console.log('File viewer initialized');
30
30
  }
@@ -250,7 +250,7 @@ class FileViewer {
250
250
  async show(filePath) {
251
251
  console.log('[FileViewer] show() called with path:', filePath);
252
252
  console.log('[FileViewer] initialized:', this.initialized);
253
-
253
+
254
254
  if (!this.initialized) {
255
255
  console.log('[FileViewer] Not initialized, initializing now...');
256
256
  this.initialize();
@@ -258,10 +258,10 @@ class FileViewer {
258
258
 
259
259
  this.currentFile = filePath;
260
260
  this.modal.classList.add('show');
261
-
261
+
262
262
  // Update path
263
263
  document.getElementById('file-viewer-path').textContent = filePath;
264
-
264
+
265
265
  console.log('[FileViewer] Modal shown, loading file content...');
266
266
  // Load file content
267
267
  await this.loadFileContent(filePath);
@@ -280,63 +280,63 @@ class FileViewer {
280
280
  */
281
281
  async loadFileContent(filePath) {
282
282
  const codeContent = document.getElementById('file-viewer-code-content');
283
-
283
+
284
284
  console.log('[FileViewer] loadFileContent called with path:', filePath);
285
-
285
+
286
286
  // Check cache first
287
287
  if (this.contentCache.has(filePath)) {
288
288
  console.log('[FileViewer] Using cached content for:', filePath);
289
289
  this.displayContent(this.contentCache.get(filePath));
290
290
  return;
291
291
  }
292
-
292
+
293
293
  // Show loading state
294
294
  codeContent.textContent = 'Loading file content...';
295
-
295
+
296
296
  try {
297
297
  // Check if we have a socket connection available
298
298
  if (window.socket && window.socket.connected) {
299
299
  console.log('[FileViewer] Using Socket.IO to load file:', filePath);
300
-
300
+
301
301
  // Create a promise to wait for the response
302
302
  const responsePromise = new Promise((resolve, reject) => {
303
303
  const timeoutId = setTimeout(() => {
304
304
  console.error('[FileViewer] Socket.IO request timed out for:', filePath);
305
305
  reject(new Error('Socket.IO request timed out'));
306
306
  }, 10000); // 10 second timeout
307
-
307
+
308
308
  // Set up one-time listener for the response
309
309
  window.socket.once('file_content_response', (data) => {
310
310
  clearTimeout(timeoutId);
311
311
  console.log('[FileViewer] Received file_content_response:', data);
312
312
  resolve(data);
313
313
  });
314
-
314
+
315
315
  // Emit the read_file event
316
316
  console.log('[FileViewer] Emitting read_file event with data:', {
317
317
  file_path: filePath,
318
318
  working_dir: window.workingDirectory || '/',
319
319
  max_size: 5 * 1024 * 1024 // 5MB limit
320
320
  });
321
-
321
+
322
322
  window.socket.emit('read_file', {
323
323
  file_path: filePath,
324
324
  working_dir: window.workingDirectory || '/',
325
325
  max_size: 5 * 1024 * 1024 // 5MB limit
326
326
  });
327
327
  });
328
-
328
+
329
329
  // Wait for the response
330
330
  const data = await responsePromise;
331
-
331
+
332
332
  if (data.success && data.content !== undefined) {
333
333
  console.log('[FileViewer] Successfully loaded file content, caching...');
334
334
  // Cache the content
335
335
  this.contentCache.set(filePath, data.content);
336
-
336
+
337
337
  // Display the content
338
338
  this.displayContent(data.content);
339
-
339
+
340
340
  // Update file info
341
341
  this.updateFileInfo(data);
342
342
  } else {
@@ -350,7 +350,7 @@ class FileViewer {
350
350
  } catch (error) {
351
351
  console.error('[FileViewer] Error loading file:', error);
352
352
  console.error('[FileViewer] Error stack:', error.stack);
353
-
353
+
354
354
  // If API fails, show error message with helpful information
355
355
  this.displayError(filePath, error.message);
356
356
  }
@@ -361,22 +361,22 @@ class FileViewer {
361
361
  */
362
362
  displayContent(content) {
363
363
  const codeContent = document.getElementById('file-viewer-code-content');
364
-
364
+
365
365
  // Set the content
366
366
  codeContent.textContent = content || '(Empty file)';
367
-
367
+
368
368
  // Update line count
369
369
  const lines = content ? content.split('\n').length : 0;
370
370
  document.getElementById('file-viewer-lines').textContent = `Lines: ${lines}`;
371
-
371
+
372
372
  // Update file size
373
373
  const size = content ? new Blob([content]).size : 0;
374
374
  document.getElementById('file-viewer-size').textContent = `Size: ${this.formatFileSize(size)}`;
375
-
375
+
376
376
  // Detect and set file type
377
377
  const fileType = this.detectFileType(this.currentFile);
378
378
  document.getElementById('file-viewer-type').textContent = `Type: ${fileType}`;
379
-
379
+
380
380
  // Apply syntax highlighting if Prism is available
381
381
  if (window.Prism) {
382
382
  const language = this.detectLanguage(this.currentFile);
@@ -390,27 +390,27 @@ class FileViewer {
390
390
  */
391
391
  displayError(filePath, errorMessage) {
392
392
  const codeContent = document.getElementById('file-viewer-code-content');
393
-
393
+
394
394
  // For now, show a helpful message since the API endpoint doesn't exist yet
395
395
  const errorHtml = `
396
396
  <div class="file-viewer-error">
397
397
  ⚠️ File content loading is not yet implemented
398
-
398
+
399
399
  File path: ${filePath}
400
-
400
+
401
401
  The file viewing functionality requires:
402
402
  1. A server-side /api/file endpoint
403
403
  2. Proper file reading permissions
404
404
  3. Security validation for file access
405
-
405
+
406
406
  Error: ${errorMessage}
407
-
407
+
408
408
  This feature will be available once the backend API is implemented.
409
409
  </div>
410
410
  `;
411
-
411
+
412
412
  codeContent.innerHTML = errorHtml;
413
-
413
+
414
414
  // Update info
415
415
  document.getElementById('file-viewer-lines').textContent = 'Lines: --';
416
416
  document.getElementById('file-viewer-size').textContent = 'Size: --';
@@ -424,11 +424,11 @@ class FileViewer {
424
424
  if (data.lines !== undefined) {
425
425
  document.getElementById('file-viewer-lines').textContent = `Lines: ${data.lines}`;
426
426
  }
427
-
427
+
428
428
  if (data.size !== undefined) {
429
429
  document.getElementById('file-viewer-size').textContent = `Size: ${this.formatFileSize(data.size)}`;
430
430
  }
431
-
431
+
432
432
  if (data.type) {
433
433
  document.getElementById('file-viewer-type').textContent = `Type: ${data.type}`;
434
434
  }
@@ -439,11 +439,11 @@ class FileViewer {
439
439
  */
440
440
  formatFileSize(bytes) {
441
441
  if (bytes === 0) return '0 Bytes';
442
-
442
+
443
443
  const k = 1024;
444
444
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
445
445
  const i = Math.floor(Math.log(bytes) / Math.log(k));
446
-
446
+
447
447
  return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
448
448
  }
449
449
 
@@ -452,7 +452,7 @@ class FileViewer {
452
452
  */
453
453
  detectFileType(path) {
454
454
  if (!path) return 'Unknown';
455
-
455
+
456
456
  const ext = path.split('.').pop()?.toLowerCase();
457
457
  const typeMap = {
458
458
  'py': 'Python',
@@ -480,7 +480,7 @@ class FileViewer {
480
480
  'rb': 'Ruby',
481
481
  'php': 'PHP'
482
482
  };
483
-
483
+
484
484
  return typeMap[ext] || 'Text';
485
485
  }
486
486
 
@@ -489,7 +489,7 @@ class FileViewer {
489
489
  */
490
490
  detectLanguage(path) {
491
491
  if (!path) return 'plaintext';
492
-
492
+
493
493
  const ext = path.split('.').pop()?.toLowerCase();
494
494
  const languageMap = {
495
495
  'py': 'python',
@@ -516,7 +516,7 @@ class FileViewer {
516
516
  'rb': 'ruby',
517
517
  'php': 'php'
518
518
  };
519
-
519
+
520
520
  return languageMap[ext] || 'plaintext';
521
521
  }
522
522
 
@@ -527,15 +527,15 @@ class FileViewer {
527
527
  const codeContent = document.getElementById('file-viewer-code-content');
528
528
  const button = document.getElementById('file-viewer-copy');
529
529
  const content = codeContent.textContent;
530
-
530
+
531
531
  try {
532
532
  await navigator.clipboard.writeText(content);
533
-
533
+
534
534
  // Show feedback
535
535
  const originalText = button.textContent;
536
536
  button.textContent = '✅ Copied!';
537
537
  button.classList.add('copied');
538
-
538
+
539
539
  setTimeout(() => {
540
540
  button.textContent = originalText;
541
541
  button.classList.remove('copied');
@@ -565,7 +565,7 @@ window.fileViewerInstance = fileViewer;
565
565
  // Export for use in other modules
566
566
  if (typeof window !== 'undefined') {
567
567
  window.FileViewer = fileViewer;
568
-
568
+
569
569
  // Initialize when DOM is ready
570
570
  if (document.readyState === 'loading') {
571
571
  document.addEventListener('DOMContentLoaded', () => {
@@ -17,21 +17,21 @@ class ModuleViewer {
17
17
  // Global JSON visibility state - persisted across all events
18
18
  // When true, all events show JSON expanded; when false, all collapsed
19
19
  this.globalJsonExpanded = localStorage.getItem('dashboard-json-expanded') === 'true';
20
-
20
+
21
21
  // Separate state for Full Event Data sections
22
22
  this.fullEventDataExpanded = localStorage.getItem('dashboard-full-event-expanded') === 'true';
23
-
23
+
24
24
  // Track if keyboard listener has been added to avoid duplicates
25
25
  this.keyboardListenerAdded = false;
26
-
26
+
27
27
  // Initialize unified data viewer
28
28
  this.unifiedViewer = new UnifiedDataViewer('module-data-content');
29
-
29
+
30
30
  // Sync unified viewer's JSON state with module viewer's state
31
31
  // This ensures both viewers maintain consistent JSON visibility
32
32
  this.unifiedViewer.globalJsonExpanded = this.globalJsonExpanded;
33
33
  this.unifiedViewer.fullEventDataExpanded = this.fullEventDataExpanded;
34
-
34
+
35
35
  // Listen for JSON state changes from unified viewer
36
36
  document.addEventListener('jsonToggleChanged', (e) => {
37
37
  this.globalJsonExpanded = e.detail.expanded;
@@ -40,7 +40,7 @@ class ModuleViewer {
40
40
  this.unifiedViewer.globalJsonExpanded = e.detail.expanded;
41
41
  }
42
42
  });
43
-
43
+
44
44
  // Listen for Full Event Data state changes
45
45
  document.addEventListener('fullEventToggleChanged', (e) => {
46
46
  this.fullEventDataExpanded = e.detail.expanded;
@@ -118,7 +118,7 @@ class ModuleViewer {
118
118
  */
119
119
  showEventDetails(event) {
120
120
  this.currentEvent = event;
121
-
121
+
122
122
  if (!this.unifiedViewer) {
123
123
  console.warn('ModuleViewer: UnifiedDataViewer not available');
124
124
  // Fallback to legacy rendering
@@ -126,7 +126,7 @@ class ModuleViewer {
126
126
  this.renderJsonData(event);
127
127
  return;
128
128
  }
129
-
129
+
130
130
  // Use unified viewer to display event data
131
131
  this.unifiedViewer.display(event, 'event');
132
132
  }
@@ -868,13 +868,13 @@ class ModuleViewer {
868
868
  createCollapsibleJsonSection(event) {
869
869
  const uniqueId = 'json-section-' + Math.random().toString(36).substr(2, 9);
870
870
  const jsonString = this.formatJSON(event);
871
-
871
+
872
872
  // Use global state to determine initial visibility
873
873
  const isExpanded = this.globalJsonExpanded;
874
874
  const display = isExpanded ? 'block' : 'none';
875
875
  const arrow = isExpanded ? '▲' : '▼';
876
876
  const ariaExpanded = isExpanded ? 'true' : 'false';
877
-
877
+
878
878
  return `
879
879
  <div class="collapsible-json-section" id="${uniqueId}">
880
880
  <div class="json-toggle-header"
@@ -960,13 +960,13 @@ class ModuleViewer {
960
960
  toggleJsonSection() {
961
961
  // Toggle the global state
962
962
  this.globalJsonExpanded = !this.globalJsonExpanded;
963
-
963
+
964
964
  // Persist the preference to localStorage
965
965
  localStorage.setItem('dashboard-json-expanded', this.globalJsonExpanded.toString());
966
-
966
+
967
967
  // Update ALL JSON sections on the page
968
968
  this.updateAllJsonSections();
969
-
969
+
970
970
  // Dispatch event to notify other components of the change
971
971
  document.dispatchEvent(new CustomEvent('jsonToggleChanged', {
972
972
  detail: { expanded: this.globalJsonExpanded }
@@ -982,7 +982,7 @@ class ModuleViewer {
982
982
  const allJsonContents = document.querySelectorAll('.json-content-collapsible');
983
983
  const allArrows = document.querySelectorAll('.json-toggle-arrow');
984
984
  const allHeaders = document.querySelectorAll('.json-toggle-header');
985
-
985
+
986
986
  // Update each JSON section
987
987
  allJsonContents.forEach((jsonContent, index) => {
988
988
  if (this.globalJsonExpanded) {
@@ -1007,7 +1007,7 @@ class ModuleViewer {
1007
1007
  }
1008
1008
  }
1009
1009
  });
1010
-
1010
+
1011
1011
  // If expanded and there's content, scroll the first visible one into view
1012
1012
  if (this.globalJsonExpanded && allJsonContents.length > 0) {
1013
1013
  setTimeout(() => {
@@ -1221,7 +1221,7 @@ class ModuleViewer {
1221
1221
  if (!text || text.length <= maxLength) return text;
1222
1222
  return text.substring(0, maxLength) + '...';
1223
1223
  }
1224
-
1224
+
1225
1225
  /**
1226
1226
  * Format operation details object for display
1227
1227
  * @param {Object} details - Details object containing operation information
@@ -1231,40 +1231,40 @@ class ModuleViewer {
1231
1231
  if (!details || typeof details !== 'object') {
1232
1232
  return '';
1233
1233
  }
1234
-
1234
+
1235
1235
  let formattedDetails = '';
1236
-
1236
+
1237
1237
  // Display the bash command if available
1238
1238
  if (details.parameters && details.parameters.command) {
1239
1239
  formattedDetails += `<br><strong>Command:</strong> <code>${this.escapeHtml(details.parameters.command)}</code>`;
1240
1240
  }
1241
-
1241
+
1242
1242
  // Display success/error status
1243
1243
  if (details.success !== undefined) {
1244
1244
  formattedDetails += `<br><strong>Status:</strong> ${details.success ? '✅ Success' : '❌ Failed'}`;
1245
1245
  }
1246
-
1246
+
1247
1247
  // Display exit code if available
1248
1248
  if (details.exit_code !== undefined && details.exit_code !== null) {
1249
1249
  formattedDetails += `<br><strong>Exit Code:</strong> ${details.exit_code}`;
1250
1250
  }
1251
-
1251
+
1252
1252
  // Display duration if available
1253
1253
  if (details.duration_ms !== undefined && details.duration_ms !== null) {
1254
- const duration = details.duration_ms > 1000
1255
- ? `${(details.duration_ms / 1000).toFixed(2)}s`
1254
+ const duration = details.duration_ms > 1000
1255
+ ? `${(details.duration_ms / 1000).toFixed(2)}s`
1256
1256
  : `${details.duration_ms}ms`;
1257
1257
  formattedDetails += `<br><strong>Duration:</strong> ${duration}`;
1258
1258
  }
1259
-
1259
+
1260
1260
  // Display error message if available
1261
1261
  if (details.error) {
1262
1262
  formattedDetails += `<br><strong>Error:</strong> ${this.escapeHtml(this.truncateText(details.error, 200))}`;
1263
1263
  }
1264
-
1264
+
1265
1265
  return formattedDetails;
1266
1266
  }
1267
-
1267
+
1268
1268
  /**
1269
1269
  * Escape HTML to prevent XSS
1270
1270
  */
@@ -1552,7 +1552,7 @@ class ModuleViewer {
1552
1552
  const searchPattern = parameters.pattern || 'No pattern specified';
1553
1553
  const searchPath = parameters.path || parameters.directory || '.';
1554
1554
  const searchType = parameters.type || parameters.glob || 'all files';
1555
-
1555
+
1556
1556
  // Extract search results from result_summary
1557
1557
  let searchResultsContent = '';
1558
1558
  if (toolCall.result_summary) {
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Session Manager Component
3
3
  * Handles session selection and management
4
- *
4
+ *
5
5
  * WHY: Provides session filtering and management for the dashboard, allowing users
6
6
  * to view events from specific sessions or all sessions.
7
- *
7
+ *
8
8
  * BROWSER COMPATIBILITY: This component runs in the browser. All Node.js-specific
9
9
  * globals (process, require, etc.) have been removed. Uses browser-compatible
10
10
  * alternatives for path handling and defaults.
11
- *
11
+ *
12
12
  * FIX APPLIED: Removed process.cwd() reference that caused "process is not defined"
13
13
  * error in browser. Now uses window.location.pathname or hardcoded fallbacks.
14
14
  */
@@ -94,7 +94,7 @@ class SessionManager {
94
94
 
95
95
  // Get the default working directory from various sources
96
96
  let defaultWorkingDir = '/';
97
-
97
+
98
98
  // Try to get from working directory manager
99
99
  if (window.dashboard && window.dashboard.workingDirectoryManager) {
100
100
  defaultWorkingDir = window.dashboard.workingDirectoryManager.getDefaultWorkingDir();
@@ -108,7 +108,7 @@ class SessionManager {
108
108
  }
109
109
  }
110
110
  }
111
-
111
+
112
112
  console.log('[SESSION-MANAGER] Using default working directory:', defaultWorkingDir);
113
113
 
114
114
  // Update "All Sessions" option to show working directory
@@ -129,19 +129,19 @@ class SessionManager {
129
129
  const startTime = new Date(session.startTime || session.last_activity).toLocaleString();
130
130
  const eventCount = session.eventCount || session.event_count || 0;
131
131
  const isActive = session.id === this.currentSessionId;
132
-
132
+
133
133
  // Extract working directory from session or events
134
134
  let workingDir = session.working_directory || session.workingDirectory || '';
135
-
135
+
136
136
  // Log for debugging
137
137
  console.log(`[SESSION-DROPDOWN] Session ${session.id.substring(0, 8)} working_directory:`, workingDir);
138
-
138
+
139
139
  if (!workingDir) {
140
140
  const sessionData = this.extractSessionInfoFromEvents(session.id);
141
141
  workingDir = sessionData.workingDir || defaultWorkingDir;
142
142
  console.log(`[SESSION-DROPDOWN] Extracted working directory from events:`, workingDir);
143
143
  }
144
-
144
+
145
145
  // Format display: working_directory | session_id...
146
146
  const shortId = session.id.substring(0, 8);
147
147
  const dirDisplay = workingDir || defaultWorkingDir;
@@ -220,8 +220,8 @@ class SessionManager {
220
220
  // Use browser-compatible fallback for working directory
221
221
  // WHY: Removed process.cwd() Node.js reference - not available in browser
222
222
  // BROWSER FIX: Use dashboard manager or server-provided config
223
- let workingDir = window.dashboard?.workingDirectoryManager?.getDefaultWorkingDir() ||
224
- window.dashboardConfig?.workingDirectory ||
223
+ let workingDir = window.dashboard?.workingDirectoryManager?.getDefaultWorkingDir() ||
224
+ window.dashboardConfig?.workingDirectory ||
225
225
  '.';
226
226
  let gitBranch = 'Unknown';
227
227
 
@@ -236,9 +236,9 @@ class SessionManager {
236
236
  if (this.currentSessionId) {
237
237
  const sessionData = this.extractSessionInfoFromEvents(this.currentSessionId);
238
238
  // Browser-compatible working directory fallback
239
- workingDir = sessionData.workingDir ||
240
- window.dashboard?.workingDirectoryManager?.getDefaultWorkingDir() ||
241
- window.dashboardConfig?.workingDirectory ||
239
+ workingDir = sessionData.workingDir ||
240
+ window.dashboard?.workingDirectoryManager?.getDefaultWorkingDir() ||
241
+ window.dashboardConfig?.workingDirectory ||
242
242
  '.';
243
243
  gitBranch = sessionData.gitBranch || 'Unknown';
244
244
  }
@@ -84,7 +84,7 @@ class SocketManager {
84
84
  // Expose socket globally for components like CodeTree
85
85
  window.socket = this.socketClient.socket;
86
86
  console.log('SocketManager: Exposed socket globally as window.socket');
87
-
87
+
88
88
  this.setupGitBranchListener();
89
89
  }
90
90
  }
@@ -62,7 +62,7 @@ class UIStateManager {
62
62
 
63
63
  this.setupEventHandlers();
64
64
  console.log('UI state manager initialized with hash navigation');
65
-
65
+
66
66
  // Initialize with current hash
67
67
  this.handleHashChange();
68
68
  }
@@ -114,16 +114,16 @@ class UIStateManager {
114
114
  console.log('[Hash Navigation] - Is hash in mapping?', hash in this.hashToTab);
115
115
  console.log('[Hash Navigation] - Hash length:', hash.length);
116
116
  console.log('[Hash Navigation] - Hash char codes:', hash.split('').map(c => c.charCodeAt(0)));
117
-
117
+
118
118
  const tabName = this.hashToTab[hash] || 'events';
119
119
  console.log('[Hash Navigation] Final resolved tab name:', tabName);
120
-
120
+
121
121
  // Special logging for File Tree tab
122
122
  if (tabName === 'claude-tree' || hash === '#file_tree') {
123
123
  console.log('[UIStateManager] FILE TREE TAB SELECTED via hash:', hash);
124
124
  console.log('[UIStateManager] Tab name resolved to:', tabName);
125
125
  }
126
-
126
+
127
127
  this.switchTab(tabName, false); // false = don't update hash (we're responding to hash change)
128
128
  }
129
129
 
@@ -143,11 +143,11 @@ class UIStateManager {
143
143
  document.querySelectorAll('.tab-button').forEach(button => {
144
144
  button.addEventListener('click', (e) => {
145
145
  console.log('[UIStateManager] Tab button clicked:', e.target);
146
-
146
+
147
147
  // Prevent default only if we're going to handle it
148
148
  const tabName = this.getTabNameFromButton(e.target);
149
149
  console.log('[UIStateManager] Resolved tab name:', tabName);
150
-
150
+
151
151
  if (tabName) {
152
152
  // Let the href attribute update the hash naturally, which will trigger our hashchange handler
153
153
  // But also explicitly trigger the switch in case href doesn't work
@@ -161,7 +161,7 @@ class UIStateManager {
161
161
  }
162
162
  });
163
163
  });
164
-
164
+
165
165
  console.log('[UIStateManager] Tab click handlers set up for', document.querySelectorAll('.tab-button').length, 'buttons');
166
166
  }
167
167
 
@@ -197,7 +197,7 @@ class UIStateManager {
197
197
  console.log('[getTabNameFromButton] DEBUG: button object:', button);
198
198
  console.log('[getTabNameFromButton] DEBUG: button.nodeType:', button.nodeType);
199
199
  console.log('[getTabNameFromButton] DEBUG: button.tagName:', button.tagName);
200
-
200
+
201
201
  // CRITICAL FIX: Make sure we're dealing with the actual button element
202
202
  // Sometimes the click target might be a child element (like the emoji icon)
203
203
  let targetButton = button;
@@ -205,29 +205,29 @@ class UIStateManager {
205
205
  targetButton = button.closest('.tab-button');
206
206
  console.log('[getTabNameFromButton] DEBUG: Used closest() to find actual button');
207
207
  }
208
-
208
+
209
209
  // First check for data-tab attribute
210
210
  const dataTab = targetButton ? targetButton.getAttribute('data-tab') : null;
211
211
  console.log('[getTabNameFromButton] DEBUG: data-tab attribute:', dataTab);
212
212
  console.log('[getTabNameFromButton] DEBUG: dataTab truthy:', !!dataTab);
213
-
213
+
214
214
  // CRITICAL: Specifically handle the File Tree case
215
215
  if (dataTab === 'claude-tree') {
216
216
  console.log('[getTabNameFromButton] DEBUG: Found claude-tree data-tab, returning it');
217
217
  return 'claude-tree';
218
218
  }
219
-
219
+
220
220
  if (dataTab) {
221
221
  console.log('[getTabNameFromButton] DEBUG: Returning dataTab:', dataTab);
222
222
  return dataTab;
223
223
  }
224
-
224
+
225
225
  // Fallback to text content matching
226
226
  const text = targetButton ? targetButton.textContent.toLowerCase() : '';
227
227
  console.log('[getTabNameFromButton] DEBUG: text content:', text);
228
228
  console.log('[getTabNameFromButton] DEBUG: text includes file tree:', text.includes('file tree'));
229
229
  console.log('[getTabNameFromButton] DEBUG: text includes events:', text.includes('events'));
230
-
230
+
231
231
  // CRITICAL: Check File Tree FIRST since it's the problematic one
232
232
  if (text.includes('file tree') || text.includes('📝')) {
233
233
  console.log('[getTabNameFromButton] DEBUG: Matched file tree, returning claude-tree');
@@ -241,7 +241,7 @@ class UIStateManager {
241
241
  if (text.includes('sessions')) return 'sessions';
242
242
  if (text.includes('system')) return 'system';
243
243
  if (text.includes('events') || text.includes('📊')) return 'events';
244
-
244
+
245
245
  console.log('[getTabNameFromButton] DEBUG: No match, falling back to events');
246
246
  return 'events';
247
247
  }