claude-mpm 4.16.0__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +272 -23
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1821 -32
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/agent_loader.py +4 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/api_qa.json +5 -2
- claude_mpm/agents/templates/circuit_breakers.md +108 -2
- claude_mpm/agents/templates/documentation.json +33 -6
- claude_mpm/agents/templates/engineer.json +5 -1
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/php-engineer.json +10 -4
- claude_mpm/agents/templates/pm_red_flags.md +89 -19
- claude_mpm/agents/templates/project_organizer.json +7 -3
- claude_mpm/agents/templates/python_engineer.json +8 -3
- claude_mpm/agents/templates/qa.json +2 -1
- claude_mpm/agents/templates/react_engineer.json +1 -0
- claude_mpm/agents/templates/research.json +82 -12
- claude_mpm/agents/templates/rust_engineer.json +12 -7
- claude_mpm/agents/templates/security.json +4 -4
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +10 -6
- claude_mpm/agents/templates/version_control.json +4 -2
- claude_mpm/agents/templates/web_qa.json +2 -1
- claude_mpm/cli/README.md +253 -0
- claude_mpm/cli/__init__.py +11 -1
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
- claude_mpm/cli/commands/mpm_init/README.md +365 -0
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +67 -1
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skills.py +922 -0
- claude_mpm/cli/executor.py +58 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +35 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +275 -0
- claude_mpm/cli/startup.py +168 -8
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/cli_module/refactoring_guide.md +253 -0
- claude_mpm/commands/mpm-auto-configure.md +52 -0
- claude_mpm/commands/mpm-help.md +6 -0
- claude_mpm/commands/mpm-init.md +130 -8
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +24 -0
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +14 -1
- claude_mpm/core/config.py +50 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +48 -3
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +39 -0
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/d2/.gitignore +22 -0
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
- claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
- claude_mpm/d2/QUICKSTART.md +186 -0
- claude_mpm/d2/README.md +232 -0
- claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
- claude_mpm/d2/TESTING.md +288 -0
- claude_mpm/d2/index.html +118 -0
- claude_mpm/d2/package.json +19 -0
- claude_mpm/d2/src/App.svelte +110 -0
- claude_mpm/d2/src/components/Header.svelte +153 -0
- claude_mpm/d2/src/components/MainContent.svelte +74 -0
- claude_mpm/d2/src/components/Sidebar.svelte +85 -0
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
- claude_mpm/d2/src/lib/socketio.js +144 -0
- claude_mpm/d2/src/main.js +7 -0
- claude_mpm/d2/src/stores/events.js +114 -0
- claude_mpm/d2/src/stores/socket.js +108 -0
- claude_mpm/d2/src/stores/theme.js +65 -0
- claude_mpm/d2/svelte.config.js +12 -0
- claude_mpm/d2/vite.config.js +15 -0
- claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/BUILD_NUMBER +1 -0
- claude_mpm/dashboard/README.md +121 -0
- claude_mpm/dashboard/VERSION +1 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
- claude_mpm/dashboard/react/entries/events.tsx +165 -0
- claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
- claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
- claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
- claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
- claude_mpm/dashboard/static/built/connection-manager.js +76 -76
- claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
- claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/built/react/events.js.map +1 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/built/shared/logger.js +16 -16
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/index.html +22 -22
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/js/shared/logger.js +16 -16
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/static/navigation-test-results.md +118 -0
- claude_mpm/dashboard/static/production/main.html +21 -21
- claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/hooks/README.md +143 -0
- claude_mpm/hooks/__init__.py +8 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/README.md +180 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/templates/settings.json.example +147 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/agent_schema.json +596 -0
- claude_mpm/schemas/frontmatter_schema.json +165 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/auto_config_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
- claude_mpm/services/agents/local_template_manager.py +4 -2
- claude_mpm/services/agents/recommender.py +47 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +87 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- claude_mpm/services/core/path_resolver.py +1 -1
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
- claude_mpm/services/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/README.md +244 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/README.md +303 -0
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/framework_claude_md_generator/README.md +119 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +2 -0
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +7 -131
- claude_mpm/services/mcp_gateway/README.md +185 -0
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
- claude_mpm/services/static/.gitkeep +2 -0
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/local.py +1 -1
- claude_mpm/services/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +21 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +97 -9
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/templates/questions/EXAMPLES.md +501 -0
- claude_mpm/templates/questions/__init__.py +43 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +314 -0
- claude_mpm/templates/questions/project_init.py +388 -0
- claude_mpm/templates/questions/ticket_mgmt.py +397 -0
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/README.md +64 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +5 -5
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm-4.25.10.dist-info/METADATA +789 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +485 -240
- claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/cli/commands/mpm_init.py +0 -2008
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- claude_mpm-4.16.0.dist-info/METADATA +0 -453
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Startup display banner for Claude MPM.
|
|
3
|
+
|
|
4
|
+
Shows welcome message, version info, ASCII art, and what's new section.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import shutil
|
|
10
|
+
import subprocess
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import List
|
|
13
|
+
|
|
14
|
+
from claude_mpm.utils.git_analyzer import is_git_repository
|
|
15
|
+
|
|
16
|
+
# ANSI color codes
|
|
17
|
+
CYAN = "\033[36m" # Cyan for header highlight (Claude Code style)
|
|
18
|
+
DIM = "\033[2m" # Dim text for subtle launch message
|
|
19
|
+
RESET = "\033[0m"
|
|
20
|
+
|
|
21
|
+
# Banner dimension defaults (will be calculated based on terminal width)
|
|
22
|
+
MIN_WIDTH = 100 # Minimum banner width
|
|
23
|
+
MAX_WIDTH = 200 # Maximum banner width
|
|
24
|
+
DEFAULT_WIDTH = 160 # Default if terminal width cannot be determined
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_terminal_width() -> int:
|
|
28
|
+
"""
|
|
29
|
+
Get terminal width with reasonable bounds.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Terminal width (75% of actual) clamped between MIN_WIDTH and MAX_WIDTH
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
full_width = shutil.get_terminal_size().columns
|
|
36
|
+
# Use 75% of terminal width for more compact display
|
|
37
|
+
width = int(full_width * 0.75)
|
|
38
|
+
# Apply reasonable bounds
|
|
39
|
+
return max(MIN_WIDTH, min(width, MAX_WIDTH))
|
|
40
|
+
except Exception:
|
|
41
|
+
# 75% of 160 = 120
|
|
42
|
+
return 120
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _get_username() -> str:
|
|
46
|
+
"""Get username from environment or default to 'User'."""
|
|
47
|
+
return os.environ.get("USER") or os.environ.get("USERNAME") or "User"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _get_recent_commits(max_commits: int = 3) -> List[str]:
|
|
51
|
+
"""
|
|
52
|
+
Get recent git commits for display in startup banner.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
max_commits: Maximum number of commits to retrieve (default: 3)
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
List of formatted commit strings (hash • relative_time • message)
|
|
59
|
+
Empty list if not a git repo or if any error occurs
|
|
60
|
+
|
|
61
|
+
Format: "a3f5b7c • 2 hours ago • fix: resolve critical error"
|
|
62
|
+
"""
|
|
63
|
+
try:
|
|
64
|
+
# Check if we're in a git repository
|
|
65
|
+
if not is_git_repository("."):
|
|
66
|
+
return []
|
|
67
|
+
|
|
68
|
+
# Run git log with custom format
|
|
69
|
+
result = subprocess.run(
|
|
70
|
+
["git", "log", "--format=%h • %ar • %s", f"-{max_commits}"],
|
|
71
|
+
capture_output=True,
|
|
72
|
+
text=True,
|
|
73
|
+
check=True,
|
|
74
|
+
timeout=2,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if not result.stdout.strip():
|
|
78
|
+
return []
|
|
79
|
+
|
|
80
|
+
# Split into lines and return
|
|
81
|
+
commits = [
|
|
82
|
+
line.strip() for line in result.stdout.strip().split("\n") if line.strip()
|
|
83
|
+
]
|
|
84
|
+
return commits[:max_commits]
|
|
85
|
+
|
|
86
|
+
except Exception:
|
|
87
|
+
# Fail silently - return empty list on any error
|
|
88
|
+
# (not a git repo, git not installed, timeout, etc.)
|
|
89
|
+
return []
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _strip_ansi_codes(text: str) -> str:
|
|
93
|
+
"""Remove ANSI color codes from text."""
|
|
94
|
+
ansi_escape = re.compile(r"\x1b\[[0-9;]*m")
|
|
95
|
+
return ansi_escape.sub("", text)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _get_display_width(text: str) -> int:
|
|
99
|
+
"""
|
|
100
|
+
Calculate display width accounting for emojis and wide characters.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
text: Text to measure (without ANSI codes)
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Display width in terminal columns
|
|
107
|
+
"""
|
|
108
|
+
width = 0
|
|
109
|
+
for char in text:
|
|
110
|
+
# Emoji and wide characters take 2 columns
|
|
111
|
+
if ord(char) > 0x1F000: # Emoji range
|
|
112
|
+
width += 2
|
|
113
|
+
else:
|
|
114
|
+
width += 1
|
|
115
|
+
return width
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _parse_changelog_highlights(max_items: int = 3, max_width: int = 130) -> List[str]:
|
|
119
|
+
"""
|
|
120
|
+
Parse CHANGELOG.md to extract highlights from latest version.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
max_items: Maximum number of highlights to return
|
|
124
|
+
max_width: Maximum width for each highlight
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
List of formatted bullet points for display.
|
|
128
|
+
"""
|
|
129
|
+
changelog_path = Path(__file__).parent.parent.parent.parent / "CHANGELOG.md"
|
|
130
|
+
|
|
131
|
+
if not changelog_path.exists():
|
|
132
|
+
return ["No changelog available"]
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
with open(changelog_path, encoding="utf-8") as f:
|
|
136
|
+
lines = f.readlines()
|
|
137
|
+
|
|
138
|
+
# Find latest version section (skip [Unreleased])
|
|
139
|
+
in_version_section = False
|
|
140
|
+
highlights = []
|
|
141
|
+
|
|
142
|
+
for i, line in enumerate(lines):
|
|
143
|
+
line = line.rstrip()
|
|
144
|
+
|
|
145
|
+
# Skip unreleased section
|
|
146
|
+
if line.startswith("## [Unreleased]"):
|
|
147
|
+
continue
|
|
148
|
+
|
|
149
|
+
# Found latest version
|
|
150
|
+
if line.startswith("## [") and not in_version_section:
|
|
151
|
+
in_version_section = True
|
|
152
|
+
continue
|
|
153
|
+
|
|
154
|
+
# Next version section means we're done
|
|
155
|
+
if line.startswith("## [") and in_version_section:
|
|
156
|
+
break
|
|
157
|
+
|
|
158
|
+
# Extract any bullet points from any section in latest version
|
|
159
|
+
if in_version_section:
|
|
160
|
+
# Skip section headers
|
|
161
|
+
if line.startswith("###"):
|
|
162
|
+
continue
|
|
163
|
+
|
|
164
|
+
# Extract bullet points
|
|
165
|
+
if line.startswith("-"):
|
|
166
|
+
# Get first line of multi-line items
|
|
167
|
+
item = line[2:].strip() # Remove "- " prefix
|
|
168
|
+
|
|
169
|
+
# Clean up markdown formatting
|
|
170
|
+
item = item.replace("**", "") # Remove bold markers
|
|
171
|
+
|
|
172
|
+
# Truncate if too long
|
|
173
|
+
if len(item) > max_width:
|
|
174
|
+
item = item[: max_width - 3] + "..."
|
|
175
|
+
|
|
176
|
+
highlights.append(item)
|
|
177
|
+
|
|
178
|
+
if len(highlights) >= max_items:
|
|
179
|
+
break
|
|
180
|
+
|
|
181
|
+
if not highlights:
|
|
182
|
+
highlights = ["See CHANGELOG.md for details"]
|
|
183
|
+
|
|
184
|
+
return highlights[:max_items]
|
|
185
|
+
|
|
186
|
+
except Exception:
|
|
187
|
+
return ["See CHANGELOG.md for details"]
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _get_alien_art() -> List[str]:
|
|
191
|
+
"""Return multi-alien ASCII art with teal/cyan highlighting."""
|
|
192
|
+
return [
|
|
193
|
+
f"{CYAN}▐▛███▜▌ ▐▛███▜▌{RESET}", # Two aliens - Width: 15 chars
|
|
194
|
+
f"{CYAN}▝▜█████▛▘▝▜█████▛▘{RESET}", # Two aliens base - Width: 18 chars
|
|
195
|
+
f"{CYAN}▘▘ ▝▝ ▘▘ ▝▝{RESET}", # Two aliens feet - Width: 14 chars
|
|
196
|
+
]
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _format_logging_status(logging_level: str) -> str:
|
|
200
|
+
"""Format logging status with helpful indicator."""
|
|
201
|
+
if logging_level == "OFF":
|
|
202
|
+
return "Logging: OFF (default)"
|
|
203
|
+
if logging_level == "DEBUG":
|
|
204
|
+
return f"Logging: {logging_level} (verbose)"
|
|
205
|
+
return f"Logging: {logging_level}"
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _get_cwd_display(max_width: int = 40) -> str:
|
|
209
|
+
"""Get current working directory, truncated if needed."""
|
|
210
|
+
cwd = str(Path.cwd())
|
|
211
|
+
|
|
212
|
+
if len(cwd) <= max_width:
|
|
213
|
+
return cwd
|
|
214
|
+
|
|
215
|
+
# Truncate from the left with ellipsis
|
|
216
|
+
return "..." + cwd[-(max_width - 3) :]
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _format_two_column_line(
|
|
220
|
+
left: str, right: str, left_panel_width: int, right_panel_width: int
|
|
221
|
+
) -> str:
|
|
222
|
+
"""
|
|
223
|
+
Format a two-column line with precise width control.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
left: Left panel content (will be centered in left_panel_width)
|
|
227
|
+
right: Right panel content (will be left-aligned in right_panel_width)
|
|
228
|
+
left_panel_width: Width of left panel in characters
|
|
229
|
+
right_panel_width: Width of right panel in characters
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
Formatted line with exact character widths
|
|
233
|
+
"""
|
|
234
|
+
# Strip ANSI codes for width calculation
|
|
235
|
+
left_display = _strip_ansi_codes(left)
|
|
236
|
+
right_display = _strip_ansi_codes(right)
|
|
237
|
+
|
|
238
|
+
# Calculate actual display width
|
|
239
|
+
left_width = _get_display_width(left_display)
|
|
240
|
+
right_width = _get_display_width(right_display)
|
|
241
|
+
|
|
242
|
+
# Calculate padding for left panel (centered)
|
|
243
|
+
left_padding = (left_panel_width - left_width) // 2
|
|
244
|
+
right_padding = left_panel_width - left_width - left_padding
|
|
245
|
+
|
|
246
|
+
# Format left panel with centering
|
|
247
|
+
left_formatted = " " * left_padding + left + " " * right_padding
|
|
248
|
+
|
|
249
|
+
# Format right panel (left-aligned)
|
|
250
|
+
# Right panel content should exactly fill right_panel_width
|
|
251
|
+
right_formatted = right + " " * (right_panel_width - right_width)
|
|
252
|
+
|
|
253
|
+
return f"│{left_formatted}│ {right_formatted}│"
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def display_startup_banner(version: str, logging_level: str) -> None:
|
|
257
|
+
"""
|
|
258
|
+
Display startup banner with welcome message and info.
|
|
259
|
+
|
|
260
|
+
Banner dynamically adjusts to terminal width with cyan header highlight
|
|
261
|
+
(Claude Code style).
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
version: Claude MPM version string
|
|
265
|
+
logging_level: Current logging level (OFF/INFO/DEBUG)
|
|
266
|
+
"""
|
|
267
|
+
# Display launch message (subtle, dim styling)
|
|
268
|
+
print(f"{DIM}Launching Claude Multi-agent Product Manager (claude-mpm)...{RESET}")
|
|
269
|
+
print() # Empty line after launch message
|
|
270
|
+
|
|
271
|
+
# Get terminal width and calculate panel sizes
|
|
272
|
+
terminal_width = _get_terminal_width()
|
|
273
|
+
left_panel_width = int(terminal_width * 0.25) # ~25% for left panel
|
|
274
|
+
# -4 accounts for: 2 borders (│) + 2 column separators (│ and space)
|
|
275
|
+
right_panel_width = terminal_width - left_panel_width - 4
|
|
276
|
+
|
|
277
|
+
username = _get_username()
|
|
278
|
+
|
|
279
|
+
# Get recent git commits for "Recent activity" section
|
|
280
|
+
recent_commits = _get_recent_commits(max_commits=3)
|
|
281
|
+
|
|
282
|
+
# Build header line with cyan highlight (Claude Code style)
|
|
283
|
+
header = f"─── Claude MPM v{version} "
|
|
284
|
+
header_padding = "─" * (terminal_width - len(header) - 2) # -2 for ╭╮
|
|
285
|
+
top_line = f"{CYAN}╭{header}{header_padding}╮{RESET}"
|
|
286
|
+
|
|
287
|
+
# Build content lines (plain text, no color)
|
|
288
|
+
lines = []
|
|
289
|
+
|
|
290
|
+
# Line 1: Empty left | "Recent activity" right
|
|
291
|
+
lines.append(
|
|
292
|
+
_format_two_column_line(
|
|
293
|
+
"", "Recent activity", left_panel_width, right_panel_width
|
|
294
|
+
)
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
# Lines 2-4: Welcome message + commit activity (3 lines total)
|
|
298
|
+
welcome_msg = f"Welcome back {username}!"
|
|
299
|
+
|
|
300
|
+
# Truncate commits to fit right panel width (leave 2 chars margin)
|
|
301
|
+
max_commit_width = right_panel_width - 2
|
|
302
|
+
truncated_commits = []
|
|
303
|
+
for commit in recent_commits:
|
|
304
|
+
if len(commit) > max_commit_width:
|
|
305
|
+
truncated_commits.append(commit[: max_commit_width - 3] + "...")
|
|
306
|
+
else:
|
|
307
|
+
truncated_commits.append(commit)
|
|
308
|
+
|
|
309
|
+
# Line 2: Welcome message | First commit or "No recent activity"
|
|
310
|
+
if truncated_commits:
|
|
311
|
+
lines.append(
|
|
312
|
+
_format_two_column_line(
|
|
313
|
+
welcome_msg, truncated_commits[0], left_panel_width, right_panel_width
|
|
314
|
+
)
|
|
315
|
+
)
|
|
316
|
+
else:
|
|
317
|
+
lines.append(
|
|
318
|
+
_format_two_column_line(
|
|
319
|
+
welcome_msg, "No recent activity", left_panel_width, right_panel_width
|
|
320
|
+
)
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
# Line 3: Empty left | Second commit or empty
|
|
324
|
+
if len(truncated_commits) >= 2:
|
|
325
|
+
lines.append(
|
|
326
|
+
_format_two_column_line(
|
|
327
|
+
"", truncated_commits[1], left_panel_width, right_panel_width
|
|
328
|
+
)
|
|
329
|
+
)
|
|
330
|
+
else:
|
|
331
|
+
lines.append(
|
|
332
|
+
_format_two_column_line("", "", left_panel_width, right_panel_width)
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
# Line 4: Empty left | Third commit or empty
|
|
336
|
+
if len(truncated_commits) >= 3:
|
|
337
|
+
lines.append(
|
|
338
|
+
_format_two_column_line(
|
|
339
|
+
"", truncated_commits[2], left_panel_width, right_panel_width
|
|
340
|
+
)
|
|
341
|
+
)
|
|
342
|
+
else:
|
|
343
|
+
lines.append(
|
|
344
|
+
_format_two_column_line("", "", left_panel_width, right_panel_width)
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
# Line 5: Empty left | separator right
|
|
348
|
+
separator = "─" * right_panel_width
|
|
349
|
+
lines.append(
|
|
350
|
+
_format_two_column_line("", separator, left_panel_width, right_panel_width)
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
# Line 6: Alien art line 1 | "What's new"
|
|
354
|
+
alien_art = _get_alien_art()
|
|
355
|
+
lines.append(
|
|
356
|
+
_format_two_column_line(
|
|
357
|
+
alien_art[0], "What's new", left_panel_width, right_panel_width
|
|
358
|
+
)
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
# Lines 7-8: More alien art | changelog highlights
|
|
362
|
+
max_highlight_width = right_panel_width - 5 # Leave some margin
|
|
363
|
+
highlights = _parse_changelog_highlights(max_items=3, max_width=max_highlight_width)
|
|
364
|
+
|
|
365
|
+
if len(highlights) >= 1:
|
|
366
|
+
lines.append(
|
|
367
|
+
_format_two_column_line(
|
|
368
|
+
alien_art[1], highlights[0], left_panel_width, right_panel_width
|
|
369
|
+
)
|
|
370
|
+
)
|
|
371
|
+
else:
|
|
372
|
+
lines.append(
|
|
373
|
+
_format_two_column_line(
|
|
374
|
+
alien_art[1], "", left_panel_width, right_panel_width
|
|
375
|
+
)
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
if len(highlights) >= 2:
|
|
379
|
+
lines.append(
|
|
380
|
+
_format_two_column_line(
|
|
381
|
+
alien_art[2], highlights[1], left_panel_width, right_panel_width
|
|
382
|
+
)
|
|
383
|
+
)
|
|
384
|
+
else:
|
|
385
|
+
lines.append(
|
|
386
|
+
_format_two_column_line(
|
|
387
|
+
alien_art[2], "", left_panel_width, right_panel_width
|
|
388
|
+
)
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
# Line 9: Empty | third highlight or link
|
|
392
|
+
if len(highlights) >= 3:
|
|
393
|
+
lines.append(
|
|
394
|
+
_format_two_column_line(
|
|
395
|
+
"", highlights[2], left_panel_width, right_panel_width
|
|
396
|
+
)
|
|
397
|
+
)
|
|
398
|
+
else:
|
|
399
|
+
lines.append(
|
|
400
|
+
_format_two_column_line(
|
|
401
|
+
"", "/mpm-tickets for more", left_panel_width, right_panel_width
|
|
402
|
+
)
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
# Line 10: Model info | separator
|
|
406
|
+
separator = "─" * right_panel_width
|
|
407
|
+
lines.append(
|
|
408
|
+
_format_two_column_line(
|
|
409
|
+
"Sonnet 4.5 · Claude MPM", separator, left_panel_width, right_panel_width
|
|
410
|
+
)
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
# Line 11: CWD | MPM Commands header
|
|
414
|
+
cwd = _get_cwd_display(left_panel_width - 2)
|
|
415
|
+
lines.append(
|
|
416
|
+
_format_two_column_line(
|
|
417
|
+
cwd, "MPM Commands", left_panel_width, right_panel_width
|
|
418
|
+
)
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
# Line 12: Empty | /mpm command
|
|
422
|
+
lines.append(
|
|
423
|
+
_format_two_column_line(
|
|
424
|
+
"", " /mpm - MPM overview", left_panel_width, right_panel_width
|
|
425
|
+
)
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
# Line 13: Empty | /mpm-agents command
|
|
429
|
+
lines.append(
|
|
430
|
+
_format_two_column_line(
|
|
431
|
+
"", " /mpm-agents - Show agents", left_panel_width, right_panel_width
|
|
432
|
+
)
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
# Line 14: Empty | /mpm-doctor command
|
|
436
|
+
lines.append(
|
|
437
|
+
_format_two_column_line(
|
|
438
|
+
"", " /mpm-doctor - Run diagnostics", left_panel_width, right_panel_width
|
|
439
|
+
)
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
# Line 15: Empty | empty
|
|
443
|
+
lines.append(_format_two_column_line("", "", left_panel_width, right_panel_width))
|
|
444
|
+
|
|
445
|
+
# Line 16: Empty | autocomplete tip
|
|
446
|
+
lines.append(
|
|
447
|
+
_format_two_column_line(
|
|
448
|
+
"", "Type / for autocomplete", left_panel_width, right_panel_width
|
|
449
|
+
)
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
# Build bottom line (plain text, no color)
|
|
453
|
+
bottom_line = f"╰{'─' * (terminal_width - 2)}╯"
|
|
454
|
+
|
|
455
|
+
# Print banner (only header has cyan color)
|
|
456
|
+
print(top_line)
|
|
457
|
+
for line in lines:
|
|
458
|
+
print(line)
|
|
459
|
+
print(bottom_line)
|
|
460
|
+
print() # Empty line after banner
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def should_show_banner(args) -> bool:
|
|
464
|
+
"""
|
|
465
|
+
Determine if startup banner should be displayed.
|
|
466
|
+
|
|
467
|
+
Skip banner for: --help, --version, info, doctor, config, configure commands
|
|
468
|
+
"""
|
|
469
|
+
# Check for help/version flags
|
|
470
|
+
if hasattr(args, "help") and args.help:
|
|
471
|
+
return False
|
|
472
|
+
if hasattr(args, "version") and args.version:
|
|
473
|
+
return False
|
|
474
|
+
|
|
475
|
+
# Check for commands that should skip banner
|
|
476
|
+
skip_commands = {"info", "doctor", "config", "configure"}
|
|
477
|
+
if hasattr(args, "command") and args.command in skip_commands:
|
|
478
|
+
return False
|
|
479
|
+
|
|
480
|
+
return True
|
claude_mpm/cli/utils.py
CHANGED
|
@@ -171,7 +171,7 @@ def setup_logging(args) -> object:
|
|
|
171
171
|
|
|
172
172
|
# Set default logging level if not specified
|
|
173
173
|
if not hasattr(args, "logging") or args.logging is None:
|
|
174
|
-
args.logging = LogLevel.
|
|
174
|
+
args.logging = LogLevel.OFF.value
|
|
175
175
|
|
|
176
176
|
# Handle deprecated --debug flag
|
|
177
177
|
if hasattr(args, "debug") and args.debug and args.logging == LogLevel.INFO.value:
|
|
@@ -107,7 +107,7 @@ class CommandRegistry:
|
|
|
107
107
|
|
|
108
108
|
# Apply extra arguments
|
|
109
109
|
for arg_name, arg_config in command.extra_args.items():
|
|
110
|
-
flags = arg_config.pop("flags", [f
|
|
110
|
+
flags = arg_config.pop("flags", [f"--{arg_name.replace('_', '-')}"])
|
|
111
111
|
subparser.add_argument(*flags, **arg_config)
|
|
112
112
|
|
|
113
113
|
# Store handler reference
|