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,45 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Code Tree Analyzer
|
|
4
|
+
==================
|
|
5
|
+
|
|
6
|
+
Analyzes source code using AST to extract structure and metrics,
|
|
7
|
+
supporting multiple languages and emitting incremental events for visualization.
|
|
8
|
+
|
|
9
|
+
This module has been refactored from a single 1,825-line file into focused,
|
|
10
|
+
maintainable components while preserving complete backward compatibility.
|
|
11
|
+
|
|
12
|
+
Public API:
|
|
13
|
+
-----------
|
|
14
|
+
- CodeTreeAnalyzer: Main analyzer class
|
|
15
|
+
- CodeNode: Data structure for code nodes
|
|
16
|
+
- GitignoreManager: Gitignore pattern matching
|
|
17
|
+
- PythonAnalyzer: Python AST analysis
|
|
18
|
+
- MultiLanguageAnalyzer: Multi-language support
|
|
19
|
+
|
|
20
|
+
Example Usage:
|
|
21
|
+
--------------
|
|
22
|
+
from claude_mpm.tools.code_tree_analyzer import CodeTreeAnalyzer
|
|
23
|
+
|
|
24
|
+
analyzer = CodeTreeAnalyzer(emit_events=True)
|
|
25
|
+
result = analyzer.analyze_directory(Path("/path/to/code"))
|
|
26
|
+
print(result['stats'])
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# Public API - Backward compatible imports
|
|
30
|
+
from .core import CodeTreeAnalyzer
|
|
31
|
+
from .gitignore import GitignoreManager
|
|
32
|
+
from .models import CodeNode
|
|
33
|
+
from .multilang_analyzer import MultiLanguageAnalyzer
|
|
34
|
+
from .python_analyzer import PythonAnalyzer
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"CodeNode",
|
|
38
|
+
"CodeTreeAnalyzer",
|
|
39
|
+
"GitignoreManager",
|
|
40
|
+
"MultiLanguageAnalyzer",
|
|
41
|
+
"PythonAnalyzer",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
# Version info
|
|
45
|
+
__version__ = "2.0.0" # Major refactoring while maintaining API compatibility
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Analysis Module
|
|
4
|
+
===============
|
|
5
|
+
|
|
6
|
+
Coordinates file analysis across different language analyzers.
|
|
7
|
+
|
|
8
|
+
WHY: Centralizes file analysis logic and result processing,
|
|
9
|
+
separating it from directory traversal and caching concerns.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import time
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Dict, List, Tuple
|
|
15
|
+
|
|
16
|
+
from ...core.logging_config import get_logger
|
|
17
|
+
from .cache import CacheManager
|
|
18
|
+
from .events import EventManager
|
|
19
|
+
from .models import CodeNode
|
|
20
|
+
from .multilang_analyzer import MultiLanguageAnalyzer
|
|
21
|
+
from .python_analyzer import PythonAnalyzer
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class FileAnalyzer:
|
|
25
|
+
"""Coordinates file analysis using appropriate language analyzers."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
python_analyzer: PythonAnalyzer,
|
|
30
|
+
multilang_analyzer: MultiLanguageAnalyzer,
|
|
31
|
+
cache_manager: CacheManager,
|
|
32
|
+
event_manager: EventManager,
|
|
33
|
+
):
|
|
34
|
+
"""Initialize file analyzer.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
python_analyzer: Python analyzer instance
|
|
38
|
+
multilang_analyzer: Multi-language analyzer instance
|
|
39
|
+
cache_manager: Cache manager instance
|
|
40
|
+
event_manager: Event manager instance
|
|
41
|
+
"""
|
|
42
|
+
self.logger = get_logger(__name__)
|
|
43
|
+
self.python_analyzer = python_analyzer
|
|
44
|
+
self.multilang_analyzer = multilang_analyzer
|
|
45
|
+
self.cache_manager = cache_manager
|
|
46
|
+
self.event_manager = event_manager
|
|
47
|
+
|
|
48
|
+
def analyze_file(self, file_path: str) -> Dict[str, any]:
|
|
49
|
+
"""Analyze a specific file and return its AST structure.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
file_path: Path to file to analyze
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Dictionary with file analysis results
|
|
56
|
+
"""
|
|
57
|
+
path = Path(file_path)
|
|
58
|
+
if not path.exists() or not path.is_file():
|
|
59
|
+
return {"error": f"Invalid file: {file_path}"}
|
|
60
|
+
|
|
61
|
+
language = self._get_language(path)
|
|
62
|
+
self.event_manager.emit_analysis_start(path, language)
|
|
63
|
+
|
|
64
|
+
# Check cache
|
|
65
|
+
cache_key = self.cache_manager.get_cache_key(path)
|
|
66
|
+
|
|
67
|
+
if cached_nodes := self.cache_manager.get(cache_key):
|
|
68
|
+
self.event_manager.emit_cache_hit(path)
|
|
69
|
+
filtered_nodes = self._filter_nodes(cached_nodes)
|
|
70
|
+
else:
|
|
71
|
+
_nodes, filtered_nodes, duration = self._analyze_and_cache_file(
|
|
72
|
+
path, language, cache_key
|
|
73
|
+
)
|
|
74
|
+
self.event_manager.emit_analysis_complete(path, filtered_nodes, duration)
|
|
75
|
+
|
|
76
|
+
# Prepare final data structures
|
|
77
|
+
final_nodes = filtered_nodes if filtered_nodes else []
|
|
78
|
+
elements = self._convert_nodes_to_elements(final_nodes)
|
|
79
|
+
|
|
80
|
+
return self._build_result(file_path, language, final_nodes, elements)
|
|
81
|
+
|
|
82
|
+
def _analyze_and_cache_file(
|
|
83
|
+
self, path: Path, language: str, cache_key: str
|
|
84
|
+
) -> Tuple[List[CodeNode], List[dict], float]:
|
|
85
|
+
"""Analyze file content and cache results.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
path: File path
|
|
89
|
+
language: Programming language
|
|
90
|
+
cache_key: Cache key for storing results
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Tuple of (all_nodes, filtered_nodes, duration)
|
|
94
|
+
"""
|
|
95
|
+
self.event_manager.emit_cache_miss(path)
|
|
96
|
+
self.event_manager.emit_parsing_start(path)
|
|
97
|
+
|
|
98
|
+
# Select analyzer based on language
|
|
99
|
+
analyzer = self._select_analyzer(language)
|
|
100
|
+
|
|
101
|
+
# Perform analysis
|
|
102
|
+
start_time = time.time()
|
|
103
|
+
nodes = analyzer.analyze_file(path) if analyzer else []
|
|
104
|
+
duration = time.time() - start_time
|
|
105
|
+
|
|
106
|
+
# Cache results
|
|
107
|
+
self.cache_manager.set(cache_key, nodes)
|
|
108
|
+
|
|
109
|
+
# Filter and process nodes
|
|
110
|
+
filtered_nodes = self._filter_and_emit_nodes(nodes, path)
|
|
111
|
+
|
|
112
|
+
return nodes, filtered_nodes, duration
|
|
113
|
+
|
|
114
|
+
def _select_analyzer(self, language: str):
|
|
115
|
+
"""Select appropriate analyzer for language.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
language: Programming language
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Analyzer instance or None
|
|
122
|
+
"""
|
|
123
|
+
if language == "python":
|
|
124
|
+
return self.python_analyzer
|
|
125
|
+
if language in {"javascript", "typescript"}:
|
|
126
|
+
return self.multilang_analyzer
|
|
127
|
+
return self.multilang_analyzer
|
|
128
|
+
|
|
129
|
+
def _filter_nodes(self, nodes: List[CodeNode]) -> List[dict]:
|
|
130
|
+
"""Filter nodes without emitting events.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
nodes: List of CodeNode objects
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
List of filtered node dictionaries
|
|
137
|
+
"""
|
|
138
|
+
return [self._node_to_dict(n) for n in nodes if not self._is_internal_node(n)]
|
|
139
|
+
|
|
140
|
+
def _filter_and_emit_nodes(self, nodes: List[CodeNode], path: Path) -> List[dict]:
|
|
141
|
+
"""Filter nodes and emit events for each.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
nodes: List of CodeNode objects
|
|
145
|
+
path: File path being analyzed
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
List of filtered node dictionaries
|
|
149
|
+
"""
|
|
150
|
+
filtered_nodes = []
|
|
151
|
+
for node in nodes:
|
|
152
|
+
if not self._is_internal_node(node):
|
|
153
|
+
self.event_manager.emit_node_found(node, path)
|
|
154
|
+
filtered_nodes.append(self._node_to_dict(node))
|
|
155
|
+
return filtered_nodes
|
|
156
|
+
|
|
157
|
+
def _node_to_dict(self, node: CodeNode) -> dict:
|
|
158
|
+
"""Convert CodeNode to dictionary.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
node: CodeNode object
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Dictionary representation
|
|
165
|
+
"""
|
|
166
|
+
return {
|
|
167
|
+
"name": node.name,
|
|
168
|
+
"type": node.node_type,
|
|
169
|
+
"line_start": node.line_start,
|
|
170
|
+
"line_end": node.line_end,
|
|
171
|
+
"complexity": node.complexity,
|
|
172
|
+
"has_docstring": node.has_docstring,
|
|
173
|
+
"signature": node.signature,
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
def _convert_nodes_to_elements(self, final_nodes: List[dict]) -> List[dict]:
|
|
177
|
+
"""Convert nodes to elements format for dashboard.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
final_nodes: List of node dictionaries
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
List of element dictionaries
|
|
184
|
+
"""
|
|
185
|
+
elements = []
|
|
186
|
+
for node in final_nodes:
|
|
187
|
+
element = {
|
|
188
|
+
"name": node["name"],
|
|
189
|
+
"type": node["type"],
|
|
190
|
+
"line": node["line_start"],
|
|
191
|
+
"complexity": node["complexity"],
|
|
192
|
+
"signature": node.get("signature", ""),
|
|
193
|
+
"has_docstring": node.get("has_docstring", False),
|
|
194
|
+
}
|
|
195
|
+
if node["type"] == "class":
|
|
196
|
+
element["methods"] = []
|
|
197
|
+
elements.append(element)
|
|
198
|
+
return elements
|
|
199
|
+
|
|
200
|
+
def _build_result(
|
|
201
|
+
self,
|
|
202
|
+
file_path: str,
|
|
203
|
+
language: str,
|
|
204
|
+
final_nodes: List[dict],
|
|
205
|
+
elements: List[dict],
|
|
206
|
+
) -> dict:
|
|
207
|
+
"""Build final result dictionary.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
file_path: File path
|
|
211
|
+
language: Programming language
|
|
212
|
+
final_nodes: List of node dictionaries
|
|
213
|
+
elements: List of element dictionaries
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
Complete result dictionary
|
|
217
|
+
"""
|
|
218
|
+
return {
|
|
219
|
+
"path": file_path,
|
|
220
|
+
"language": language,
|
|
221
|
+
"nodes": final_nodes,
|
|
222
|
+
"elements": elements,
|
|
223
|
+
"complexity": sum(e["complexity"] for e in elements),
|
|
224
|
+
"lines": len(elements),
|
|
225
|
+
"stats": {
|
|
226
|
+
"classes": len([e for e in elements if e["type"] == "class"]),
|
|
227
|
+
"functions": len([e for e in elements if e["type"] == "function"]),
|
|
228
|
+
"methods": len([e for e in elements if e["type"] == "method"]),
|
|
229
|
+
"variables": len([e for e in elements if e["type"] == "variable"]),
|
|
230
|
+
"imports": len([e for e in elements if e["type"] == "import"]),
|
|
231
|
+
"total": len(elements),
|
|
232
|
+
},
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
def _is_internal_node(self, node: CodeNode) -> bool:
|
|
236
|
+
"""Check if node is an internal function that should be filtered.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
node: CodeNode to check
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
True if node should be filtered out
|
|
243
|
+
"""
|
|
244
|
+
# Don't filter classes - always show them
|
|
245
|
+
if node.node_type == "class":
|
|
246
|
+
return False
|
|
247
|
+
|
|
248
|
+
# Don't filter variables or imports - they're useful for tree view
|
|
249
|
+
if node.node_type in ["variable", "import"]:
|
|
250
|
+
return False
|
|
251
|
+
|
|
252
|
+
name_lower = node.name.lower()
|
|
253
|
+
|
|
254
|
+
# Filter only very specific internal patterns
|
|
255
|
+
# Be more conservative - only filter obvious internal handlers
|
|
256
|
+
if name_lower.startswith(("handle_", "on_")):
|
|
257
|
+
return True
|
|
258
|
+
|
|
259
|
+
# Filter Python magic methods except important ones
|
|
260
|
+
if name_lower.startswith("__") and name_lower.endswith("__"):
|
|
261
|
+
# Keep important magic methods
|
|
262
|
+
important_magic = [
|
|
263
|
+
"__init__",
|
|
264
|
+
"__call__",
|
|
265
|
+
"__enter__",
|
|
266
|
+
"__exit__",
|
|
267
|
+
"__str__",
|
|
268
|
+
"__repr__",
|
|
269
|
+
]
|
|
270
|
+
return node.name not in important_magic
|
|
271
|
+
|
|
272
|
+
# Filter very generic getters/setters only if they're trivial
|
|
273
|
+
if (name_lower.startswith(("get_", "set_"))) and len(node.name) <= 8:
|
|
274
|
+
return True
|
|
275
|
+
|
|
276
|
+
# Don't filter single underscore functions - they're often important
|
|
277
|
+
# (like _setup_logging, _validate_input, etc.)
|
|
278
|
+
return False
|
|
279
|
+
|
|
280
|
+
def _get_language(self, file_path: Path) -> str:
|
|
281
|
+
"""Determine language from file extension.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
file_path: Path to file
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
Language string
|
|
288
|
+
"""
|
|
289
|
+
ext = file_path.suffix.lower()
|
|
290
|
+
language_map = {
|
|
291
|
+
".py": "python",
|
|
292
|
+
".js": "javascript",
|
|
293
|
+
".jsx": "javascript",
|
|
294
|
+
".ts": "typescript",
|
|
295
|
+
".tsx": "typescript",
|
|
296
|
+
".mjs": "javascript",
|
|
297
|
+
".cjs": "javascript",
|
|
298
|
+
}
|
|
299
|
+
return language_map.get(ext, "unknown")
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Cache Module
|
|
4
|
+
============
|
|
5
|
+
|
|
6
|
+
Handles caching of analyzed code tree results.
|
|
7
|
+
|
|
8
|
+
WHY: Caching prevents re-parsing files that haven't changed,
|
|
9
|
+
significantly improving performance for large codebases.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import hashlib
|
|
13
|
+
import json
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Dict, List
|
|
16
|
+
|
|
17
|
+
from ...core.logging_config import get_logger
|
|
18
|
+
from .models import CodeNode
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CacheManager:
|
|
22
|
+
"""Manages caching of code analysis results."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, cache_dir: Path):
|
|
25
|
+
"""Initialize cache manager.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
cache_dir: Directory to store cache files
|
|
29
|
+
"""
|
|
30
|
+
self.logger = get_logger(__name__)
|
|
31
|
+
self.cache_dir = cache_dir
|
|
32
|
+
self.cache: Dict[str, List[CodeNode]] = {}
|
|
33
|
+
|
|
34
|
+
def get_file_hash(self, file_path: Path) -> str:
|
|
35
|
+
"""Get hash of file contents for caching.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
file_path: Path to file
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
MD5 hash of file contents
|
|
42
|
+
"""
|
|
43
|
+
hasher = hashlib.md5()
|
|
44
|
+
with file_path.open("rb") as f:
|
|
45
|
+
hasher.update(f.read())
|
|
46
|
+
return hasher.hexdigest()
|
|
47
|
+
|
|
48
|
+
def get_cache_key(self, file_path: Path) -> str:
|
|
49
|
+
"""Generate cache key for a file.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
file_path: Path to file
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Cache key string
|
|
56
|
+
"""
|
|
57
|
+
file_hash = self.get_file_hash(file_path)
|
|
58
|
+
return f"{file_path}:{file_hash}"
|
|
59
|
+
|
|
60
|
+
def get(self, cache_key: str) -> List[CodeNode]:
|
|
61
|
+
"""Get cached nodes for a file.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
cache_key: Cache key
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
List of cached nodes or None if not cached
|
|
68
|
+
"""
|
|
69
|
+
return self.cache.get(cache_key)
|
|
70
|
+
|
|
71
|
+
def set(self, cache_key: str, nodes: List[CodeNode]) -> None:
|
|
72
|
+
"""Cache nodes for a file.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
cache_key: Cache key
|
|
76
|
+
nodes: List of nodes to cache
|
|
77
|
+
"""
|
|
78
|
+
self.cache[cache_key] = nodes
|
|
79
|
+
|
|
80
|
+
def load(self) -> None:
|
|
81
|
+
"""Load cache from disk."""
|
|
82
|
+
cache_file = self.cache_dir / "code_tree_cache.json"
|
|
83
|
+
if cache_file.exists():
|
|
84
|
+
try:
|
|
85
|
+
with cache_file.open() as f:
|
|
86
|
+
cache_data = json.load(f)
|
|
87
|
+
# Reconstruct CodeNode objects
|
|
88
|
+
for key, nodes_data in cache_data.items():
|
|
89
|
+
self.cache[key] = [
|
|
90
|
+
CodeNode(**node_data) for node_data in nodes_data
|
|
91
|
+
]
|
|
92
|
+
self.logger.info(f"Loaded cache with {len(self.cache)} entries")
|
|
93
|
+
except Exception as e:
|
|
94
|
+
self.logger.warning(f"Failed to load cache: {e}")
|
|
95
|
+
|
|
96
|
+
def save(self) -> None:
|
|
97
|
+
"""Save cache to disk."""
|
|
98
|
+
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
99
|
+
cache_file = self.cache_dir / "code_tree_cache.json"
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
# Convert CodeNode objects to dictionaries
|
|
103
|
+
cache_data = {}
|
|
104
|
+
for key, nodes in self.cache.items():
|
|
105
|
+
cache_data[key] = [
|
|
106
|
+
{
|
|
107
|
+
"file_path": n.file_path,
|
|
108
|
+
"node_type": n.node_type,
|
|
109
|
+
"name": n.name,
|
|
110
|
+
"line_start": n.line_start,
|
|
111
|
+
"line_end": n.line_end,
|
|
112
|
+
"complexity": n.complexity,
|
|
113
|
+
"has_docstring": n.has_docstring,
|
|
114
|
+
"decorators": n.decorators,
|
|
115
|
+
"parent": n.parent,
|
|
116
|
+
"language": n.language,
|
|
117
|
+
"signature": n.signature,
|
|
118
|
+
}
|
|
119
|
+
for n in nodes
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
with cache_file.open("w") as f:
|
|
123
|
+
json.dump(cache_data, f, indent=2)
|
|
124
|
+
|
|
125
|
+
self.logger.info(f"Saved cache with {len(self.cache)} entries")
|
|
126
|
+
except Exception as e:
|
|
127
|
+
self.logger.warning(f"Failed to save cache: {e}")
|
|
128
|
+
|
|
129
|
+
def clear(self) -> None:
|
|
130
|
+
"""Clear all cached data."""
|
|
131
|
+
self.cache.clear()
|