claude-mpm 4.21.0__py3-none-any.whl → 5.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +38 -2
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +125 -20
- claude_mpm/cli/commands/agents.py +684 -13
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +2 -6
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +478 -44
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +435 -1
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +919 -41
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +173 -4
- claude_mpm/cli/parsers/base_parser.py +49 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +138 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +499 -84
- 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/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +14 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +11 -0
- claude_mpm/config/agent_presets.py +258 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +17 -10
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- 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 +112 -5
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +94 -4
- 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/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/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- 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/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +92 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- 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/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- 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/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- 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/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/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- 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/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- 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/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- 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/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- 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 +80 -13
- 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/progress.py +383 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
- 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/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -180
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -211
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- 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/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -140
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/ticketing.json +0 -177
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- 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/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- 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/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Gitignore Manager
|
|
4
|
+
=================
|
|
5
|
+
|
|
6
|
+
Manages .gitignore pattern matching for file filtering.
|
|
7
|
+
|
|
8
|
+
WHY: Properly respecting .gitignore patterns ensures we don't analyze
|
|
9
|
+
or display files that should be ignored in the repository.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any, ClassVar, Dict, List, Optional
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
import pathspec
|
|
17
|
+
|
|
18
|
+
PATHSPEC_AVAILABLE = True
|
|
19
|
+
except ImportError:
|
|
20
|
+
PATHSPEC_AVAILABLE = False
|
|
21
|
+
pathspec = None
|
|
22
|
+
|
|
23
|
+
from ...core.logging_config import get_logger
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class GitignoreManager:
|
|
27
|
+
"""Manages .gitignore pattern matching for file filtering."""
|
|
28
|
+
|
|
29
|
+
# Default patterns that should always be ignored
|
|
30
|
+
DEFAULT_PATTERNS: ClassVar[list] = [
|
|
31
|
+
".git/",
|
|
32
|
+
"__pycache__/",
|
|
33
|
+
"*.pyc",
|
|
34
|
+
"*.pyo",
|
|
35
|
+
".DS_Store",
|
|
36
|
+
".pytest_cache/",
|
|
37
|
+
".mypy_cache/",
|
|
38
|
+
"dist/",
|
|
39
|
+
"build/",
|
|
40
|
+
"*.egg-info/",
|
|
41
|
+
".coverage",
|
|
42
|
+
".tox/",
|
|
43
|
+
"htmlcov/",
|
|
44
|
+
".idea/",
|
|
45
|
+
".vscode/",
|
|
46
|
+
"*.swp",
|
|
47
|
+
"*.swo",
|
|
48
|
+
"*~",
|
|
49
|
+
"Thumbs.db",
|
|
50
|
+
"node_modules/",
|
|
51
|
+
".venv/",
|
|
52
|
+
"venv/",
|
|
53
|
+
"env/",
|
|
54
|
+
".env",
|
|
55
|
+
"*.log",
|
|
56
|
+
".ipynb_checkpoints/",
|
|
57
|
+
"__MACOSX/",
|
|
58
|
+
".Spotlight-V100/",
|
|
59
|
+
".Trashes/",
|
|
60
|
+
"desktop.ini",
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
# Additional patterns to hide dotfiles (when enabled)
|
|
64
|
+
DOTFILE_PATTERNS: ClassVar[list] = [
|
|
65
|
+
".*", # All dotfiles
|
|
66
|
+
".*/", # All dot directories
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
# Important files/directories to always show
|
|
70
|
+
DOTFILE_EXCEPTIONS: ClassVar[set] = {
|
|
71
|
+
# Removed .gitignore from exceptions - it should be hidden by default
|
|
72
|
+
".env.example",
|
|
73
|
+
".env.sample",
|
|
74
|
+
".gitlab-ci.yml",
|
|
75
|
+
".travis.yml",
|
|
76
|
+
".dockerignore",
|
|
77
|
+
".editorconfig",
|
|
78
|
+
".eslintrc",
|
|
79
|
+
".prettierrc",
|
|
80
|
+
# Removed .github from exceptions - it should be hidden by default
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
def __init__(self):
|
|
84
|
+
"""Initialize the GitignoreManager."""
|
|
85
|
+
self.logger = get_logger(__name__)
|
|
86
|
+
self._pathspec_cache: Dict[str, Any] = {}
|
|
87
|
+
self._gitignore_cache: Dict[str, List[str]] = {}
|
|
88
|
+
self._use_pathspec = PATHSPEC_AVAILABLE
|
|
89
|
+
|
|
90
|
+
if not self._use_pathspec:
|
|
91
|
+
self.logger.warning(
|
|
92
|
+
"pathspec library not available - using basic pattern matching"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
def get_ignore_patterns(self, working_dir: Path) -> List[str]:
|
|
96
|
+
"""Get all ignore patterns for a directory.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
working_dir: The working directory to search for .gitignore files
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
Combined list of ignore patterns from all sources
|
|
103
|
+
"""
|
|
104
|
+
# Always include default patterns
|
|
105
|
+
patterns = self.DEFAULT_PATTERNS.copy()
|
|
106
|
+
|
|
107
|
+
# Don't add dotfile patterns here - handle them separately in should_ignore
|
|
108
|
+
# This prevents exceptions from being overridden by the .* pattern
|
|
109
|
+
|
|
110
|
+
# Find and parse .gitignore files
|
|
111
|
+
gitignore_files = self._find_gitignore_files(working_dir)
|
|
112
|
+
for gitignore_file in gitignore_files:
|
|
113
|
+
patterns.extend(self._parse_gitignore(gitignore_file))
|
|
114
|
+
|
|
115
|
+
return patterns
|
|
116
|
+
|
|
117
|
+
def should_ignore(self, path: Path, working_dir: Path) -> bool:
|
|
118
|
+
"""Check if a path should be ignored based on patterns.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
path: The path to check
|
|
122
|
+
working_dir: The working directory (for relative path calculation)
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
True if the path should be ignored
|
|
126
|
+
"""
|
|
127
|
+
# Get the filename
|
|
128
|
+
filename = path.name
|
|
129
|
+
|
|
130
|
+
# 1. ALWAYS hide system files regardless of settings
|
|
131
|
+
ALWAYS_HIDE = {".DS_Store", "Thumbs.db", ".pyc", ".pyo", ".pyd"}
|
|
132
|
+
if filename in ALWAYS_HIDE or filename.endswith((".pyc", ".pyo", ".pyd")):
|
|
133
|
+
return True
|
|
134
|
+
|
|
135
|
+
# 2. Check dotfiles - ALWAYS filter them out (except exceptions)
|
|
136
|
+
if filename.startswith("."):
|
|
137
|
+
# Hide all dotfiles except those in the exceptions list
|
|
138
|
+
# This means: return True (ignore) if NOT in exceptions
|
|
139
|
+
return filename not in self.DOTFILE_EXCEPTIONS
|
|
140
|
+
|
|
141
|
+
# Get or create PathSpec for this working directory
|
|
142
|
+
pathspec_obj = self._get_pathspec(working_dir)
|
|
143
|
+
|
|
144
|
+
if pathspec_obj:
|
|
145
|
+
# Use pathspec for accurate matching
|
|
146
|
+
try:
|
|
147
|
+
rel_path = path.relative_to(working_dir)
|
|
148
|
+
rel_path_str = str(rel_path)
|
|
149
|
+
|
|
150
|
+
# For directories, also check with trailing slash
|
|
151
|
+
if path.is_dir():
|
|
152
|
+
return pathspec_obj.match_file(
|
|
153
|
+
rel_path_str
|
|
154
|
+
) or pathspec_obj.match_file(rel_path_str + "/")
|
|
155
|
+
return pathspec_obj.match_file(rel_path_str)
|
|
156
|
+
except ValueError:
|
|
157
|
+
# Path is outside working directory
|
|
158
|
+
return False
|
|
159
|
+
else:
|
|
160
|
+
# Fallback to basic pattern matching
|
|
161
|
+
return self._basic_should_ignore(path, working_dir)
|
|
162
|
+
|
|
163
|
+
def _get_pathspec(self, working_dir: Path) -> Optional[Any]:
|
|
164
|
+
"""Get or create a PathSpec object for the working directory.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
working_dir: The working directory
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
PathSpec object or None if not available
|
|
171
|
+
"""
|
|
172
|
+
if not self._use_pathspec:
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
cache_key = str(working_dir)
|
|
176
|
+
if cache_key not in self._pathspec_cache:
|
|
177
|
+
patterns = self.get_ignore_patterns(working_dir)
|
|
178
|
+
try:
|
|
179
|
+
self._pathspec_cache[cache_key] = pathspec.PathSpec.from_lines(
|
|
180
|
+
"gitwildmatch", patterns
|
|
181
|
+
)
|
|
182
|
+
except Exception as e:
|
|
183
|
+
self.logger.warning(f"Failed to create PathSpec: {e}")
|
|
184
|
+
return None
|
|
185
|
+
|
|
186
|
+
return self._pathspec_cache[cache_key]
|
|
187
|
+
|
|
188
|
+
def _find_gitignore_files(self, working_dir: Path) -> List[Path]:
|
|
189
|
+
"""Find all .gitignore files in the directory tree.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
working_dir: The directory to search
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
List of .gitignore file paths
|
|
196
|
+
"""
|
|
197
|
+
gitignore_files = []
|
|
198
|
+
|
|
199
|
+
# Check for .gitignore in working directory
|
|
200
|
+
main_gitignore = working_dir / ".gitignore"
|
|
201
|
+
if main_gitignore.exists():
|
|
202
|
+
gitignore_files.append(main_gitignore)
|
|
203
|
+
|
|
204
|
+
# Also check parent directories up to repository root
|
|
205
|
+
current = working_dir
|
|
206
|
+
while current != current.parent:
|
|
207
|
+
parent_gitignore = current.parent / ".gitignore"
|
|
208
|
+
if parent_gitignore.exists():
|
|
209
|
+
gitignore_files.append(parent_gitignore)
|
|
210
|
+
|
|
211
|
+
# Stop if we find a .git directory (repository root)
|
|
212
|
+
if (current / ".git").exists():
|
|
213
|
+
break
|
|
214
|
+
|
|
215
|
+
current = current.parent
|
|
216
|
+
|
|
217
|
+
return gitignore_files
|
|
218
|
+
|
|
219
|
+
def _parse_gitignore(self, gitignore_path: Path) -> List[str]:
|
|
220
|
+
"""Parse a .gitignore file and return patterns.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
gitignore_path: Path to .gitignore file
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
List of patterns from the file
|
|
227
|
+
"""
|
|
228
|
+
cache_key = str(gitignore_path)
|
|
229
|
+
|
|
230
|
+
# Check cache
|
|
231
|
+
if cache_key in self._gitignore_cache:
|
|
232
|
+
return self._gitignore_cache[cache_key]
|
|
233
|
+
|
|
234
|
+
patterns = []
|
|
235
|
+
try:
|
|
236
|
+
with Path(gitignore_path).open(
|
|
237
|
+
encoding="utf-8",
|
|
238
|
+
) as f:
|
|
239
|
+
for line in f:
|
|
240
|
+
line = line.strip()
|
|
241
|
+
# Skip empty lines and comments
|
|
242
|
+
if line and not line.startswith("#"):
|
|
243
|
+
patterns.append(line)
|
|
244
|
+
|
|
245
|
+
self._gitignore_cache[cache_key] = patterns
|
|
246
|
+
except Exception as e:
|
|
247
|
+
self.logger.warning(f"Failed to parse {gitignore_path}: {e}")
|
|
248
|
+
|
|
249
|
+
return patterns
|
|
250
|
+
|
|
251
|
+
def _basic_should_ignore(self, path: Path, working_dir: Path) -> bool:
|
|
252
|
+
"""Basic pattern matching fallback when pathspec is not available.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
path: The path to check
|
|
256
|
+
working_dir: The working directory
|
|
257
|
+
|
|
258
|
+
Returns:
|
|
259
|
+
True if the path should be ignored
|
|
260
|
+
"""
|
|
261
|
+
path_str = str(path)
|
|
262
|
+
path_name = path.name
|
|
263
|
+
|
|
264
|
+
# 1. ALWAYS hide system files regardless of settings
|
|
265
|
+
ALWAYS_HIDE = {".DS_Store", "Thumbs.db", ".pyc", ".pyo", ".pyd"}
|
|
266
|
+
if path_name in ALWAYS_HIDE or path_name.endswith((".pyc", ".pyo", ".pyd")):
|
|
267
|
+
return True
|
|
268
|
+
|
|
269
|
+
# 2. Check dotfiles - ALWAYS filter them out (except exceptions)
|
|
270
|
+
if path_name.startswith("."):
|
|
271
|
+
# Only show if in exceptions list
|
|
272
|
+
return path_name not in self.DOTFILE_EXCEPTIONS
|
|
273
|
+
|
|
274
|
+
patterns = self.get_ignore_patterns(working_dir)
|
|
275
|
+
|
|
276
|
+
for pattern in patterns:
|
|
277
|
+
# Skip dotfile patterns since we already handled them above
|
|
278
|
+
if pattern in [".*", ".*/"]:
|
|
279
|
+
continue
|
|
280
|
+
|
|
281
|
+
# Simple pattern matching
|
|
282
|
+
if pattern.endswith("/"):
|
|
283
|
+
# Directory pattern
|
|
284
|
+
if path.is_dir() and path_name == pattern[:-1]:
|
|
285
|
+
return True
|
|
286
|
+
elif pattern.startswith("*."):
|
|
287
|
+
# Extension pattern
|
|
288
|
+
if path_name.endswith(pattern[1:]):
|
|
289
|
+
return True
|
|
290
|
+
elif "*" in pattern:
|
|
291
|
+
# Wildcard pattern (simplified)
|
|
292
|
+
import fnmatch
|
|
293
|
+
|
|
294
|
+
if fnmatch.fnmatch(path_name, pattern):
|
|
295
|
+
return True
|
|
296
|
+
elif pattern in path_str:
|
|
297
|
+
# Substring match
|
|
298
|
+
return True
|
|
299
|
+
elif path_name == pattern:
|
|
300
|
+
# Exact match
|
|
301
|
+
return True
|
|
302
|
+
|
|
303
|
+
return False
|
|
304
|
+
|
|
305
|
+
def clear_cache(self):
|
|
306
|
+
"""Clear all caches."""
|
|
307
|
+
self._pathspec_cache.clear()
|
|
308
|
+
self._gitignore_cache.clear()
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Code Tree Models
|
|
4
|
+
================
|
|
5
|
+
|
|
6
|
+
Data structures for representing code nodes in the analysis tree.
|
|
7
|
+
|
|
8
|
+
WHY: Centralizes data models for clean separation between data and logic.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any, Dict, List, Optional
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class CodeNode:
|
|
17
|
+
"""Represents a node in the code tree."""
|
|
18
|
+
|
|
19
|
+
file_path: str
|
|
20
|
+
node_type: str
|
|
21
|
+
name: str
|
|
22
|
+
line_start: int
|
|
23
|
+
line_end: int
|
|
24
|
+
complexity: int = 0
|
|
25
|
+
has_docstring: bool = False
|
|
26
|
+
decorators: List[str] = None
|
|
27
|
+
parent: Optional[str] = None
|
|
28
|
+
children: List["CodeNode"] = None
|
|
29
|
+
language: str = "python"
|
|
30
|
+
signature: str = ""
|
|
31
|
+
metrics: Dict[str, Any] = None
|
|
32
|
+
|
|
33
|
+
def __post_init__(self):
|
|
34
|
+
if self.decorators is None:
|
|
35
|
+
self.decorators = []
|
|
36
|
+
if self.children is None:
|
|
37
|
+
self.children = []
|
|
38
|
+
if self.metrics is None:
|
|
39
|
+
self.metrics = {}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Multi-Language Analyzer
|
|
4
|
+
========================
|
|
5
|
+
|
|
6
|
+
Analyzes multiple programming languages using tree-sitter.
|
|
7
|
+
|
|
8
|
+
WHY: Tree-sitter provides consistent parsing across multiple languages,
|
|
9
|
+
allowing us to support JavaScript, TypeScript, and other languages.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import importlib.util
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import ClassVar, List, Optional
|
|
15
|
+
|
|
16
|
+
from ...core.logging_config import get_logger
|
|
17
|
+
from ..code_tree_events import CodeNodeEvent, CodeTreeEventEmitter
|
|
18
|
+
from .models import CodeNode
|
|
19
|
+
|
|
20
|
+
# Check for tree-sitter availability
|
|
21
|
+
if importlib.util.find_spec("tree_sitter"):
|
|
22
|
+
import tree_sitter
|
|
23
|
+
|
|
24
|
+
TREE_SITTER_AVAILABLE = True
|
|
25
|
+
else:
|
|
26
|
+
TREE_SITTER_AVAILABLE = False
|
|
27
|
+
tree_sitter = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class MultiLanguageAnalyzer:
|
|
31
|
+
"""Analyzes multiple programming languages using tree-sitter."""
|
|
32
|
+
|
|
33
|
+
LANGUAGE_PARSERS: ClassVar[dict] = {
|
|
34
|
+
"python": "tree_sitter_python",
|
|
35
|
+
"javascript": "tree_sitter_javascript",
|
|
36
|
+
"typescript": "tree_sitter_typescript",
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
def __init__(self, emitter: Optional[CodeTreeEventEmitter] = None):
|
|
40
|
+
self.logger = get_logger(__name__)
|
|
41
|
+
self.emitter = emitter
|
|
42
|
+
self.parsers = {}
|
|
43
|
+
self._init_parsers()
|
|
44
|
+
|
|
45
|
+
def _init_parsers(self):
|
|
46
|
+
"""Initialize tree-sitter parsers for supported languages."""
|
|
47
|
+
if not TREE_SITTER_AVAILABLE:
|
|
48
|
+
self.logger.warning(
|
|
49
|
+
"tree-sitter not available - multi-language support disabled"
|
|
50
|
+
)
|
|
51
|
+
return
|
|
52
|
+
|
|
53
|
+
for lang, module_name in self.LANGUAGE_PARSERS.items():
|
|
54
|
+
try:
|
|
55
|
+
# Dynamic import of language module
|
|
56
|
+
module = __import__(module_name)
|
|
57
|
+
parser = tree_sitter.Parser()
|
|
58
|
+
# Different tree-sitter versions have different APIs
|
|
59
|
+
if hasattr(parser, "set_language"):
|
|
60
|
+
parser.set_language(tree_sitter.Language(module.language()))
|
|
61
|
+
else:
|
|
62
|
+
# Newer API
|
|
63
|
+
lang_obj = tree_sitter.Language(module.language())
|
|
64
|
+
parser = tree_sitter.Parser(lang_obj)
|
|
65
|
+
self.parsers[lang] = parser
|
|
66
|
+
except (ImportError, AttributeError) as e:
|
|
67
|
+
# Silently skip unavailable parsers - will fall back to basic file discovery
|
|
68
|
+
self.logger.debug(f"Language parser not available for {lang}: {e}")
|
|
69
|
+
|
|
70
|
+
def analyze_file(self, file_path: Path, language: str) -> List[CodeNode]:
|
|
71
|
+
"""Analyze a file using tree-sitter.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
file_path: Path to source file
|
|
75
|
+
language: Programming language
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
List of code nodes found in the file
|
|
79
|
+
"""
|
|
80
|
+
if language not in self.parsers:
|
|
81
|
+
# No parser available - return empty list to fall back to basic discovery
|
|
82
|
+
self.logger.debug(
|
|
83
|
+
f"No parser available for language: {language}, using basic file discovery"
|
|
84
|
+
)
|
|
85
|
+
return []
|
|
86
|
+
|
|
87
|
+
nodes = []
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
with file_path.open("rb") as f:
|
|
91
|
+
source = f.read()
|
|
92
|
+
|
|
93
|
+
parser = self.parsers[language]
|
|
94
|
+
tree = parser.parse(source)
|
|
95
|
+
|
|
96
|
+
# Extract nodes based on language
|
|
97
|
+
if language in {"javascript", "typescript"}:
|
|
98
|
+
nodes = self._extract_js_nodes(tree, file_path, source)
|
|
99
|
+
else:
|
|
100
|
+
nodes = self._extract_generic_nodes(tree, file_path, source, language)
|
|
101
|
+
|
|
102
|
+
except Exception as e:
|
|
103
|
+
self.logger.error(f"Error analyzing {file_path}: {e}")
|
|
104
|
+
if self.emitter:
|
|
105
|
+
self.emitter.emit_error(str(file_path), str(e))
|
|
106
|
+
|
|
107
|
+
return nodes
|
|
108
|
+
|
|
109
|
+
def _extract_js_nodes(self, tree, file_path: Path, source: bytes) -> List[CodeNode]:
|
|
110
|
+
"""Extract nodes from JavaScript/TypeScript files."""
|
|
111
|
+
nodes = []
|
|
112
|
+
|
|
113
|
+
def walk_tree(node, parent_name=None):
|
|
114
|
+
if node.type == "class_declaration":
|
|
115
|
+
# Extract class
|
|
116
|
+
name_node = node.child_by_field_name("name")
|
|
117
|
+
if name_node:
|
|
118
|
+
class_node = CodeNode(
|
|
119
|
+
file_path=str(file_path),
|
|
120
|
+
node_type="class",
|
|
121
|
+
name=source[name_node.start_byte : name_node.end_byte].decode(
|
|
122
|
+
"utf-8"
|
|
123
|
+
),
|
|
124
|
+
line_start=node.start_point[0] + 1,
|
|
125
|
+
line_end=node.end_point[0] + 1,
|
|
126
|
+
parent=parent_name,
|
|
127
|
+
language="javascript",
|
|
128
|
+
)
|
|
129
|
+
nodes.append(class_node)
|
|
130
|
+
|
|
131
|
+
if self.emitter:
|
|
132
|
+
self.emitter.emit_node(
|
|
133
|
+
CodeNodeEvent(
|
|
134
|
+
file_path=str(file_path),
|
|
135
|
+
node_type="class",
|
|
136
|
+
name=class_node.name,
|
|
137
|
+
line_start=class_node.line_start,
|
|
138
|
+
line_end=class_node.line_end,
|
|
139
|
+
parent=parent_name,
|
|
140
|
+
language="javascript",
|
|
141
|
+
)
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
elif node.type in (
|
|
145
|
+
"function_declaration",
|
|
146
|
+
"arrow_function",
|
|
147
|
+
"method_definition",
|
|
148
|
+
):
|
|
149
|
+
# Extract function
|
|
150
|
+
name_node = node.child_by_field_name("name")
|
|
151
|
+
if name_node:
|
|
152
|
+
func_name = source[
|
|
153
|
+
name_node.start_byte : name_node.end_byte
|
|
154
|
+
].decode("utf-8")
|
|
155
|
+
func_node = CodeNode(
|
|
156
|
+
file_path=str(file_path),
|
|
157
|
+
node_type=(
|
|
158
|
+
"function" if node.type != "method_definition" else "method"
|
|
159
|
+
),
|
|
160
|
+
name=func_name,
|
|
161
|
+
line_start=node.start_point[0] + 1,
|
|
162
|
+
line_end=node.end_point[0] + 1,
|
|
163
|
+
parent=parent_name,
|
|
164
|
+
language="javascript",
|
|
165
|
+
)
|
|
166
|
+
nodes.append(func_node)
|
|
167
|
+
|
|
168
|
+
if self.emitter:
|
|
169
|
+
self.emitter.emit_node(
|
|
170
|
+
CodeNodeEvent(
|
|
171
|
+
file_path=str(file_path),
|
|
172
|
+
node_type=func_node.node_type,
|
|
173
|
+
name=func_name,
|
|
174
|
+
line_start=func_node.line_start,
|
|
175
|
+
line_end=func_node.line_end,
|
|
176
|
+
parent=parent_name,
|
|
177
|
+
language="javascript",
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
# Recursively walk children
|
|
182
|
+
for child in node.children:
|
|
183
|
+
walk_tree(child, parent_name)
|
|
184
|
+
|
|
185
|
+
walk_tree(tree.root_node)
|
|
186
|
+
return nodes
|
|
187
|
+
|
|
188
|
+
def _extract_generic_nodes(
|
|
189
|
+
self, tree, file_path: Path, source: bytes, language: str
|
|
190
|
+
) -> List[CodeNode]:
|
|
191
|
+
"""Generic node extraction for other languages."""
|
|
192
|
+
# Simple generic extraction - can be enhanced per language
|
|
193
|
+
nodes = []
|
|
194
|
+
|
|
195
|
+
def walk_tree(node):
|
|
196
|
+
# Look for common patterns
|
|
197
|
+
if "class" in node.type or "struct" in node.type:
|
|
198
|
+
nodes.append(
|
|
199
|
+
CodeNode(
|
|
200
|
+
file_path=str(file_path),
|
|
201
|
+
node_type="class",
|
|
202
|
+
name=f"{node.type}_{node.start_point[0]}",
|
|
203
|
+
line_start=node.start_point[0] + 1,
|
|
204
|
+
line_end=node.end_point[0] + 1,
|
|
205
|
+
language=language,
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
elif "function" in node.type or "method" in node.type:
|
|
209
|
+
nodes.append(
|
|
210
|
+
CodeNode(
|
|
211
|
+
file_path=str(file_path),
|
|
212
|
+
node_type="function",
|
|
213
|
+
name=f"{node.type}_{node.start_point[0]}",
|
|
214
|
+
line_start=node.start_point[0] + 1,
|
|
215
|
+
line_end=node.end_point[0] + 1,
|
|
216
|
+
language=language,
|
|
217
|
+
)
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
for child in node.children:
|
|
221
|
+
walk_tree(child)
|
|
222
|
+
|
|
223
|
+
walk_tree(tree.root_node)
|
|
224
|
+
return nodes
|