claude-mpm 4.21.3__py3-none-any.whl → 5.1.9__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_PM.md +12 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
- 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/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +69 -1
- claude_mpm/agents/templates/circuit-breakers.md +1254 -0
- 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 +37 -2
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +1128 -36
- 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 +537 -239
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +935 -45
- 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/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +125 -167
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +757 -20
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +1032 -47
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +310 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +53 -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 +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +564 -108
- 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-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -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 +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +19 -35
- 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/file_loader.py +54 -101
- 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 +131 -10
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +110 -8
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +129 -1
- claude_mpm/core/unified_config.py +22 -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/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/claude_hooks/memory_integration.py +12 -1
- 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/agent_definition.py +7 -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/cache_git_manager.py +621 -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 +225 -18
- 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 +557 -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 +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -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 +200 -6
- claude_mpm/services/core/base.py +7 -2
- 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/mcp_services_check.py +7 -15
- 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/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_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- 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/mcp_service_verifier.py +6 -3
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- 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/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_management_service.py +16 -4
- 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/analysis.py +1 -1
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
- 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/circuit_breakers.md +0 -638
- 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/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.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/top_level.txt +0 -0
|
@@ -1,687 +0,0 @@
|
|
|
1
|
-
# Reconnaissance-Then-Action Pattern
|
|
2
|
-
|
|
3
|
-
Complete guide to the reconnaissance-before-action philosophy for webapp testing.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [The Philosophy](#the-philosophy)
|
|
8
|
-
- [Why Reconnaissance First](#why-reconnaissance-first)
|
|
9
|
-
- [The Reconnaissance Process](#the-reconnaissance-process)
|
|
10
|
-
- [Server Status Checks](#server-status-checks)
|
|
11
|
-
- [Network Diagnostics](#network-diagnostics)
|
|
12
|
-
- [DOM Inspection](#dom-inspection)
|
|
13
|
-
- [Log Analysis](#log-analysis)
|
|
14
|
-
- [Performance Reconnaissance](#performance-reconnaissance)
|
|
15
|
-
- [Security Reconnaissance](#security-reconnaissance)
|
|
16
|
-
- [Reconnaissance Checklist](#reconnaissance-checklist)
|
|
17
|
-
- [Common Failures](#common-failures)
|
|
18
|
-
|
|
19
|
-
## The Philosophy
|
|
20
|
-
|
|
21
|
-
**Reconnaissance-Then-Action** is the core principle of webapp testing:
|
|
22
|
-
|
|
23
|
-
1. **Observe** the current state before acting
|
|
24
|
-
2. **Understand** what you're working with
|
|
25
|
-
3. **Plan** your actions based on reconnaissance
|
|
26
|
-
4. **Execute** with confidence
|
|
27
|
-
5. **Verify** the results completely
|
|
28
|
-
|
|
29
|
-
**The Iron Law:**
|
|
30
|
-
> Never test a webapp without first verifying the server state and waiting for the page to be fully loaded.
|
|
31
|
-
|
|
32
|
-
**Why this matters:**
|
|
33
|
-
- Tests fail mysteriously when servers aren't ready
|
|
34
|
-
- Actions fail when pages haven't finished loading
|
|
35
|
-
- Selectors break when DOM is still being built
|
|
36
|
-
- Network requests fail when services aren't available
|
|
37
|
-
- Time is wasted debugging problems that don't exist
|
|
38
|
-
|
|
39
|
-
## Why Reconnaissance First
|
|
40
|
-
|
|
41
|
-
### The Cost of Skipping Reconnaissance
|
|
42
|
-
|
|
43
|
-
**Without reconnaissance:**
|
|
44
|
-
```python
|
|
45
|
-
# ❌ BAD: Jump straight to testing
|
|
46
|
-
page.goto('http://localhost:3000')
|
|
47
|
-
page.click('button.submit') # Fails - element not ready
|
|
48
|
-
# Error: Timeout 30000ms exceeded
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**With reconnaissance:**
|
|
52
|
-
```python
|
|
53
|
-
# ✅ GOOD: Check state first
|
|
54
|
-
page.goto('http://localhost:3000')
|
|
55
|
-
page.wait_for_load_state('networkidle') # Wait for page ready
|
|
56
|
-
page.screenshot(path='/tmp/before.png') # Verify what we see
|
|
57
|
-
page.click('button.submit') # Succeeds - page is ready
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Real-World Benefits
|
|
61
|
-
|
|
62
|
-
**Time saved:**
|
|
63
|
-
- 5 seconds of reconnaissance saves 30 minutes of debugging
|
|
64
|
-
- One screenshot reveals problems that take hours to diagnose
|
|
65
|
-
- Server check prevents entire test suite failures
|
|
66
|
-
|
|
67
|
-
**Confidence gained:**
|
|
68
|
-
- Know exactly what state the system is in
|
|
69
|
-
- Understand why tests pass or fail
|
|
70
|
-
- Debug issues 10x faster with visual evidence
|
|
71
|
-
|
|
72
|
-
**Reliability improved:**
|
|
73
|
-
- Tests pass consistently
|
|
74
|
-
- Fewer false negatives
|
|
75
|
-
- Clear failure messages when problems occur
|
|
76
|
-
|
|
77
|
-
## The Reconnaissance Process
|
|
78
|
-
|
|
79
|
-
### Step 1: Verify Server State
|
|
80
|
-
|
|
81
|
-
**Check if server is running:**
|
|
82
|
-
```bash
|
|
83
|
-
# Using lsof (most reliable)
|
|
84
|
-
lsof -i :3000 -sTCP:LISTEN
|
|
85
|
-
|
|
86
|
-
# Using curl (checks HTTP response)
|
|
87
|
-
curl -f http://localhost:3000/health
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**What to look for:**
|
|
91
|
-
- Is the port listening?
|
|
92
|
-
- Is the process alive?
|
|
93
|
-
- Does it respond to HTTP requests?
|
|
94
|
-
- What's the response time?
|
|
95
|
-
|
|
96
|
-
**Example output analysis:**
|
|
97
|
-
```bash
|
|
98
|
-
$ lsof -i :3000 -sTCP:LISTEN
|
|
99
|
-
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
|
|
100
|
-
node 12345 user 20u IPv4 0x1234 0t0 TCP *:3000 (LISTEN)
|
|
101
|
-
|
|
102
|
-
# Good signs:
|
|
103
|
-
# ✅ Process is running (PID 12345)
|
|
104
|
-
# ✅ Listening on correct port (3000)
|
|
105
|
-
# ✅ Protocol is TCP
|
|
106
|
-
# ✅ State is LISTEN
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### Step 2: Navigate and Wait
|
|
110
|
-
|
|
111
|
-
**Always wait for network idle on dynamic apps:**
|
|
112
|
-
```python
|
|
113
|
-
page.goto('http://localhost:3000')
|
|
114
|
-
page.wait_for_load_state('networkidle') # CRITICAL
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
**Why networkidle is essential:**
|
|
118
|
-
- JavaScript frameworks need time to initialize
|
|
119
|
-
- API calls must complete before DOM is ready
|
|
120
|
-
- Components may render multiple times
|
|
121
|
-
- Dynamic content loads asynchronously
|
|
122
|
-
|
|
123
|
-
**Wait hierarchy:**
|
|
124
|
-
1. `domcontentloaded` - HTML parsed (too early for most apps)
|
|
125
|
-
2. `load` - Resources loaded (images, CSS)
|
|
126
|
-
3. `networkidle` - Network requests finished (best for testing)
|
|
127
|
-
|
|
128
|
-
### Step 3: Visual Reconnaissance
|
|
129
|
-
|
|
130
|
-
**Take screenshots before acting:**
|
|
131
|
-
```python
|
|
132
|
-
# Full page screenshot
|
|
133
|
-
page.screenshot(path='/tmp/reconnaissance.png', full_page=True)
|
|
134
|
-
|
|
135
|
-
# Element-specific screenshot
|
|
136
|
-
page.locator('.modal').screenshot(path='/tmp/modal.png')
|
|
137
|
-
|
|
138
|
-
# Custom viewport
|
|
139
|
-
page.set_viewport_size({'width': 1920, 'height': 1080})
|
|
140
|
-
page.screenshot(path='/tmp/desktop.png')
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
**What screenshots reveal:**
|
|
144
|
-
- Is the page actually loaded?
|
|
145
|
-
- Are elements visible where expected?
|
|
146
|
-
- Is layout correct?
|
|
147
|
-
- Are there error messages?
|
|
148
|
-
- Is content what you expect?
|
|
149
|
-
|
|
150
|
-
### Step 4: DOM Inspection
|
|
151
|
-
|
|
152
|
-
**Discover what's actually on the page:**
|
|
153
|
-
```python
|
|
154
|
-
# Get full HTML
|
|
155
|
-
content = page.content()
|
|
156
|
-
print(content[:500]) # First 500 chars
|
|
157
|
-
|
|
158
|
-
# Find all buttons
|
|
159
|
-
buttons = page.locator('button').all()
|
|
160
|
-
print(f"Found {len(buttons)} buttons:")
|
|
161
|
-
for i, btn in enumerate(buttons):
|
|
162
|
-
text = btn.inner_text() if btn.is_visible() else "[hidden]"
|
|
163
|
-
print(f" [{i}] {text}")
|
|
164
|
-
|
|
165
|
-
# Find all links
|
|
166
|
-
links = page.locator('a[href]').all()
|
|
167
|
-
for link in links[:5]:
|
|
168
|
-
print(f" - {link.inner_text()} -> {link.get_attribute('href')}")
|
|
169
|
-
|
|
170
|
-
# Find all inputs
|
|
171
|
-
inputs = page.locator('input, textarea, select').all()
|
|
172
|
-
for inp in inputs:
|
|
173
|
-
name = inp.get_attribute('name') or inp.get_attribute('id') or "[unnamed]"
|
|
174
|
-
print(f" - {name}")
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**Example reconnaissance script:**
|
|
178
|
-
```python
|
|
179
|
-
from playwright.sync_api import sync_playwright
|
|
180
|
-
|
|
181
|
-
def reconnaissance(url):
|
|
182
|
-
with sync_playwright() as p:
|
|
183
|
-
browser = p.chromium.launch(headless=True)
|
|
184
|
-
page = browser.new_page()
|
|
185
|
-
|
|
186
|
-
# Navigate and wait
|
|
187
|
-
page.goto(url)
|
|
188
|
-
page.wait_for_load_state('networkidle')
|
|
189
|
-
|
|
190
|
-
# Visual reconnaissance
|
|
191
|
-
page.screenshot(path='/tmp/recon.png', full_page=True)
|
|
192
|
-
print("Screenshot saved: /tmp/recon.png")
|
|
193
|
-
|
|
194
|
-
# Element reconnaissance
|
|
195
|
-
print("\nButtons:")
|
|
196
|
-
for i, btn in enumerate(page.locator('button').all()):
|
|
197
|
-
print(f" [{i}] {btn.inner_text()}")
|
|
198
|
-
|
|
199
|
-
print("\nLinks:")
|
|
200
|
-
for link in page.locator('a[href]').all()[:10]:
|
|
201
|
-
print(f" - {link.inner_text()}")
|
|
202
|
-
|
|
203
|
-
print("\nInputs:")
|
|
204
|
-
for inp in page.locator('input').all():
|
|
205
|
-
name = inp.get_attribute('name') or '[unnamed]'
|
|
206
|
-
print(f" - {name}")
|
|
207
|
-
|
|
208
|
-
browser.close()
|
|
209
|
-
|
|
210
|
-
reconnaissance('http://localhost:3000')
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### Step 5: Console Log Reconnaissance
|
|
214
|
-
|
|
215
|
-
**Capture console output:**
|
|
216
|
-
```python
|
|
217
|
-
console_logs = []
|
|
218
|
-
|
|
219
|
-
def handle_console(msg):
|
|
220
|
-
console_logs.append(f"[{msg.type}] {msg.text}")
|
|
221
|
-
print(f"Console: [{msg.type}] {msg.text}")
|
|
222
|
-
|
|
223
|
-
page.on("console", handle_console)
|
|
224
|
-
page.goto('http://localhost:3000')
|
|
225
|
-
page.wait_for_load_state('networkidle')
|
|
226
|
-
|
|
227
|
-
# Save logs
|
|
228
|
-
with open('/tmp/console.log', 'w') as f:
|
|
229
|
-
f.write('\n'.join(console_logs))
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
**What console logs reveal:**
|
|
233
|
-
- JavaScript errors
|
|
234
|
-
- API failures
|
|
235
|
-
- Warning messages
|
|
236
|
-
- Debug output
|
|
237
|
-
- Performance timing
|
|
238
|
-
|
|
239
|
-
## Server Status Checks
|
|
240
|
-
|
|
241
|
-
### Using lsof (macOS/Linux)
|
|
242
|
-
|
|
243
|
-
**Basic check:**
|
|
244
|
-
```bash
|
|
245
|
-
lsof -i :3000
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
**Check if listening:**
|
|
249
|
-
```bash
|
|
250
|
-
lsof -i :3000 -sTCP:LISTEN
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
**Get just PID:**
|
|
254
|
-
```bash
|
|
255
|
-
lsof -t -i :3000
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
**Detailed output:**
|
|
259
|
-
```bash
|
|
260
|
-
lsof -i :3000 -P -n
|
|
261
|
-
# -P: Don't resolve port names
|
|
262
|
-
# -n: Don't resolve hostnames
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### Using ps (Process Status)
|
|
266
|
-
|
|
267
|
-
**Check if process is running:**
|
|
268
|
-
```bash
|
|
269
|
-
ps aux | grep node
|
|
270
|
-
ps aux | grep python
|
|
271
|
-
ps aux | grep "npm.*start"
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
**Check CPU and memory:**
|
|
275
|
-
```bash
|
|
276
|
-
ps aux | grep 12345 # PID from lsof
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Using curl (HTTP Check)
|
|
280
|
-
|
|
281
|
-
**Basic health check:**
|
|
282
|
-
```bash
|
|
283
|
-
curl http://localhost:3000
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
**Check specific endpoint:**
|
|
287
|
-
```bash
|
|
288
|
-
curl http://localhost:3000/health
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
**Check with timeout:**
|
|
292
|
-
```bash
|
|
293
|
-
curl --max-time 5 http://localhost:3000
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
**Check and show response time:**
|
|
297
|
-
```bash
|
|
298
|
-
curl -w "\nTime: %{time_total}s\n" http://localhost:3000
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
**Silent success check:**
|
|
302
|
-
```bash
|
|
303
|
-
if curl -f -s http://localhost:3000/health > /dev/null; then
|
|
304
|
-
echo "Server is healthy"
|
|
305
|
-
else
|
|
306
|
-
echo "Server is not responding"
|
|
307
|
-
fi
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### Using netstat
|
|
311
|
-
|
|
312
|
-
**Check listening ports:**
|
|
313
|
-
```bash
|
|
314
|
-
netstat -an | grep LISTEN | grep 3000
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
**Show all TCP connections:**
|
|
318
|
-
```bash
|
|
319
|
-
netstat -an | grep tcp
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
## Network Diagnostics
|
|
323
|
-
|
|
324
|
-
### Using curl for Diagnostics
|
|
325
|
-
|
|
326
|
-
**Verbose output:**
|
|
327
|
-
```bash
|
|
328
|
-
curl -v http://localhost:3000
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
**Show response headers:**
|
|
332
|
-
```bash
|
|
333
|
-
curl -I http://localhost:3000
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
**Follow redirects:**
|
|
337
|
-
```bash
|
|
338
|
-
curl -L http://localhost:3000
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
**Save response:**
|
|
342
|
-
```bash
|
|
343
|
-
curl -o response.html http://localhost:3000
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
**Test POST request:**
|
|
347
|
-
```bash
|
|
348
|
-
curl -X POST -H "Content-Type: application/json" \
|
|
349
|
-
-d '{"test":"data"}' \
|
|
350
|
-
http://localhost:3000/api/endpoint
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
### Network Timing
|
|
354
|
-
|
|
355
|
-
**Measure response time:**
|
|
356
|
-
```bash
|
|
357
|
-
curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
**curl-format.txt:**
|
|
361
|
-
```
|
|
362
|
-
time_namelookup: %{time_namelookup}s\n
|
|
363
|
-
time_connect: %{time_connect}s\n
|
|
364
|
-
time_appconnect: %{time_appconnect}s\n
|
|
365
|
-
time_pretransfer: %{time_pretransfer}s\n
|
|
366
|
-
time_redirect: %{time_redirect}s\n
|
|
367
|
-
time_starttransfer: %{time_starttransfer}s\n
|
|
368
|
-
----------\n
|
|
369
|
-
time_total: %{time_total}s\n
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
### Using tcpdump (Advanced)
|
|
373
|
-
|
|
374
|
-
**Capture HTTP traffic:**
|
|
375
|
-
```bash
|
|
376
|
-
sudo tcpdump -i lo0 -A -s 0 'tcp port 3000'
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
**Save to file:**
|
|
380
|
-
```bash
|
|
381
|
-
sudo tcpdump -i lo0 -w capture.pcap 'tcp port 3000'
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
## DOM Inspection
|
|
385
|
-
|
|
386
|
-
### Element Discovery Pattern
|
|
387
|
-
|
|
388
|
-
**Find interactive elements:**
|
|
389
|
-
```python
|
|
390
|
-
# Buttons
|
|
391
|
-
buttons = page.locator('button, input[type="button"], input[type="submit"]').all()
|
|
392
|
-
|
|
393
|
-
# Links
|
|
394
|
-
links = page.locator('a[href]').all()
|
|
395
|
-
|
|
396
|
-
# Form inputs
|
|
397
|
-
inputs = page.locator('input, textarea, select').all()
|
|
398
|
-
|
|
399
|
-
# Clickable elements
|
|
400
|
-
clickable = page.locator('[onclick], [role="button"]').all()
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
### Check Element State
|
|
404
|
-
|
|
405
|
-
**Visibility:**
|
|
406
|
-
```python
|
|
407
|
-
element = page.locator('button.submit')
|
|
408
|
-
print(f"Visible: {element.is_visible()}")
|
|
409
|
-
print(f"Enabled: {element.is_enabled()}")
|
|
410
|
-
print(f"Editable: {element.is_editable()}")
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
**Attributes:**
|
|
414
|
-
```python
|
|
415
|
-
print(f"Text: {element.inner_text()}")
|
|
416
|
-
print(f"HTML: {element.inner_html()}")
|
|
417
|
-
print(f"Class: {element.get_attribute('class')}")
|
|
418
|
-
print(f"ID: {element.get_attribute('id')}")
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
### Find Selectors
|
|
422
|
-
|
|
423
|
-
**Test different selector strategies:**
|
|
424
|
-
```python
|
|
425
|
-
# Try text selector
|
|
426
|
-
try:
|
|
427
|
-
page.locator('text=Submit').is_visible()
|
|
428
|
-
print("✅ Text selector works: 'text=Submit'")
|
|
429
|
-
except:
|
|
430
|
-
print("❌ Text selector failed")
|
|
431
|
-
|
|
432
|
-
# Try role selector
|
|
433
|
-
try:
|
|
434
|
-
page.locator('role=button[name="Submit"]').is_visible()
|
|
435
|
-
print("✅ Role selector works: 'role=button[name=\"Submit\"]'")
|
|
436
|
-
except:
|
|
437
|
-
print("❌ Role selector failed")
|
|
438
|
-
|
|
439
|
-
# Try CSS selector
|
|
440
|
-
try:
|
|
441
|
-
page.locator('button.submit').is_visible()
|
|
442
|
-
print("✅ CSS selector works: 'button.submit'")
|
|
443
|
-
except:
|
|
444
|
-
print("❌ CSS selector failed")
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
## Log Analysis
|
|
448
|
-
|
|
449
|
-
### Server Logs
|
|
450
|
-
|
|
451
|
-
**Node.js console output:**
|
|
452
|
-
```bash
|
|
453
|
-
npm start > server.log 2>&1 &
|
|
454
|
-
tail -f server.log
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
**Look for:**
|
|
458
|
-
- Startup messages
|
|
459
|
-
- Port binding confirmation
|
|
460
|
-
- Error messages
|
|
461
|
-
- Warning messages
|
|
462
|
-
- Request logs
|
|
463
|
-
|
|
464
|
-
### Application Logs
|
|
465
|
-
|
|
466
|
-
**Grep for errors:**
|
|
467
|
-
```bash
|
|
468
|
-
grep -i error server.log
|
|
469
|
-
grep -i warning server.log
|
|
470
|
-
grep -i exception server.log
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
**Filter by timestamp:**
|
|
474
|
-
```bash
|
|
475
|
-
grep "2024-01-15 14:" server.log
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
**Count errors:**
|
|
479
|
-
```bash
|
|
480
|
-
grep -c "ERROR" server.log
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
## Performance Reconnaissance
|
|
484
|
-
|
|
485
|
-
### Response Time Checks
|
|
486
|
-
|
|
487
|
-
**Measure with curl:**
|
|
488
|
-
```bash
|
|
489
|
-
curl -w "Time: %{time_total}s\n" -o /dev/null -s http://localhost:3000
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
**Measure with Playwright:**
|
|
493
|
-
```python
|
|
494
|
-
import time
|
|
495
|
-
|
|
496
|
-
start = time.time()
|
|
497
|
-
page.goto('http://localhost:3000')
|
|
498
|
-
page.wait_for_load_state('networkidle')
|
|
499
|
-
elapsed = time.time() - start
|
|
500
|
-
|
|
501
|
-
print(f"Page load time: {elapsed:.2f}s")
|
|
502
|
-
```
|
|
503
|
-
|
|
504
|
-
### Resource Usage
|
|
505
|
-
|
|
506
|
-
**Check CPU and memory:**
|
|
507
|
-
```bash
|
|
508
|
-
pid=$(lsof -t -i :3000)
|
|
509
|
-
ps -p $pid -o %cpu,%mem,rss,vsz
|
|
510
|
-
```
|
|
511
|
-
|
|
512
|
-
**Monitor continuously:**
|
|
513
|
-
```bash
|
|
514
|
-
watch -n 1 'ps -p $(lsof -t -i :3000) -o %cpu,%mem,rss'
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
## Security Reconnaissance
|
|
518
|
-
|
|
519
|
-
### Port Scanning
|
|
520
|
-
|
|
521
|
-
**Check open ports:**
|
|
522
|
-
```bash
|
|
523
|
-
nmap localhost
|
|
524
|
-
```
|
|
525
|
-
|
|
526
|
-
**Specific port:**
|
|
527
|
-
```bash
|
|
528
|
-
nmap -p 3000 localhost
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
### SSL/TLS Check
|
|
532
|
-
|
|
533
|
-
**Test HTTPS:**
|
|
534
|
-
```bash
|
|
535
|
-
curl -k https://localhost:3000
|
|
536
|
-
```
|
|
537
|
-
|
|
538
|
-
**Check certificate:**
|
|
539
|
-
```bash
|
|
540
|
-
openssl s_client -connect localhost:3000
|
|
541
|
-
```
|
|
542
|
-
|
|
543
|
-
### Header Analysis
|
|
544
|
-
|
|
545
|
-
**Check security headers:**
|
|
546
|
-
```bash
|
|
547
|
-
curl -I http://localhost:3000 | grep -i "security\|cors\|content-security"
|
|
548
|
-
```
|
|
549
|
-
|
|
550
|
-
## Reconnaissance Checklist
|
|
551
|
-
|
|
552
|
-
### Pre-Test Checklist
|
|
553
|
-
|
|
554
|
-
- [ ] Server is running (lsof check)
|
|
555
|
-
- [ ] Port is accessible (curl check)
|
|
556
|
-
- [ ] Server responds to health check
|
|
557
|
-
- [ ] Response time is reasonable (< 2s)
|
|
558
|
-
- [ ] No errors in server logs
|
|
559
|
-
- [ ] Environment variables are set
|
|
560
|
-
- [ ] Dependencies are installed
|
|
561
|
-
|
|
562
|
-
### During-Test Checklist
|
|
563
|
-
|
|
564
|
-
- [ ] Page navigation successful
|
|
565
|
-
- [ ] Waited for networkidle
|
|
566
|
-
- [ ] Screenshot captured
|
|
567
|
-
- [ ] Console logs captured
|
|
568
|
-
- [ ] Expected elements are visible
|
|
569
|
-
- [ ] No JavaScript errors
|
|
570
|
-
- [ ] Form fields are editable
|
|
571
|
-
- [ ] Buttons are clickable
|
|
572
|
-
|
|
573
|
-
### Post-Action Checklist
|
|
574
|
-
|
|
575
|
-
- [ ] Action completed without errors
|
|
576
|
-
- [ ] Expected state change occurred
|
|
577
|
-
- [ ] No new console errors
|
|
578
|
-
- [ ] Screenshot shows expected result
|
|
579
|
-
- [ ] Server still responding
|
|
580
|
-
- [ ] No memory leaks (check server resources)
|
|
581
|
-
|
|
582
|
-
## Common Failures
|
|
583
|
-
|
|
584
|
-
### Failure: Server Not Running
|
|
585
|
-
|
|
586
|
-
**Symptoms:**
|
|
587
|
-
- Connection refused errors
|
|
588
|
-
- Timeout errors
|
|
589
|
-
- lsof returns no results
|
|
590
|
-
|
|
591
|
-
**Reconnaissance steps:**
|
|
592
|
-
```bash
|
|
593
|
-
# Check if server is running
|
|
594
|
-
lsof -i :3000
|
|
595
|
-
|
|
596
|
-
# Check if process exists
|
|
597
|
-
ps aux | grep node
|
|
598
|
-
|
|
599
|
-
# Check server logs
|
|
600
|
-
cat server.log | tail -20
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
**Solution:**
|
|
604
|
-
- Start server manually
|
|
605
|
-
- Use with_server.py script
|
|
606
|
-
- Check for port conflicts
|
|
607
|
-
- Review startup errors
|
|
608
|
-
|
|
609
|
-
### Failure: Page Not Fully Loaded
|
|
610
|
-
|
|
611
|
-
**Symptoms:**
|
|
612
|
-
- Element not found errors
|
|
613
|
-
- Stale element errors
|
|
614
|
-
- Timeout waiting for selector
|
|
615
|
-
|
|
616
|
-
**Reconnaissance steps:**
|
|
617
|
-
```python
|
|
618
|
-
# Take screenshot to see what's actually loaded
|
|
619
|
-
page.screenshot(path='/tmp/debug.png', full_page=True)
|
|
620
|
-
|
|
621
|
-
# Check network state
|
|
622
|
-
page.wait_for_load_state('networkidle')
|
|
623
|
-
|
|
624
|
-
# Check for loading indicators
|
|
625
|
-
loading = page.locator('.loading, .spinner').is_visible()
|
|
626
|
-
print(f"Still loading: {loading}")
|
|
627
|
-
```
|
|
628
|
-
|
|
629
|
-
**Solution:**
|
|
630
|
-
- Always wait for networkidle
|
|
631
|
-
- Wait for specific elements
|
|
632
|
-
- Check for loading indicators
|
|
633
|
-
- Increase timeouts if needed
|
|
634
|
-
|
|
635
|
-
### Failure: Wrong Element Selected
|
|
636
|
-
|
|
637
|
-
**Symptoms:**
|
|
638
|
-
- Action has no effect
|
|
639
|
-
- Wrong element is clicked
|
|
640
|
-
- Unexpected behavior
|
|
641
|
-
|
|
642
|
-
**Reconnaissance steps:**
|
|
643
|
-
```python
|
|
644
|
-
# Find all matching elements
|
|
645
|
-
elements = page.locator('button').all()
|
|
646
|
-
print(f"Found {len(elements)} buttons")
|
|
647
|
-
for i, el in enumerate(elements):
|
|
648
|
-
print(f"[{i}] {el.inner_text()}")
|
|
649
|
-
|
|
650
|
-
# Highlight element before clicking
|
|
651
|
-
page.locator('button.submit').evaluate('el => el.style.border = "3px solid red"')
|
|
652
|
-
page.screenshot(path='/tmp/highlighted.png')
|
|
653
|
-
```
|
|
654
|
-
|
|
655
|
-
**Solution:**
|
|
656
|
-
- Use more specific selectors
|
|
657
|
-
- Use data-testid attributes
|
|
658
|
-
- Verify element before clicking
|
|
659
|
-
- Check element count
|
|
660
|
-
|
|
661
|
-
### Failure: Network Request Failed
|
|
662
|
-
|
|
663
|
-
**Symptoms:**
|
|
664
|
-
- API errors in console
|
|
665
|
-
- Empty data
|
|
666
|
-
- Timeout errors
|
|
667
|
-
|
|
668
|
-
**Reconnaissance steps:**
|
|
669
|
-
```python
|
|
670
|
-
# Monitor network requests
|
|
671
|
-
def handle_response(response):
|
|
672
|
-
print(f"Response: {response.url} - {response.status}")
|
|
673
|
-
|
|
674
|
-
page.on("response", handle_response)
|
|
675
|
-
|
|
676
|
-
# Wait for specific API call
|
|
677
|
-
with page.expect_response('**/api/data') as response_info:
|
|
678
|
-
page.click('button.load')
|
|
679
|
-
response = response_info.value
|
|
680
|
-
print(f"Status: {response.status}")
|
|
681
|
-
```
|
|
682
|
-
|
|
683
|
-
**Solution:**
|
|
684
|
-
- Check API server is running
|
|
685
|
-
- Verify CORS configuration
|
|
686
|
-
- Check network timeouts
|
|
687
|
-
- Mock API responses if needed
|