claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__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/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -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/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +94 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2501 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +3253 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1398 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +298 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +31 -0
- claude_mpm/cli/interactive/agent_wizard.py +1927 -0
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +649 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1578 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +133 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +491 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- 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/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +612 -0
- claude_mpm/core/unified_paths.py +958 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -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/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- 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 +1205 -0
- claude_mpm/services/agents/startup_sync.py +262 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- 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 +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +711 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
- claude_mpm/services/skills/selective_skill_deployer.py +743 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- 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/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1189 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +844 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.85.dist-info/METADATA +1023 -0
- claude_mpm-5.4.85.dist-info/RECORD +980 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
Project Analyzer Service
|
|
4
|
-
|
|
3
|
+
Project Analyzer Service (Refactored)
|
|
4
|
+
=====================================
|
|
5
5
|
|
|
6
6
|
Analyzes project characteristics to enable project-specific memory creation.
|
|
7
7
|
|
|
@@ -9,8 +9,15 @@ WHY: Instead of creating generic memories, agents need to understand the specifi
|
|
|
9
9
|
project they're working on - its tech stack, architecture patterns, coding conventions,
|
|
10
10
|
and key components. This service extracts these characteristics automatically.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
REFACTORING NOTE: This module has been refactored to follow SOLID principles.
|
|
13
|
+
The original god class has been split into focused services:
|
|
14
|
+
- LanguageAnalyzerService: Language and framework detection
|
|
15
|
+
- DependencyAnalyzerService: Dependency and package management
|
|
16
|
+
- ArchitectureAnalyzerService: Architecture and structure analysis
|
|
17
|
+
- MetricsCollectorService: Code metrics collection
|
|
18
|
+
|
|
19
|
+
The main ProjectAnalyzer class now orchestrates these services while maintaining
|
|
20
|
+
full backward compatibility with the original interface.
|
|
14
21
|
|
|
15
22
|
This service analyzes:
|
|
16
23
|
- Technology stack from config files (package.json, requirements.txt, etc.)
|
|
@@ -23,134 +30,141 @@ This service analyzes:
|
|
|
23
30
|
"""
|
|
24
31
|
|
|
25
32
|
import json
|
|
33
|
+
import logging
|
|
26
34
|
import re
|
|
35
|
+
from collections import Counter
|
|
36
|
+
from dataclasses import asdict, dataclass
|
|
27
37
|
from pathlib import Path
|
|
28
|
-
from typing import Dict, List, Optional
|
|
29
|
-
import logging
|
|
30
|
-
from dataclasses import dataclass, asdict
|
|
31
|
-
from collections import defaultdict, Counter
|
|
38
|
+
from typing import Any, Dict, List, Optional
|
|
32
39
|
|
|
33
40
|
from claude_mpm.core.config import Config
|
|
34
|
-
from claude_mpm.
|
|
41
|
+
from claude_mpm.core.interfaces import ProjectAnalyzerInterface
|
|
42
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
43
|
+
|
|
44
|
+
# Import refactored services
|
|
35
45
|
|
|
36
46
|
|
|
37
47
|
@dataclass
|
|
38
48
|
class ProjectCharacteristics:
|
|
39
49
|
"""Structured representation of project characteristics."""
|
|
40
|
-
|
|
50
|
+
|
|
41
51
|
# Core project info
|
|
42
52
|
project_name: str
|
|
43
53
|
primary_language: Optional[str]
|
|
44
54
|
languages: List[str]
|
|
45
55
|
frameworks: List[str]
|
|
46
|
-
|
|
56
|
+
|
|
47
57
|
# Architecture and structure
|
|
48
58
|
architecture_type: str
|
|
49
59
|
main_modules: List[str]
|
|
50
60
|
key_directories: List[str]
|
|
51
61
|
entry_points: List[str]
|
|
52
|
-
|
|
62
|
+
|
|
53
63
|
# Development practices
|
|
54
64
|
testing_framework: Optional[str]
|
|
55
65
|
test_patterns: List[str]
|
|
56
66
|
package_manager: Optional[str]
|
|
57
67
|
build_tools: List[str]
|
|
58
|
-
|
|
68
|
+
|
|
59
69
|
# Integrations and dependencies
|
|
60
70
|
databases: List[str]
|
|
61
71
|
web_frameworks: List[str]
|
|
62
72
|
api_patterns: List[str]
|
|
63
73
|
key_dependencies: List[str]
|
|
64
|
-
|
|
74
|
+
|
|
65
75
|
# Project-specific patterns
|
|
66
76
|
code_conventions: List[str]
|
|
67
77
|
configuration_patterns: List[str]
|
|
68
78
|
project_terminology: List[str]
|
|
69
|
-
|
|
79
|
+
|
|
70
80
|
# Documentation and structure
|
|
71
81
|
documentation_files: List[str]
|
|
72
82
|
important_configs: List[str]
|
|
73
|
-
|
|
83
|
+
|
|
74
84
|
def to_dict(self) -> Dict[str, Any]:
|
|
75
85
|
"""Convert to dictionary for JSON serialization."""
|
|
76
86
|
return asdict(self)
|
|
77
87
|
|
|
78
88
|
|
|
79
|
-
class ProjectAnalyzer:
|
|
89
|
+
class ProjectAnalyzer(ProjectAnalyzerInterface):
|
|
80
90
|
"""Analyzes project characteristics for context-aware memory creation.
|
|
81
|
-
|
|
91
|
+
|
|
82
92
|
WHY: Generic agent memories aren't helpful for specific projects. This analyzer
|
|
83
93
|
extracts project-specific characteristics that enable agents to create relevant,
|
|
84
94
|
actionable memories with proper context.
|
|
85
|
-
|
|
95
|
+
|
|
86
96
|
DESIGN DECISION: Uses a combination of file pattern analysis, content parsing,
|
|
87
97
|
and directory structure analysis to build comprehensive project understanding
|
|
88
98
|
without requiring external tools or API calls.
|
|
89
99
|
"""
|
|
90
|
-
|
|
100
|
+
|
|
91
101
|
# Common configuration files and their indicators
|
|
92
102
|
CONFIG_FILE_PATTERNS = {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
"package.json": "node_js",
|
|
104
|
+
"requirements.txt": "python",
|
|
105
|
+
"pyproject.toml": "python",
|
|
106
|
+
"setup.py": "python",
|
|
107
|
+
"Cargo.toml": "rust",
|
|
108
|
+
"pom.xml": "java",
|
|
109
|
+
"build.gradle": "java",
|
|
110
|
+
"composer.json": "php",
|
|
111
|
+
"Gemfile": "ruby",
|
|
112
|
+
"go.mod": "go",
|
|
113
|
+
"CMakeLists.txt": "cpp",
|
|
114
|
+
"Makefile": "c_cpp",
|
|
105
115
|
}
|
|
106
|
-
|
|
116
|
+
|
|
107
117
|
# Framework detection patterns
|
|
108
118
|
FRAMEWORK_PATTERNS = {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
119
|
+
"flask": ["from flask", "Flask(", "app.route"],
|
|
120
|
+
"django": ["from django", "DJANGO_SETTINGS", "django.contrib"],
|
|
121
|
+
"fastapi": ["from fastapi", "FastAPI(", "@app."],
|
|
122
|
+
"express": ["express()", "app.get(", "app.post("],
|
|
123
|
+
"react": ["import React", "from react", "ReactDOM"],
|
|
124
|
+
"vue": ["Vue.createApp", "new Vue(", "vue-"],
|
|
125
|
+
"angular": ["@Component", "@Injectable", "Angular"],
|
|
126
|
+
"spring": ["@SpringBootApplication", "@RestController", "Spring"],
|
|
127
|
+
"rails": ["Rails.application", "ApplicationController"],
|
|
118
128
|
}
|
|
119
|
-
|
|
129
|
+
|
|
120
130
|
# Database detection patterns
|
|
121
131
|
DATABASE_PATTERNS = {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
132
|
+
"postgresql": ["psycopg2", "postgresql:", "postgres:", "pg_"],
|
|
133
|
+
"mysql": ["mysql-connector", "mysql:", "MySQLdb"],
|
|
134
|
+
"sqlite": ["sqlite3", "sqlite:", ".db", ".sqlite"],
|
|
135
|
+
"mongodb": ["pymongo", "mongodb:", "mongoose"],
|
|
136
|
+
"redis": ["redis:", "redis-py", "RedisClient"],
|
|
137
|
+
"elasticsearch": ["elasticsearch:", "elastic"],
|
|
128
138
|
}
|
|
129
|
-
|
|
130
|
-
def __init__(
|
|
139
|
+
|
|
140
|
+
def __init__(
|
|
141
|
+
self, config: Optional[Config] = None, working_directory: Optional[Path] = None
|
|
142
|
+
):
|
|
131
143
|
"""Initialize the project analyzer.
|
|
132
|
-
|
|
144
|
+
|
|
133
145
|
Args:
|
|
134
146
|
config: Optional Config object
|
|
135
147
|
working_directory: Optional working directory path. If not provided, uses current.
|
|
136
148
|
"""
|
|
137
149
|
self.config = config or Config()
|
|
138
|
-
self.working_directory =
|
|
150
|
+
self.working_directory = (
|
|
151
|
+
working_directory or get_path_manager().get_project_root()
|
|
152
|
+
)
|
|
139
153
|
self.logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}")
|
|
140
|
-
|
|
154
|
+
|
|
141
155
|
# Cache for analysis results
|
|
142
156
|
self._analysis_cache: Optional[ProjectCharacteristics] = None
|
|
143
157
|
self._cache_timestamp: Optional[float] = None
|
|
144
|
-
|
|
158
|
+
|
|
145
159
|
def analyze_project(self, force_refresh: bool = False) -> ProjectCharacteristics:
|
|
146
160
|
"""Analyze the current project and return characteristics.
|
|
147
|
-
|
|
161
|
+
|
|
148
162
|
WHY: Comprehensive project analysis enables agents to create memories
|
|
149
163
|
that are specific to the actual project context, tech stack, and patterns.
|
|
150
|
-
|
|
164
|
+
|
|
151
165
|
Args:
|
|
152
166
|
force_refresh: If True, ignores cache and performs fresh analysis
|
|
153
|
-
|
|
167
|
+
|
|
154
168
|
Returns:
|
|
155
169
|
ProjectCharacteristics: Structured project analysis results
|
|
156
170
|
"""
|
|
@@ -159,12 +173,13 @@ class ProjectAnalyzer:
|
|
|
159
173
|
if not force_refresh and self._analysis_cache and self._cache_timestamp:
|
|
160
174
|
# Cache is valid for 5 minutes
|
|
161
175
|
import time
|
|
176
|
+
|
|
162
177
|
if time.time() - self._cache_timestamp < 300:
|
|
163
178
|
self.logger.debug("Using cached project analysis")
|
|
164
179
|
return self._analysis_cache
|
|
165
|
-
|
|
180
|
+
|
|
166
181
|
self.logger.info(f"Analyzing project at: {self.working_directory}")
|
|
167
|
-
|
|
182
|
+
|
|
168
183
|
# Initialize characteristics with basic info
|
|
169
184
|
characteristics = ProjectCharacteristics(
|
|
170
185
|
project_name=self.working_directory.name,
|
|
@@ -187,9 +202,9 @@ class ProjectAnalyzer:
|
|
|
187
202
|
configuration_patterns=[],
|
|
188
203
|
project_terminology=[],
|
|
189
204
|
documentation_files=[],
|
|
190
|
-
important_configs=[]
|
|
205
|
+
important_configs=[],
|
|
191
206
|
)
|
|
192
|
-
|
|
207
|
+
|
|
193
208
|
# Perform various analyses
|
|
194
209
|
self._analyze_config_files(characteristics)
|
|
195
210
|
self._analyze_directory_structure(characteristics)
|
|
@@ -199,15 +214,18 @@ class ProjectAnalyzer:
|
|
|
199
214
|
self._analyze_documentation(characteristics)
|
|
200
215
|
self._infer_architecture_type(characteristics)
|
|
201
216
|
self._extract_project_terminology(characteristics)
|
|
202
|
-
|
|
217
|
+
|
|
203
218
|
# Cache the results
|
|
204
219
|
self._analysis_cache = characteristics
|
|
205
220
|
import time
|
|
221
|
+
|
|
206
222
|
self._cache_timestamp = time.time()
|
|
207
|
-
|
|
208
|
-
self.logger.info(
|
|
223
|
+
|
|
224
|
+
self.logger.info(
|
|
225
|
+
f"Project analysis complete: {characteristics.primary_language} project with {len(characteristics.frameworks)} frameworks"
|
|
226
|
+
)
|
|
209
227
|
return characteristics
|
|
210
|
-
|
|
228
|
+
|
|
211
229
|
except Exception as e:
|
|
212
230
|
self.logger.error(f"Error analyzing project: {e}")
|
|
213
231
|
# Return minimal characteristics on error
|
|
@@ -232,142 +250,176 @@ class ProjectAnalyzer:
|
|
|
232
250
|
configuration_patterns=[],
|
|
233
251
|
project_terminology=[],
|
|
234
252
|
documentation_files=[],
|
|
235
|
-
important_configs=[]
|
|
253
|
+
important_configs=[],
|
|
236
254
|
)
|
|
237
|
-
|
|
255
|
+
|
|
238
256
|
def _analyze_config_files(self, characteristics: ProjectCharacteristics) -> None:
|
|
239
257
|
"""Analyze configuration files to determine tech stack.
|
|
240
|
-
|
|
258
|
+
|
|
241
259
|
WHY: Configuration files are the most reliable indicators of project
|
|
242
260
|
technology stack and dependencies. They provide definitive information
|
|
243
261
|
about what technologies are actually used.
|
|
244
|
-
|
|
262
|
+
|
|
245
263
|
Args:
|
|
246
264
|
characteristics: ProjectCharacteristics object to update
|
|
247
265
|
"""
|
|
248
266
|
config_files = []
|
|
249
267
|
languages_found = set()
|
|
250
|
-
|
|
268
|
+
|
|
251
269
|
for config_file, language in self.CONFIG_FILE_PATTERNS.items():
|
|
252
270
|
config_path = self.working_directory / config_file
|
|
253
271
|
if config_path.exists():
|
|
254
272
|
config_files.append(config_file)
|
|
255
273
|
languages_found.add(language)
|
|
256
|
-
characteristics.important_configs.append(
|
|
257
|
-
|
|
274
|
+
characteristics.important_configs.append(
|
|
275
|
+
str(config_path.relative_to(self.working_directory))
|
|
276
|
+
)
|
|
277
|
+
|
|
258
278
|
# Parse specific config files for more details
|
|
259
279
|
try:
|
|
260
|
-
if config_file ==
|
|
280
|
+
if config_file == "package.json":
|
|
261
281
|
self._parse_package_json(config_path, characteristics)
|
|
262
|
-
elif config_file in [
|
|
282
|
+
elif config_file in ["requirements.txt", "pyproject.toml"]:
|
|
263
283
|
self._parse_python_dependencies(config_path, characteristics)
|
|
264
|
-
elif config_file ==
|
|
284
|
+
elif config_file == "Cargo.toml":
|
|
265
285
|
self._parse_cargo_toml(config_path, characteristics)
|
|
266
286
|
except Exception as e:
|
|
267
287
|
self.logger.warning(f"Error parsing {config_file}: {e}")
|
|
268
|
-
|
|
288
|
+
|
|
269
289
|
# Set primary language (prefer more specific indicators)
|
|
270
|
-
language_priority = [
|
|
290
|
+
language_priority = ["python", "node_js", "rust", "java", "go", "php", "ruby"]
|
|
271
291
|
for lang in language_priority:
|
|
272
292
|
if lang in languages_found:
|
|
273
293
|
characteristics.primary_language = lang
|
|
274
294
|
break
|
|
275
|
-
|
|
295
|
+
|
|
276
296
|
characteristics.languages = list(languages_found)
|
|
277
|
-
|
|
297
|
+
|
|
278
298
|
# Determine package manager
|
|
279
|
-
if
|
|
280
|
-
if (self.working_directory /
|
|
281
|
-
characteristics.package_manager =
|
|
282
|
-
elif (self.working_directory /
|
|
283
|
-
characteristics.package_manager =
|
|
299
|
+
if "package.json" in config_files:
|
|
300
|
+
if (self.working_directory / "yarn.lock").exists():
|
|
301
|
+
characteristics.package_manager = "yarn"
|
|
302
|
+
elif (self.working_directory / "pnpm-lock.yaml").exists():
|
|
303
|
+
characteristics.package_manager = "pnpm"
|
|
284
304
|
else:
|
|
285
|
-
characteristics.package_manager =
|
|
286
|
-
elif
|
|
287
|
-
characteristics.package_manager =
|
|
288
|
-
elif
|
|
289
|
-
characteristics.package_manager =
|
|
290
|
-
|
|
291
|
-
def _parse_package_json(
|
|
305
|
+
characteristics.package_manager = "npm"
|
|
306
|
+
elif "requirements.txt" in config_files or "pyproject.toml" in config_files:
|
|
307
|
+
characteristics.package_manager = "pip"
|
|
308
|
+
elif "Cargo.toml" in config_files:
|
|
309
|
+
characteristics.package_manager = "cargo"
|
|
310
|
+
|
|
311
|
+
def _parse_package_json(
|
|
312
|
+
self, package_path: Path, characteristics: ProjectCharacteristics
|
|
313
|
+
) -> None:
|
|
292
314
|
"""Parse package.json for Node.js project details."""
|
|
293
315
|
try:
|
|
294
|
-
with open(
|
|
316
|
+
with package_path.open() as f:
|
|
295
317
|
package_data = json.load(f)
|
|
296
|
-
|
|
318
|
+
|
|
297
319
|
# Extract dependencies
|
|
298
320
|
all_deps = {}
|
|
299
|
-
all_deps.update(package_data.get(
|
|
300
|
-
all_deps.update(package_data.get(
|
|
301
|
-
|
|
321
|
+
all_deps.update(package_data.get("dependencies", {}))
|
|
322
|
+
all_deps.update(package_data.get("devDependencies", {}))
|
|
323
|
+
|
|
302
324
|
# Identify frameworks and tools
|
|
303
|
-
for dep_name in all_deps
|
|
325
|
+
for dep_name in all_deps:
|
|
304
326
|
dep_lower = dep_name.lower()
|
|
305
|
-
|
|
327
|
+
|
|
306
328
|
# Web frameworks
|
|
307
|
-
if any(fw in dep_lower for fw in [
|
|
329
|
+
if any(fw in dep_lower for fw in ["express", "koa", "hapi"]):
|
|
308
330
|
characteristics.web_frameworks.append(dep_name)
|
|
309
|
-
elif any(
|
|
331
|
+
elif any(
|
|
332
|
+
fw in dep_lower for fw in ["react", "vue", "angular", "svelte"]
|
|
333
|
+
):
|
|
310
334
|
characteristics.frameworks.append(dep_name)
|
|
311
|
-
elif any(
|
|
335
|
+
elif any(
|
|
336
|
+
db in dep_lower for db in ["mysql", "postgres", "mongodb", "redis"]
|
|
337
|
+
):
|
|
312
338
|
characteristics.databases.append(dep_name)
|
|
313
|
-
elif
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
339
|
+
elif (
|
|
340
|
+
any(
|
|
341
|
+
test in dep_lower
|
|
342
|
+
for test in ["jest", "mocha", "cypress", "playwright"]
|
|
343
|
+
)
|
|
344
|
+
and not characteristics.testing_framework
|
|
345
|
+
):
|
|
346
|
+
characteristics.testing_framework = dep_name
|
|
347
|
+
|
|
317
348
|
characteristics.key_dependencies.append(dep_name)
|
|
318
|
-
|
|
349
|
+
|
|
319
350
|
# Check scripts for build tools
|
|
320
|
-
scripts = package_data.get(
|
|
351
|
+
scripts = package_data.get("scripts", {})
|
|
321
352
|
for script_name, script_cmd in scripts.items():
|
|
322
|
-
if any(
|
|
353
|
+
if any(
|
|
354
|
+
tool in script_cmd
|
|
355
|
+
for tool in ["webpack", "rollup", "vite", "parcel"]
|
|
356
|
+
):
|
|
323
357
|
characteristics.build_tools.append(script_name)
|
|
324
|
-
|
|
358
|
+
|
|
325
359
|
except Exception as e:
|
|
326
360
|
self.logger.warning(f"Error parsing package.json: {e}")
|
|
327
|
-
|
|
328
|
-
def _parse_python_dependencies(
|
|
361
|
+
|
|
362
|
+
def _parse_python_dependencies(
|
|
363
|
+
self, deps_path: Path, characteristics: ProjectCharacteristics
|
|
364
|
+
) -> None:
|
|
329
365
|
"""Parse Python dependency files."""
|
|
330
366
|
try:
|
|
331
|
-
if deps_path.name ==
|
|
367
|
+
if deps_path.name == "requirements.txt":
|
|
332
368
|
content = deps_path.read_text()
|
|
333
|
-
deps = [
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
369
|
+
deps = [
|
|
370
|
+
line.strip().split("=")[0].split(">")[0].split("<")[0]
|
|
371
|
+
for line in content.splitlines()
|
|
372
|
+
if line.strip() and not line.startswith("#")
|
|
373
|
+
]
|
|
374
|
+
elif deps_path.name == "pyproject.toml":
|
|
337
375
|
try:
|
|
338
376
|
import tomllib
|
|
339
377
|
except ImportError:
|
|
340
378
|
try:
|
|
341
379
|
import tomli as tomllib
|
|
342
380
|
except ImportError:
|
|
343
|
-
self.logger.warning(
|
|
381
|
+
self.logger.warning(
|
|
382
|
+
f"TOML parsing not available for {deps_path}"
|
|
383
|
+
)
|
|
344
384
|
return
|
|
345
|
-
with open(
|
|
385
|
+
with deps_path.open("rb") as f:
|
|
346
386
|
data = tomllib.load(f)
|
|
347
|
-
deps = list(data.get(
|
|
348
|
-
deps.extend(
|
|
387
|
+
deps = list(data.get("project", {}).get("dependencies", []))
|
|
388
|
+
deps.extend(
|
|
389
|
+
list(
|
|
390
|
+
data.get("tool", {})
|
|
391
|
+
.get("poetry", {})
|
|
392
|
+
.get("dependencies", {})
|
|
393
|
+
.keys()
|
|
394
|
+
)
|
|
395
|
+
)
|
|
349
396
|
else:
|
|
350
397
|
return
|
|
351
|
-
|
|
398
|
+
|
|
352
399
|
# Identify frameworks and tools
|
|
353
400
|
for dep in deps:
|
|
354
401
|
dep_lower = dep.lower()
|
|
355
|
-
|
|
402
|
+
|
|
356
403
|
# Web frameworks
|
|
357
|
-
if dep_lower in [
|
|
404
|
+
if dep_lower in ["flask", "django", "fastapi", "tornado"]:
|
|
358
405
|
characteristics.web_frameworks.append(dep)
|
|
359
|
-
elif dep_lower in [
|
|
406
|
+
elif dep_lower in ["pytest", "unittest2", "nose"]:
|
|
360
407
|
if not characteristics.testing_framework:
|
|
361
408
|
characteristics.testing_framework = dep
|
|
362
|
-
elif any(
|
|
409
|
+
elif any(
|
|
410
|
+
db in dep_lower
|
|
411
|
+
for db in ["psycopg2", "mysql", "sqlite", "redis", "mongo"]
|
|
412
|
+
):
|
|
363
413
|
characteristics.databases.append(dep)
|
|
364
|
-
|
|
414
|
+
|
|
365
415
|
characteristics.key_dependencies.append(dep)
|
|
366
|
-
|
|
416
|
+
|
|
367
417
|
except Exception as e:
|
|
368
418
|
self.logger.warning(f"Error parsing Python dependencies: {e}")
|
|
369
|
-
|
|
370
|
-
def _parse_cargo_toml(
|
|
419
|
+
|
|
420
|
+
def _parse_cargo_toml(
|
|
421
|
+
self, cargo_path: Path, characteristics: ProjectCharacteristics
|
|
422
|
+
) -> None:
|
|
371
423
|
"""Parse Cargo.toml for Rust project details."""
|
|
372
424
|
try:
|
|
373
425
|
try:
|
|
@@ -378,244 +430,309 @@ class ProjectAnalyzer:
|
|
|
378
430
|
except ImportError:
|
|
379
431
|
self.logger.warning(f"TOML parsing not available for {cargo_path}")
|
|
380
432
|
return
|
|
381
|
-
with open(
|
|
433
|
+
with cargo_path.open("rb") as f:
|
|
382
434
|
cargo_data = tomllib.load(f)
|
|
383
|
-
|
|
384
|
-
deps = cargo_data.get(
|
|
385
|
-
for dep_name in deps
|
|
435
|
+
|
|
436
|
+
deps = cargo_data.get("dependencies", {})
|
|
437
|
+
for dep_name in deps:
|
|
386
438
|
characteristics.key_dependencies.append(dep_name)
|
|
387
|
-
|
|
439
|
+
|
|
388
440
|
# Identify common Rust frameworks
|
|
389
|
-
if dep_name in [
|
|
441
|
+
if dep_name in ["actix-web", "warp", "rocket"]:
|
|
390
442
|
characteristics.web_frameworks.append(dep_name)
|
|
391
|
-
elif dep_name in [
|
|
443
|
+
elif dep_name in ["tokio", "async-std"]:
|
|
392
444
|
characteristics.frameworks.append(dep_name)
|
|
393
|
-
|
|
445
|
+
|
|
394
446
|
except Exception as e:
|
|
395
447
|
self.logger.warning(f"Error parsing Cargo.toml: {e}")
|
|
396
|
-
|
|
397
|
-
def _analyze_directory_structure(
|
|
448
|
+
|
|
449
|
+
def _analyze_directory_structure(
|
|
450
|
+
self, characteristics: ProjectCharacteristics
|
|
451
|
+
) -> None:
|
|
398
452
|
"""Analyze directory structure for architecture patterns.
|
|
399
|
-
|
|
453
|
+
|
|
400
454
|
WHY: Directory structure reveals architectural decisions and project
|
|
401
455
|
organization patterns that agents should understand and follow.
|
|
402
|
-
|
|
456
|
+
|
|
403
457
|
Args:
|
|
404
458
|
characteristics: ProjectCharacteristics object to update
|
|
405
459
|
"""
|
|
406
460
|
# Common important directories to look for
|
|
407
461
|
important_dirs = [
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
462
|
+
"src",
|
|
463
|
+
"lib",
|
|
464
|
+
"app",
|
|
465
|
+
"components",
|
|
466
|
+
"services",
|
|
467
|
+
"models",
|
|
468
|
+
"views",
|
|
469
|
+
"controllers",
|
|
470
|
+
"routes",
|
|
471
|
+
"api",
|
|
472
|
+
"web",
|
|
473
|
+
"static",
|
|
474
|
+
"templates",
|
|
475
|
+
"tests",
|
|
476
|
+
"test",
|
|
477
|
+
"__tests__",
|
|
478
|
+
"spec",
|
|
479
|
+
"docs",
|
|
480
|
+
"documentation",
|
|
481
|
+
"config",
|
|
482
|
+
"configs",
|
|
483
|
+
"settings",
|
|
484
|
+
"utils",
|
|
485
|
+
"helpers",
|
|
486
|
+
"core",
|
|
487
|
+
"modules",
|
|
488
|
+
"packages",
|
|
489
|
+
"plugins",
|
|
490
|
+
"extensions",
|
|
413
491
|
]
|
|
414
|
-
|
|
492
|
+
|
|
415
493
|
# Check which directories exist
|
|
416
494
|
existing_dirs = []
|
|
417
495
|
for dir_name in important_dirs:
|
|
418
496
|
dir_path = self.working_directory / dir_name
|
|
419
497
|
if dir_path.exists() and dir_path.is_dir():
|
|
420
498
|
existing_dirs.append(dir_name)
|
|
421
|
-
|
|
499
|
+
|
|
422
500
|
# Special handling for certain directories
|
|
423
|
-
if dir_name in [
|
|
501
|
+
if dir_name in ["src", "lib", "app"]:
|
|
424
502
|
# These are likely main module directories
|
|
425
|
-
characteristics.main_modules.extend(
|
|
426
|
-
|
|
503
|
+
characteristics.main_modules.extend(
|
|
504
|
+
self._get_subdirectories(dir_path)
|
|
505
|
+
)
|
|
506
|
+
|
|
427
507
|
characteristics.key_directories = existing_dirs
|
|
428
|
-
|
|
508
|
+
|
|
429
509
|
# Look for entry points
|
|
430
510
|
entry_point_patterns = [
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
511
|
+
"main.py",
|
|
512
|
+
"app.py",
|
|
513
|
+
"server.py",
|
|
514
|
+
"index.js",
|
|
515
|
+
"main.js",
|
|
516
|
+
"app.js",
|
|
517
|
+
"server.js",
|
|
518
|
+
"main.rs",
|
|
519
|
+
"lib.rs",
|
|
520
|
+
"Main.java",
|
|
521
|
+
"main.go",
|
|
522
|
+
"index.php",
|
|
523
|
+
"application.rb",
|
|
434
524
|
]
|
|
435
|
-
|
|
525
|
+
|
|
436
526
|
for pattern in entry_point_patterns:
|
|
437
527
|
entry_path = self.working_directory / pattern
|
|
438
528
|
if entry_path.exists():
|
|
439
529
|
characteristics.entry_points.append(pattern)
|
|
440
|
-
|
|
530
|
+
|
|
441
531
|
# Also check in src/ directory
|
|
442
|
-
src_entry_path = self.working_directory /
|
|
532
|
+
src_entry_path = self.working_directory / "src" / pattern
|
|
443
533
|
if src_entry_path.exists():
|
|
444
|
-
characteristics.entry_points.append(f
|
|
445
|
-
|
|
534
|
+
characteristics.entry_points.append(f"src/{pattern}")
|
|
535
|
+
|
|
446
536
|
def _get_subdirectories(self, path: Path, max_depth: int = 2) -> List[str]:
|
|
447
537
|
"""Get subdirectory names up to a certain depth."""
|
|
448
538
|
subdirs = []
|
|
449
539
|
try:
|
|
450
540
|
for item in path.iterdir():
|
|
451
|
-
if item.is_dir() and not item.name.startswith(
|
|
541
|
+
if item.is_dir() and not item.name.startswith("."):
|
|
452
542
|
subdirs.append(item.name)
|
|
453
543
|
if max_depth > 1:
|
|
454
544
|
for subitem in item.iterdir():
|
|
455
|
-
if subitem.is_dir() and not subitem.name.startswith(
|
|
545
|
+
if subitem.is_dir() and not subitem.name.startswith("."):
|
|
456
546
|
subdirs.append(f"{item.name}/{subitem.name}")
|
|
457
547
|
except PermissionError:
|
|
458
548
|
pass
|
|
459
549
|
return subdirs[:10] # Limit to prevent overwhelming output
|
|
460
|
-
|
|
550
|
+
|
|
461
551
|
def _analyze_source_code(self, characteristics: ProjectCharacteristics) -> None:
|
|
462
552
|
"""Analyze source code files for patterns and conventions.
|
|
463
|
-
|
|
553
|
+
|
|
464
554
|
WHY: Source code contains the actual implementation patterns that agents
|
|
465
555
|
should understand and follow. This analysis extracts coding conventions
|
|
466
556
|
and architectural patterns from the codebase.
|
|
467
|
-
|
|
557
|
+
|
|
468
558
|
Args:
|
|
469
559
|
characteristics: ProjectCharacteristics object to update
|
|
470
560
|
"""
|
|
471
561
|
source_extensions = {
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
562
|
+
".py": "python",
|
|
563
|
+
".js": "javascript",
|
|
564
|
+
".ts": "typescript",
|
|
565
|
+
".jsx": "react",
|
|
566
|
+
".tsx": "react",
|
|
567
|
+
".rs": "rust",
|
|
568
|
+
".java": "java",
|
|
569
|
+
".go": "go",
|
|
570
|
+
".php": "php",
|
|
571
|
+
".rb": "ruby",
|
|
572
|
+
".cpp": "cpp",
|
|
573
|
+
".cc": "cpp",
|
|
574
|
+
".c": "c",
|
|
485
575
|
}
|
|
486
|
-
|
|
576
|
+
|
|
487
577
|
# Find source files
|
|
488
578
|
source_files = []
|
|
489
579
|
languages_found = set()
|
|
490
|
-
|
|
580
|
+
|
|
491
581
|
for ext, lang in source_extensions.items():
|
|
492
|
-
files = list(self.working_directory.rglob(f
|
|
582
|
+
files = list(self.working_directory.rglob(f"*{ext}"))
|
|
493
583
|
# Filter out node_modules, .git, etc.
|
|
494
|
-
files = [
|
|
495
|
-
|
|
584
|
+
files = [
|
|
585
|
+
f
|
|
586
|
+
for f in files
|
|
587
|
+
if not any(
|
|
588
|
+
part.startswith(".") or part == "node_modules" for part in f.parts
|
|
589
|
+
)
|
|
590
|
+
]
|
|
496
591
|
source_files.extend(files)
|
|
497
592
|
if files:
|
|
498
593
|
languages_found.add(lang)
|
|
499
|
-
|
|
594
|
+
|
|
500
595
|
# Update languages found
|
|
501
|
-
characteristics.languages.extend(
|
|
502
|
-
|
|
503
|
-
|
|
596
|
+
characteristics.languages.extend(
|
|
597
|
+
[lang for lang in languages_found if lang not in characteristics.languages]
|
|
598
|
+
)
|
|
599
|
+
|
|
504
600
|
# Analyze a sample of source files for patterns
|
|
505
601
|
sample_files = source_files[:20] # Don't analyze too many files
|
|
506
|
-
|
|
602
|
+
|
|
507
603
|
framework_mentions = Counter()
|
|
508
604
|
pattern_mentions = Counter()
|
|
509
|
-
|
|
605
|
+
|
|
510
606
|
for file_path in sample_files:
|
|
511
607
|
try:
|
|
512
|
-
content = file_path.read_text(encoding=
|
|
513
|
-
|
|
608
|
+
content = file_path.read_text(encoding="utf-8", errors="ignore")
|
|
609
|
+
|
|
514
610
|
# Look for framework patterns
|
|
515
611
|
for framework, patterns in self.FRAMEWORK_PATTERNS.items():
|
|
516
612
|
if any(pattern in content for pattern in patterns):
|
|
517
613
|
framework_mentions[framework] += 1
|
|
518
|
-
|
|
614
|
+
|
|
519
615
|
# Look for database patterns
|
|
520
616
|
for db, patterns in self.DATABASE_PATTERNS.items():
|
|
521
617
|
if any(pattern in content for pattern in patterns):
|
|
522
618
|
if db not in characteristics.databases:
|
|
523
619
|
characteristics.databases.append(db)
|
|
524
|
-
|
|
620
|
+
|
|
525
621
|
# Look for common patterns
|
|
526
|
-
if
|
|
527
|
-
pattern_mentions[
|
|
528
|
-
if
|
|
529
|
-
pattern_mentions[
|
|
530
|
-
if
|
|
531
|
-
pattern_mentions[
|
|
532
|
-
if
|
|
533
|
-
pattern_mentions[
|
|
534
|
-
|
|
622
|
+
if "class " in content and "def __init__" in content:
|
|
623
|
+
pattern_mentions["object_oriented"] += 1
|
|
624
|
+
if "@app.route" in content or "app.get(" in content:
|
|
625
|
+
pattern_mentions["web_routes"] += 1
|
|
626
|
+
if "async def" in content or "async function" in content:
|
|
627
|
+
pattern_mentions["async_programming"] += 1
|
|
628
|
+
if "import pytest" in content or "describe(" in content:
|
|
629
|
+
pattern_mentions["unit_testing"] += 1
|
|
630
|
+
|
|
535
631
|
except Exception as e:
|
|
536
632
|
self.logger.debug(f"Error analyzing {file_path}: {e}")
|
|
537
633
|
continue
|
|
538
|
-
|
|
634
|
+
|
|
539
635
|
# Add discovered frameworks
|
|
540
636
|
for framework, count in framework_mentions.most_common(5):
|
|
541
637
|
if framework not in characteristics.frameworks:
|
|
542
638
|
characteristics.frameworks.append(framework)
|
|
543
|
-
|
|
639
|
+
|
|
544
640
|
# Add coding conventions based on patterns found
|
|
545
641
|
for pattern, count in pattern_mentions.most_common():
|
|
546
642
|
if count >= 2: # Pattern appears in multiple files
|
|
547
|
-
characteristics.code_conventions.append(
|
|
548
|
-
|
|
643
|
+
characteristics.code_conventions.append(
|
|
644
|
+
pattern.replace("_", " ").title()
|
|
645
|
+
)
|
|
646
|
+
|
|
549
647
|
def _analyze_dependencies(self, characteristics: ProjectCharacteristics) -> None:
|
|
550
648
|
"""Analyze dependencies for integration patterns.
|
|
551
|
-
|
|
649
|
+
|
|
552
650
|
Args:
|
|
553
651
|
characteristics: ProjectCharacteristics object to update
|
|
554
652
|
"""
|
|
555
653
|
# This is partially covered by config file analysis
|
|
556
654
|
# Here we can add more sophisticated dependency analysis
|
|
557
|
-
|
|
655
|
+
|
|
558
656
|
# Look for common integration patterns in dependencies
|
|
559
657
|
api_indicators = [
|
|
560
|
-
|
|
561
|
-
|
|
658
|
+
"requests",
|
|
659
|
+
"axios",
|
|
660
|
+
"fetch",
|
|
661
|
+
"http",
|
|
662
|
+
"urllib",
|
|
663
|
+
"rest",
|
|
664
|
+
"graphql",
|
|
665
|
+
"grpc",
|
|
666
|
+
"soap",
|
|
562
667
|
]
|
|
563
|
-
|
|
668
|
+
|
|
564
669
|
for dep in characteristics.key_dependencies:
|
|
565
670
|
dep_lower = dep.lower()
|
|
566
671
|
for indicator in api_indicators:
|
|
567
672
|
if indicator in dep_lower:
|
|
568
|
-
if
|
|
569
|
-
characteristics.api_patterns.append(
|
|
673
|
+
if "REST API" not in characteristics.api_patterns:
|
|
674
|
+
characteristics.api_patterns.append("REST API")
|
|
570
675
|
break
|
|
571
|
-
|
|
572
|
-
def _analyze_testing_patterns(
|
|
676
|
+
|
|
677
|
+
def _analyze_testing_patterns(
|
|
678
|
+
self, characteristics: ProjectCharacteristics
|
|
679
|
+
) -> None:
|
|
573
680
|
"""Analyze testing patterns and frameworks.
|
|
574
|
-
|
|
681
|
+
|
|
575
682
|
Args:
|
|
576
683
|
characteristics: ProjectCharacteristics object to update
|
|
577
684
|
"""
|
|
578
|
-
test_dirs = [
|
|
685
|
+
test_dirs = ["tests", "test", "__tests__", "spec"]
|
|
579
686
|
test_patterns = []
|
|
580
|
-
|
|
687
|
+
|
|
581
688
|
for test_dir in test_dirs:
|
|
582
689
|
test_path = self.working_directory / test_dir
|
|
583
690
|
if test_path.exists() and test_path.is_dir():
|
|
584
691
|
test_patterns.append(f"Tests in /{test_dir}/ directory")
|
|
585
|
-
|
|
692
|
+
|
|
586
693
|
# Look for test files to understand patterns
|
|
587
|
-
test_files =
|
|
588
|
-
|
|
694
|
+
test_files = (
|
|
695
|
+
list(test_path.rglob("*.py"))
|
|
696
|
+
+ list(test_path.rglob("*.js"))
|
|
697
|
+
+ list(test_path.rglob("*.ts"))
|
|
698
|
+
)
|
|
699
|
+
|
|
589
700
|
for test_file in test_files[:5]: # Sample a few test files
|
|
590
701
|
try:
|
|
591
|
-
content = test_file.read_text(encoding=
|
|
592
|
-
|
|
593
|
-
if
|
|
702
|
+
content = test_file.read_text(encoding="utf-8", errors="ignore")
|
|
703
|
+
|
|
704
|
+
if "def test_" in content:
|
|
594
705
|
test_patterns.append("Python unittest pattern")
|
|
595
|
-
if
|
|
706
|
+
if "describe(" in content and "it(" in content:
|
|
596
707
|
test_patterns.append("BDD test pattern")
|
|
597
|
-
if
|
|
708
|
+
if "@pytest.fixture" in content:
|
|
598
709
|
test_patterns.append("pytest fixtures")
|
|
599
|
-
if
|
|
710
|
+
if "beforeEach(" in content or "beforeAll(" in content:
|
|
600
711
|
test_patterns.append("Setup/teardown patterns")
|
|
601
|
-
|
|
712
|
+
|
|
602
713
|
except Exception:
|
|
603
714
|
continue
|
|
604
|
-
|
|
715
|
+
|
|
605
716
|
characteristics.test_patterns = list(set(test_patterns))
|
|
606
|
-
|
|
717
|
+
|
|
607
718
|
def _analyze_documentation(self, characteristics: ProjectCharacteristics) -> None:
|
|
608
719
|
"""Analyze documentation files.
|
|
609
|
-
|
|
720
|
+
|
|
610
721
|
Args:
|
|
611
722
|
characteristics: ProjectCharacteristics object to update
|
|
612
723
|
"""
|
|
613
724
|
doc_patterns = [
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
725
|
+
"README.md",
|
|
726
|
+
"README.rst",
|
|
727
|
+
"README.txt",
|
|
728
|
+
"CONTRIBUTING.md",
|
|
729
|
+
"CHANGELOG.md",
|
|
730
|
+
"HISTORY.md",
|
|
731
|
+
"docs/",
|
|
732
|
+
"documentation/",
|
|
733
|
+
"wiki/",
|
|
617
734
|
]
|
|
618
|
-
|
|
735
|
+
|
|
619
736
|
doc_files = []
|
|
620
737
|
for pattern in doc_patterns:
|
|
621
738
|
doc_path = self.working_directory / pattern
|
|
@@ -624,148 +741,281 @@ class ProjectAnalyzer:
|
|
|
624
741
|
doc_files.append(pattern)
|
|
625
742
|
elif doc_path.is_dir():
|
|
626
743
|
# Find markdown files in doc directories
|
|
627
|
-
md_files = list(doc_path.rglob(
|
|
628
|
-
doc_files.extend(
|
|
629
|
-
|
|
744
|
+
md_files = list(doc_path.rglob("*.md"))[:10]
|
|
745
|
+
doc_files.extend(
|
|
746
|
+
[str(f.relative_to(self.working_directory)) for f in md_files]
|
|
747
|
+
)
|
|
748
|
+
|
|
630
749
|
characteristics.documentation_files = doc_files
|
|
631
|
-
|
|
750
|
+
|
|
632
751
|
def _infer_architecture_type(self, characteristics: ProjectCharacteristics) -> None:
|
|
633
752
|
"""Infer architecture type based on discovered patterns.
|
|
634
|
-
|
|
753
|
+
|
|
635
754
|
Args:
|
|
636
755
|
characteristics: ProjectCharacteristics object to update
|
|
637
756
|
"""
|
|
638
757
|
# Simple architecture inference based on patterns
|
|
639
|
-
if any(
|
|
640
|
-
|
|
758
|
+
if any(
|
|
759
|
+
fw in characteristics.web_frameworks
|
|
760
|
+
for fw in ["flask", "django", "express", "fastapi"]
|
|
761
|
+
):
|
|
762
|
+
if "api" in characteristics.key_directories:
|
|
641
763
|
characteristics.architecture_type = "REST API Service"
|
|
642
764
|
else:
|
|
643
765
|
characteristics.architecture_type = "Web Application"
|
|
644
|
-
elif
|
|
766
|
+
elif "services" in characteristics.key_directories:
|
|
645
767
|
characteristics.architecture_type = "Service-Oriented Architecture"
|
|
646
|
-
elif
|
|
768
|
+
elif (
|
|
769
|
+
"modules" in characteristics.key_directories
|
|
770
|
+
or "packages" in characteristics.key_directories
|
|
771
|
+
):
|
|
647
772
|
characteristics.architecture_type = "Modular Architecture"
|
|
648
|
-
elif
|
|
773
|
+
elif (
|
|
774
|
+
characteristics.primary_language == "python"
|
|
775
|
+
and "cli" in characteristics.main_modules
|
|
776
|
+
):
|
|
649
777
|
characteristics.architecture_type = "CLI Application"
|
|
650
|
-
elif any(
|
|
778
|
+
elif any("react" in fw.lower() for fw in characteristics.frameworks):
|
|
651
779
|
characteristics.architecture_type = "Single Page Application"
|
|
652
780
|
else:
|
|
653
781
|
characteristics.architecture_type = "Standard Application"
|
|
654
|
-
|
|
655
|
-
def _extract_project_terminology(
|
|
782
|
+
|
|
783
|
+
def _extract_project_terminology(
|
|
784
|
+
self, characteristics: ProjectCharacteristics
|
|
785
|
+
) -> None:
|
|
656
786
|
"""Extract project-specific terminology from various sources.
|
|
657
|
-
|
|
787
|
+
|
|
658
788
|
WHY: Projects often have domain-specific terminology that agents should
|
|
659
789
|
understand and use consistently.
|
|
660
|
-
|
|
790
|
+
|
|
661
791
|
Args:
|
|
662
792
|
characteristics: ProjectCharacteristics object to update
|
|
663
793
|
"""
|
|
664
794
|
terminology = set()
|
|
665
|
-
|
|
795
|
+
|
|
666
796
|
# Extract from project name
|
|
667
|
-
project_words = re.findall(r
|
|
797
|
+
project_words = re.findall(r"[A-Z][a-z]+|[a-z]+", characteristics.project_name)
|
|
668
798
|
terminology.update(project_words)
|
|
669
|
-
|
|
799
|
+
|
|
670
800
|
# Extract from directory names
|
|
671
801
|
for dir_name in characteristics.key_directories:
|
|
672
|
-
words = re.findall(r
|
|
802
|
+
words = re.findall(r"[A-Z][a-z]+|[a-z]+", dir_name)
|
|
673
803
|
terminology.update(words)
|
|
674
|
-
|
|
804
|
+
|
|
675
805
|
# Extract from main modules
|
|
676
806
|
for module in characteristics.main_modules:
|
|
677
|
-
words = re.findall(r
|
|
807
|
+
words = re.findall(r"[A-Z][a-z]+|[a-z]+", module)
|
|
678
808
|
terminology.update(words)
|
|
679
|
-
|
|
809
|
+
|
|
680
810
|
# Filter out common words and keep domain-specific terms
|
|
681
811
|
common_words = {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
812
|
+
"src",
|
|
813
|
+
"lib",
|
|
814
|
+
"app",
|
|
815
|
+
"main",
|
|
816
|
+
"test",
|
|
817
|
+
"tests",
|
|
818
|
+
"docs",
|
|
819
|
+
"config",
|
|
820
|
+
"utils",
|
|
821
|
+
"helpers",
|
|
822
|
+
"core",
|
|
823
|
+
"base",
|
|
824
|
+
"common",
|
|
825
|
+
"shared",
|
|
826
|
+
"public",
|
|
827
|
+
"private",
|
|
828
|
+
"static",
|
|
829
|
+
"assets",
|
|
830
|
+
"build",
|
|
831
|
+
"dist",
|
|
832
|
+
"node",
|
|
833
|
+
"modules",
|
|
685
834
|
}
|
|
686
|
-
|
|
687
|
-
domain_terms = [
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
835
|
+
|
|
836
|
+
domain_terms = [
|
|
837
|
+
term
|
|
838
|
+
for term in terminology
|
|
839
|
+
if len(term) > 3 and term.lower() not in common_words
|
|
840
|
+
]
|
|
841
|
+
|
|
842
|
+
characteristics.project_terminology = list(set(domain_terms))[
|
|
843
|
+
:10
|
|
844
|
+
] # Limit to most relevant
|
|
845
|
+
|
|
692
846
|
def get_project_context_summary(self) -> str:
|
|
693
847
|
"""Get a concise summary of project context for memory templates.
|
|
694
|
-
|
|
848
|
+
|
|
695
849
|
WHY: Provides a formatted summary specifically designed for inclusion
|
|
696
850
|
in agent memory templates, focusing on the most relevant characteristics.
|
|
697
|
-
|
|
851
|
+
|
|
698
852
|
Returns:
|
|
699
853
|
str: Formatted project context summary
|
|
700
854
|
"""
|
|
701
855
|
characteristics = self.analyze_project()
|
|
702
|
-
|
|
856
|
+
|
|
703
857
|
summary_parts = []
|
|
704
|
-
|
|
858
|
+
|
|
705
859
|
# Basic project info
|
|
706
860
|
lang_info = characteristics.primary_language or "mixed"
|
|
707
861
|
if characteristics.languages and len(characteristics.languages) > 1:
|
|
708
|
-
lang_info =
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
862
|
+
lang_info = (
|
|
863
|
+
f"{lang_info} (with {', '.join(characteristics.languages[1:3])})"
|
|
864
|
+
)
|
|
865
|
+
|
|
866
|
+
summary_parts.append(
|
|
867
|
+
f"{characteristics.project_name}: {lang_info} {characteristics.architecture_type.lower()}"
|
|
868
|
+
)
|
|
869
|
+
|
|
712
870
|
# Key directories and modules
|
|
713
871
|
if characteristics.main_modules:
|
|
714
872
|
modules_str = ", ".join(characteristics.main_modules[:4])
|
|
715
873
|
summary_parts.append(f"- Main modules: {modules_str}")
|
|
716
|
-
|
|
874
|
+
|
|
717
875
|
# Frameworks and tools
|
|
718
876
|
if characteristics.frameworks or characteristics.web_frameworks:
|
|
719
877
|
all_frameworks = characteristics.frameworks + characteristics.web_frameworks
|
|
720
878
|
frameworks_str = ", ".join(all_frameworks[:3])
|
|
721
879
|
summary_parts.append(f"- Uses: {frameworks_str}")
|
|
722
|
-
|
|
880
|
+
|
|
723
881
|
# Testing
|
|
724
882
|
if characteristics.testing_framework:
|
|
725
883
|
summary_parts.append(f"- Testing: {characteristics.testing_framework}")
|
|
726
884
|
elif characteristics.test_patterns:
|
|
727
885
|
summary_parts.append(f"- Testing: {characteristics.test_patterns[0]}")
|
|
728
|
-
|
|
886
|
+
|
|
729
887
|
# Key patterns
|
|
730
888
|
if characteristics.code_conventions:
|
|
731
889
|
patterns_str = ", ".join(characteristics.code_conventions[:2])
|
|
732
890
|
summary_parts.append(f"- Key patterns: {patterns_str}")
|
|
733
|
-
|
|
891
|
+
|
|
734
892
|
return "\n".join(summary_parts)
|
|
735
|
-
|
|
893
|
+
|
|
736
894
|
def get_important_files_for_context(self) -> List[str]:
|
|
737
895
|
"""Get list of important files that should be considered for memory context.
|
|
738
|
-
|
|
896
|
+
|
|
739
897
|
WHY: Instead of hardcoding which files to analyze for memory creation,
|
|
740
898
|
this method dynamically determines the most relevant files based on
|
|
741
899
|
the actual project structure.
|
|
742
|
-
|
|
900
|
+
|
|
743
901
|
Returns:
|
|
744
902
|
List[str]: List of file paths relative to project root
|
|
745
903
|
"""
|
|
746
904
|
characteristics = self.analyze_project()
|
|
747
905
|
important_files = []
|
|
748
|
-
|
|
906
|
+
|
|
749
907
|
# Always include standard documentation
|
|
750
|
-
standard_docs = [
|
|
908
|
+
standard_docs = ["README.md", "CONTRIBUTING.md", "CHANGELOG.md"]
|
|
751
909
|
for doc in standard_docs:
|
|
752
910
|
if (self.working_directory / doc).exists():
|
|
753
911
|
important_files.append(doc)
|
|
754
|
-
|
|
912
|
+
|
|
755
913
|
# Include configuration files
|
|
756
914
|
important_files.extend(characteristics.important_configs)
|
|
757
|
-
|
|
915
|
+
|
|
758
916
|
# Include project-specific documentation
|
|
759
917
|
important_files.extend(characteristics.documentation_files[:5])
|
|
760
|
-
|
|
918
|
+
|
|
761
919
|
# Include entry points
|
|
762
920
|
important_files.extend(characteristics.entry_points)
|
|
763
|
-
|
|
921
|
+
|
|
764
922
|
# Look for architecture documentation
|
|
765
|
-
arch_patterns = [
|
|
923
|
+
arch_patterns = ["ARCHITECTURE.md", "docs/architecture.md", "docs/STRUCTURE.md"]
|
|
766
924
|
for pattern in arch_patterns:
|
|
767
925
|
if (self.working_directory / pattern).exists():
|
|
768
926
|
important_files.append(pattern)
|
|
769
|
-
|
|
927
|
+
|
|
770
928
|
# Remove duplicates and return
|
|
771
|
-
return list(set(important_files))
|
|
929
|
+
return list(set(important_files))
|
|
930
|
+
|
|
931
|
+
# ================================================================================
|
|
932
|
+
# Interface Adapter Methods
|
|
933
|
+
# ================================================================================
|
|
934
|
+
# These methods adapt the existing implementation to comply with ProjectAnalyzerInterface
|
|
935
|
+
|
|
936
|
+
def detect_technology_stack(self) -> List[str]:
|
|
937
|
+
"""Detect technologies used in the project.
|
|
938
|
+
|
|
939
|
+
WHY: This adapter method provides interface compliance by extracting
|
|
940
|
+
technology information from the analyzed project characteristics.
|
|
941
|
+
|
|
942
|
+
Returns:
|
|
943
|
+
List of detected technologies
|
|
944
|
+
"""
|
|
945
|
+
characteristics = self.analyze_project()
|
|
946
|
+
|
|
947
|
+
technologies = []
|
|
948
|
+
technologies.extend(characteristics.languages)
|
|
949
|
+
technologies.extend(characteristics.frameworks)
|
|
950
|
+
technologies.extend(characteristics.web_frameworks)
|
|
951
|
+
technologies.extend(characteristics.databases)
|
|
952
|
+
|
|
953
|
+
# Add package manager as technology
|
|
954
|
+
if characteristics.package_manager:
|
|
955
|
+
technologies.append(characteristics.package_manager)
|
|
956
|
+
|
|
957
|
+
# Add build tools
|
|
958
|
+
technologies.extend(characteristics.build_tools)
|
|
959
|
+
|
|
960
|
+
# Remove duplicates
|
|
961
|
+
return list(set(technologies))
|
|
962
|
+
|
|
963
|
+
def analyze_code_patterns(self) -> Dict[str, Any]:
|
|
964
|
+
"""Analyze code patterns and conventions.
|
|
965
|
+
|
|
966
|
+
WHY: This adapter method provides interface compliance by extracting
|
|
967
|
+
pattern information from the project characteristics.
|
|
968
|
+
|
|
969
|
+
Returns:
|
|
970
|
+
Dictionary of pattern analysis results
|
|
971
|
+
"""
|
|
972
|
+
characteristics = self.analyze_project()
|
|
973
|
+
|
|
974
|
+
return {
|
|
975
|
+
"code_conventions": characteristics.code_conventions,
|
|
976
|
+
"test_patterns": characteristics.test_patterns,
|
|
977
|
+
"api_patterns": characteristics.api_patterns,
|
|
978
|
+
"configuration_patterns": characteristics.configuration_patterns,
|
|
979
|
+
"architecture_type": characteristics.architecture_type,
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
def get_project_structure(self) -> Dict[str, Any]:
|
|
983
|
+
"""Get project directory structure analysis.
|
|
984
|
+
|
|
985
|
+
WHY: This adapter method provides interface compliance by organizing
|
|
986
|
+
structural information from the project characteristics.
|
|
987
|
+
|
|
988
|
+
Returns:
|
|
989
|
+
Dictionary representing project structure
|
|
990
|
+
"""
|
|
991
|
+
characteristics = self.analyze_project()
|
|
992
|
+
|
|
993
|
+
return {
|
|
994
|
+
"project_name": characteristics.project_name,
|
|
995
|
+
"main_modules": characteristics.main_modules,
|
|
996
|
+
"key_directories": characteristics.key_directories,
|
|
997
|
+
"entry_points": characteristics.entry_points,
|
|
998
|
+
"documentation_files": characteristics.documentation_files,
|
|
999
|
+
"important_configs": characteristics.important_configs,
|
|
1000
|
+
"architecture_type": characteristics.architecture_type,
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
def identify_entry_points(self) -> List[Path]:
|
|
1004
|
+
"""Identify project entry points.
|
|
1005
|
+
|
|
1006
|
+
WHY: This adapter method provides interface compliance by converting
|
|
1007
|
+
string entry points to Path objects as expected by the interface.
|
|
1008
|
+
|
|
1009
|
+
Returns:
|
|
1010
|
+
List of entry point paths
|
|
1011
|
+
"""
|
|
1012
|
+
characteristics = self.analyze_project()
|
|
1013
|
+
|
|
1014
|
+
# Convert string paths to Path objects
|
|
1015
|
+
entry_paths = []
|
|
1016
|
+
for entry_point in characteristics.entry_points:
|
|
1017
|
+
entry_path = self.working_directory / entry_point
|
|
1018
|
+
if entry_path.exists():
|
|
1019
|
+
entry_paths.append(entry_path)
|
|
1020
|
+
|
|
1021
|
+
return entry_paths
|