claude-mpm 0.3.0__py3-none-any.whl → 1.1.0__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.
Files changed (42) hide show
  1. claude_mpm/_version.py +3 -2
  2. claude_mpm/agents/INSTRUCTIONS.md +23 -0
  3. claude_mpm/agents/__init__.py +2 -2
  4. claude_mpm/agents/agent-template.yaml +83 -0
  5. claude_mpm/agents/agent_loader.py +66 -90
  6. claude_mpm/agents/base_agent_loader.py +10 -15
  7. claude_mpm/cli.py +41 -47
  8. claude_mpm/cli_enhancements.py +297 -0
  9. claude_mpm/core/agent_name_normalizer.py +49 -0
  10. claude_mpm/core/factories.py +1 -46
  11. claude_mpm/core/service_registry.py +0 -8
  12. claude_mpm/core/simple_runner.py +50 -0
  13. claude_mpm/generators/__init__.py +5 -0
  14. claude_mpm/generators/agent_profile_generator.py +137 -0
  15. claude_mpm/hooks/README.md +75 -221
  16. claude_mpm/hooks/builtin/mpm_command_hook.py +125 -0
  17. claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +8 -7
  18. claude_mpm/hooks/claude_hooks/__init__.py +5 -0
  19. claude_mpm/hooks/claude_hooks/hook_handler.py +399 -0
  20. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +47 -0
  21. claude_mpm/hooks/validation_hooks.py +181 -0
  22. claude_mpm/services/agent_management_service.py +4 -4
  23. claude_mpm/services/agent_profile_loader.py +1 -1
  24. claude_mpm/services/agent_registry.py +0 -1
  25. claude_mpm/services/base_agent_manager.py +3 -3
  26. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +57 -31
  27. claude_mpm/utils/error_handler.py +247 -0
  28. claude_mpm/validation/__init__.py +5 -0
  29. claude_mpm/validation/agent_validator.py +175 -0
  30. {claude_mpm-0.3.0.dist-info → claude_mpm-1.1.0.dist-info}/METADATA +44 -7
  31. {claude_mpm-0.3.0.dist-info → claude_mpm-1.1.0.dist-info}/RECORD +34 -30
  32. claude_mpm/config/hook_config.py +0 -42
  33. claude_mpm/hooks/hook_client.py +0 -264
  34. claude_mpm/hooks/hook_runner.py +0 -370
  35. claude_mpm/hooks/json_rpc_executor.py +0 -259
  36. claude_mpm/hooks/json_rpc_hook_client.py +0 -319
  37. claude_mpm/services/hook_service.py +0 -388
  38. claude_mpm/services/hook_service_manager.py +0 -223
  39. claude_mpm/services/json_rpc_hook_manager.py +0 -92
  40. {claude_mpm-0.3.0.dist-info → claude_mpm-1.1.0.dist-info}/WHEEL +0 -0
  41. {claude_mpm-0.3.0.dist-info → claude_mpm-1.1.0.dist-info}/entry_points.txt +0 -0
  42. {claude_mpm-0.3.0.dist-info → claude_mpm-1.1.0.dist-info}/top_level.txt +0 -0
@@ -1,18 +1,20 @@
1
1
  claude_mpm/__init__.py,sha256=sAbTZkHe3vWYAKDWdGyGVue5zwLD7nCOHZwZrLALM8A,395
2
2
  claude_mpm/__main__.py,sha256=smBw-5J3nf5s6GgQjj384GUr28YotIX-WNOxqpP0wnE,310
3
- claude_mpm/_version.py,sha256=n7VdPKEcovT2OwODlqBHlbkfj1OEIRsPXhFaCt3nRss,1206
4
- claude_mpm/cli.py,sha256=jQ9w3AqIF_6XHJk4D4NWL5Fo0jNS0wpmfekNlzudSSg,23666
3
+ claude_mpm/_version.py,sha256=8qIojoNf3eo5aQN6bVE2XdbA0APnkFaY0ifCYobPc8k,1307
4
+ claude_mpm/cli.py,sha256=EgzmFR-6njXedJUtMrWY0o-QAezsY3fc8uObehDDPMw,23164
5
+ claude_mpm/cli_enhancements.py,sha256=nwdOrbXITRqvcq_vrJtPKW1GDS7dLIG4UqjoUet2vR0,10890
5
6
  claude_mpm/cli_main.py,sha256=KCAe-ws73NrIg5qmFhPdZ1a4uoiaEZ-lldYzQ6KfnJg,306
6
7
  claude_mpm/constants.py,sha256=5AG5hgBxOC7gMNHDx0lAhS-FQ8gXhtGtqJ9Moj3S6ro,4044
7
8
  claude_mpm/init.py,sha256=gOreOf7BLXkT0_HrQk_As4Kz1OT_NJG_RG0i0hbY0z0,8088
8
9
  claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=TYgSd9jNBMWp4mAOBUl9dconX4RcGbvmMEScRy5uyko,3343
9
- claude_mpm/agents/INSTRUCTIONS.md,sha256=cBIYDYmoplY43N3lyf59-Zyl3hldcSla-SUtmY76jds,15430
10
- claude_mpm/agents/__init__.py,sha256=DxJswRx5DpgJVZEY5JlZm5VJNb_CakV5Ch231r7nWlo,3292
11
- claude_mpm/agents/agent_loader.py,sha256=RAAoIxM9DONMMIqyEhaU0nEiaZKYkEZpMP6humOBmU0,23669
10
+ claude_mpm/agents/INSTRUCTIONS.md,sha256=FuLq0cBjUjqByA9rdi1H_3SCt8xSjsTWM_VvnIQz2fg,16578
11
+ claude_mpm/agents/__init__.py,sha256=r-p7ervzjLPD7_8dm2tXX_fwvdTZy6KwKA03ofxN3sA,3275
12
+ claude_mpm/agents/agent-template.yaml,sha256=koKJn8MCAJx0QNQMHouvIZrwvw5qjPV0U-aV-YVyk6s,2036
13
+ claude_mpm/agents/agent_loader.py,sha256=jl7VSdyNQGNfLxIVJ0m0Fm8daEpSeUxgNCpy2asFEkA,22487
12
14
  claude_mpm/agents/agent_loader_integration.py,sha256=z_DXxAIeuUD71HBYdxxvcFKoQYQxITLo8oAdN_M4LTA,7610
13
15
  claude_mpm/agents/agents_metadata.py,sha256=Xju9Yim6XSv2u1J_Swre5VJySbdxxC-9TzpOfXG8ibg,5170
14
16
  claude_mpm/agents/base_agent.json,sha256=P4724UbQJQlZy57WkwIz_f_R86JepljWpTflI9hLrUs,2296
15
- claude_mpm/agents/base_agent_loader.py,sha256=gVWXfxFh3_Z5FJ77SWbxrA8yFOQ8IwwfnOgmv6Z89CQ,18680
17
+ claude_mpm/agents/base_agent_loader.py,sha256=DJ0BDP_7ic3q0Zv5YQFZCYZp2V3bC3bB1v11ohbN8yU,18418
16
18
  claude_mpm/agents/system_agent_config.py,sha256=Lke4FFjU0Vq3LLo4O7KvtHxadP7agAwC-ljCXK40h_A,23526
17
19
  claude_mpm/agents/schema/agent_schema.json,sha256=Ca_8E0QkFpGwQd7XjVy3jnBMv_-Yo2rL7Po-ziHut2U,5472
18
20
  claude_mpm/agents/templates/__init__.py,sha256=7UyIChghCnkrDctvmCRYr0Wrnn8Oj-eCdgL0KpFy1Mo,2668
@@ -34,9 +36,8 @@ claude_mpm/cli_module/refactoring_guide.md,sha256=fl1PGwLZAj4OYWmU0syg1jDd81PqK7
34
36
  claude_mpm/cli_old/__init__.py,sha256=v7mFJSN0p6NOIcURZp5ibZaZBn6iGrLwyGl7tA_lh4c,32
35
37
  claude_mpm/cli_old/ticket_cli.py,sha256=oKIT2LR1tToHybwypRfsNdnYlwdRzjWyjlQN5lYwTOk,3795
36
38
  claude_mpm/config/__init__.py,sha256=p31JuaXLDHgIgoAbHApNvctN2IEZYq2MBkkXROdhbH8,105
37
- claude_mpm/config/hook_config.py,sha256=ehVAVHhn6ZBxrdWXqXB2M8jcAmqaWCnE9gVxuxR2UEs,1334
38
39
  claude_mpm/core/__init__.py,sha256=hE29BeE3qb8vC1-wiKjPh60WZebCwfo9UAUGM1zQnkc,1206
39
- claude_mpm/core/agent_name_normalizer.py,sha256=QLA4z7yt-xBvXzmgFOa0mBmaQY4d26jHXIhPewbyxoc,7520
40
+ claude_mpm/core/agent_name_normalizer.py,sha256=-X68oz3_74t9BRbHA54NEGyjy0xjTsGp_sCUHDtKp1s,9269
40
41
  claude_mpm/core/agent_registry.py,sha256=4MAfc7xDlrYWWkHmDMRmWE8q32teuCmIcud9D0I0dLo,20496
41
42
  claude_mpm/core/agent_registry.py.bak,sha256=cXB0yqhonE1XsXmWcdwyNuvv8yddK_PyZILDCmwCZ_Q,10161
42
43
  claude_mpm/core/agent_session_manager.py,sha256=6alXQr4gnMR-unT4J1ryEtTxJqQolA0-NgPQN6X3lqY,11212
@@ -45,33 +46,36 @@ claude_mpm/core/base_service.py.bak,sha256=48A8eI_HPqxYm42X5jaTo8zQVOfFFXe7SqIUo
45
46
  claude_mpm/core/config.py,sha256=QNPufRWzXl99wAz14Gm2T_CG5K5n8d4eOjmpaxVllv0,12371
46
47
  claude_mpm/core/config_aliases.py,sha256=8eqA4wpWViIDm_9pL3f9j7cR_ssmhOYYiY2UzHrfUzg,10058
47
48
  claude_mpm/core/container.py,sha256=P4c4nSo_USSfHTxvpR1sQkVGNsgqozZBN27l3IXqiDc,12216
48
- claude_mpm/core/factories.py,sha256=ucS_t4mvLjyfQJ2FzMRemHJqKGqb_iTPe6HJ8x-ztOQ,9092
49
+ claude_mpm/core/factories.py,sha256=Qh2n_x112ZIPWEfwFley9bb9IZcSG38LkpT3uValyDk,7484
49
50
  claude_mpm/core/framework_loader.py,sha256=SdONNh8a7vSicr4vVuRzd7OqgDMIyg9k_xxbr8bLRi8,19547
50
51
  claude_mpm/core/injectable_service.py,sha256=7fOny9c6x8IJ9hVZmFql1eNDXXB1jcWbsxfTKbMZk74,7497
51
52
  claude_mpm/core/interfaces.py,sha256=TpP474EKEng-1TrjKUsN69qq6dXy8zIjicS7iV-ZPV0,15269
52
53
  claude_mpm/core/logger.py,sha256=wqYlUy8wlSXyTWOeWCGNYaIWdiFYzT7yw1U0vdT3R_8,15894
53
54
  claude_mpm/core/minimal_framework_loader.py,sha256=liYS4IyuW_aFK7yhRDZwTwT-3q09fT3wIJSUzkI93Ko,3673
54
55
  claude_mpm/core/mixins.py,sha256=rTEH-7FDpNiLB8oo6mSb0CLarJklv4fDJw1xM-gr5wI,5599
55
- claude_mpm/core/service_registry.py,sha256=rRJDidqVU3DmGRuEWcb3-hhK2gxVe7MCFDPNOh7XlbY,10790
56
+ claude_mpm/core/service_registry.py,sha256=wKJUO1g4UFA4dUpE3RkIYz1Ek8kIh4XfvU1kFeLCl2Q,10529
56
57
  claude_mpm/core/session_manager.py,sha256=3rO4KGZp8Qd_cUw6OWv4jyxGCUaL_MNPgCCpnwQt12A,6581
57
- claude_mpm/core/simple_runner.py,sha256=c7oAftT5HHWhHP1cNIw3p81sxwprAPdVNwY-l_wegks,20515
58
+ claude_mpm/core/simple_runner.py,sha256=WdgPz7qMhb9ApGNK3HnM-p4CAdvzvPGPdXsdLxp4xWQ,22473
58
59
  claude_mpm/core/tool_access_control.py,sha256=htZbDhC8s7D7BVqfmk0BwRrYJnlnUAk8_NeJKOaeNlg,6632
59
- claude_mpm/hooks/README.md,sha256=lsvGzw9g8Lf0VfRcqoGNGpAZEQSmpE0C8DksZ4nvDso,8030
60
+ claude_mpm/generators/__init__.py,sha256=l53aBn6kBQSDz3b6bZkMCJBcEmYnV9hHEZq8LKzXgH8,152
61
+ claude_mpm/generators/agent_profile_generator.py,sha256=2HjOscogSyvrtQj8KwdgNPS6Ym_QvgX1BMeauQZewZA,5751
62
+ claude_mpm/hooks/README.md,sha256=AjW-V7WQGf9o5X9otNl5k8rtal_MdyToFqVx_pudOXs,3289
60
63
  claude_mpm/hooks/__init__.py,sha256=Y3JJ_mEtvRP07r_gXkju4c0s18bjIXGH1uAbhSw1ES0,166
61
64
  claude_mpm/hooks/base_hook.py,sha256=a4V2EKEG02QQB0h-pnxhZI-fouKBLYbdBLckcaNuf0k,5098
62
- claude_mpm/hooks/hook_client.py,sha256=XxVIgV3L4RBV9YdfBHnm3oxfd8oZjFC4NYlVAbT5Lbk,8893
63
- claude_mpm/hooks/hook_runner.py,sha256=5cwo7SXRx4qr08JcYY4pbDktzBgJYgRZ624r8veGEgw,12800
64
- claude_mpm/hooks/json_rpc_executor.py,sha256=7D-jU_w1Gt1nV0kx5Rva_hleOPc92LtqZiX99j1MXjY,9091
65
- claude_mpm/hooks/json_rpc_hook_client.py,sha256=VZoTyKKIW0lfb5tZ5E3P_WlqBg6y9gzRG-ydZcomau0,11923
66
65
  claude_mpm/hooks/tool_call_interceptor.py,sha256=08_Odgm6Sg1zBJhGjwzVa03AReeBPZHTjndyjEO99cY,7629
66
+ claude_mpm/hooks/validation_hooks.py,sha256=7TU2N4SzCm2nwpsR0xiNKsHQNsWODnOVAmK9jHq1QqM,6582
67
67
  claude_mpm/hooks/builtin/__init__.py,sha256=Tfh3dIGxlQRUKBzR_MWC64WAKJ0Q_POsVVFl7lz9CD4,36
68
68
  claude_mpm/hooks/builtin/logging_hook_example.py,sha256=SyfdAH9ENTIpMhw2IeqqZpXNBUakYDI1yF5DFS0RJZ4,4971
69
+ claude_mpm/hooks/builtin/mpm_command_hook.py,sha256=PhQl1FifaB61gRrBOIXAim0R-XUBIzZwLdjb6WQuEGQ,4541
69
70
  claude_mpm/hooks/builtin/post_delegation_hook_example.py,sha256=54OJKRgjdXH8A2LHypbXoMlCNlmWXBY5Fvk0-VWq_fI,4596
70
71
  claude_mpm/hooks/builtin/pre_delegation_hook_example.py,sha256=JOAdDm46be_ol7uSmnQaE0jQS8SsiuGei80Auj3sdL8,4692
71
72
  claude_mpm/hooks/builtin/submit_hook_example.py,sha256=x7-yIF_QYe9uwCezeVDA_HdDTLu6uQfbTgZ12pdC4xo,3431
72
73
  claude_mpm/hooks/builtin/ticket_extraction_hook_example.py,sha256=4wNhS2tFUXgdcvepefUvi818Tt8kKnPQQJVxqINGeys,9237
73
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py,sha256=RJDWZRvCvZWls93MmsPDaDMa7AIjzIC67Q0wtXV3fXc,10053
74
+ claude_mpm/hooks/builtin/todo_agent_prefix_hook.py,sha256=v_4w2vcZIt0bkZxqdHmgtN79yHZ1gviuhhBws0FHpIQ,10226
74
75
  claude_mpm/hooks/builtin/workflow_start_hook.py,sha256=EQrtYD9qLMLSYPl3oQinEheZAJ2i5EO_h2jhhR8lmt0,7490
76
+ claude_mpm/hooks/claude_hooks/__init__.py,sha256=bMUwt2RzDGAcEbtDMA7vWS1uJsauOY0OixIe4pHwgQ0,129
77
+ claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=30YDU6hVoju-vDyhP9HdhdGo5NJ8g4reJiQokLjvSKk,16154
78
+ claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=6n0-G317jIrPuNRGnAyFvBbNM4gVzKEat_WSbpvKN-g,1742
75
79
  claude_mpm/orchestration/SUBPROCESS_DESIGN.md,sha256=YwToiT1_NXblv1XIWhWPNc2uKzDvqY2E_Nix8qK7qk0,2136
76
80
  claude_mpm/orchestration/__init__.py,sha256=C-cwldtfBCgV19mKnJa5U1XiKw1rAZvx-kK61nIdcao,205
77
81
  claude_mpm/orchestration/archive/direct_orchestrator.py,sha256=j-IP-st-Xi9Xf33i-BLPZOE_kkxSZxNNuFZmp6MTuZY,7884
@@ -91,16 +95,13 @@ claude_mpm/scripts/ticket.py,sha256=GmFimtTJxc927cCzJvvJH3gvoxXQtAB-W-xnuclcvNs,
91
95
  claude_mpm/services/__init__.py,sha256=-EBm07Lh9mjcofiQHCqyCCQJMLi9akVArPlz8i_kEOo,226
92
96
  claude_mpm/services/agent_deployment.py,sha256=FqxKBaTl2vQqsxN7QZPKIeLmhO-f8VW6maRBmAUNW50,40398
93
97
  claude_mpm/services/agent_lifecycle_manager.py,sha256=VZBVONepomFpMqL7soaXIawS4NoaltFWKed7tU6bS3w,39057
94
- claude_mpm/services/agent_management_service.py,sha256=aotSxiLzRW1VKPGkanFt7hzyPfxLf8LVE6o1EA7X2BY,22875
98
+ claude_mpm/services/agent_management_service.py,sha256=eX5n6w17b9urcogVdr4V-kXcuo7yyjORTrIihjF8PeQ,22853
95
99
  claude_mpm/services/agent_modification_tracker.py,sha256=7FRDXuCNANUnLatCgtBArG-AxZNtKbGQjgCKjnzmJ80,34050
96
- claude_mpm/services/agent_profile_loader.py,sha256=PMcFbK-acIMleB7xoZMMoDX8xq1a2_PdmZ9-R2V41Cw,23148
97
- claude_mpm/services/agent_registry.py,sha256=X8f6ATNtftZBSR9AaTIZenLyRVAegA3PZ9tGoqpS0uw,24446
98
- claude_mpm/services/base_agent_manager.py,sha256=2u3efvWyw_Ki9l7z81eVGwyPpG__j2etRMQUhvOTpAw,15016
100
+ claude_mpm/services/agent_profile_loader.py,sha256=4D1Xj0vgqV8wN7Y3r8lijh7ghy5cVGU5t5s931sVqGc,23133
101
+ claude_mpm/services/agent_registry.py,sha256=vn8CEW0vppj_0EY2NofmNRZEnpV70mlWiX2kAViFDRg,24374
102
+ claude_mpm/services/base_agent_manager.py,sha256=WEcfzdMaFXmXUSoEYEPNeGu8dvqjIv53zyUU0ITrhsM,14987
99
103
  claude_mpm/services/framework_agent_loader.py,sha256=QdRSYRurYF3YbAXJwIGei71BffD5AqOVcV3ktRPdk7g,14018
100
104
  claude_mpm/services/framework_claude_md_generator.py,sha256=3kHmkRLHTex6HFZ4DhbLVQb48j-5dAoy1q6UW1Qf7U8,22914
101
- claude_mpm/services/hook_service.py,sha256=8CMyvlSK_QvZtJqU3rAv3nST3KJLYhe6nTGdEi51mWE,13619
102
- claude_mpm/services/hook_service_manager.py,sha256=QtDwMdC3PAjoO6oZ3Re3FRPoyHujYnNF4akM4eqlM5U,8523
103
- claude_mpm/services/json_rpc_hook_manager.py,sha256=fd8YN460pVv4aI8vCFFsWMXJ2opYphXitCUkLBaqPL8,2981
104
105
  claude_mpm/services/shared_prompt_cache.py,sha256=D04lrRWyg0lHyqGcAHy7IYvRHRKSg6EOpAJwBUPa2wk,29890
105
106
  claude_mpm/services/ticket_manager.py,sha256=Ki11YjBkDax8BFVSaDdOBk3K4VU5gvdbgq9AmCyyoZ0,7454
106
107
  claude_mpm/services/ticket_manager_di.py,sha256=pIsIGncbboKzBYSRQTO7ZX5MuQzV6iFfIflvKe6u1jw,11123
@@ -123,7 +124,7 @@ claude_mpm/services/framework_claude_md_generator/section_generators/header.py,s
123
124
  claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py,sha256=fKdCMvu95m7kXx6SIDzz0d6z9uvOc8EWLCZCwHANNdA,1829
124
125
  claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py,sha256=aYBHykUbsgUz7XYUNR-J3nQjIevFHvUQNBO0L1GqlTw,1468
125
126
  claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py,sha256=eqj2nNXtOZ8KkMyINpkU-JLDfXHY81MpKhf_qmnZdUc,4117
126
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py,sha256=kLgudlwoL0p2pinHnladTP-uQthBao_KmR52duvtYJ4,3963
127
+ claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py,sha256=W6PaLGxCISqFQCku7yCIz-lN81FHZjSq4c2KnnO9AeI,5719
127
128
  claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py,sha256=o0oD7RuBSeLF4S8NCVH9lMLmQWQ57JrAm-j1BeTb0uM,1887
128
129
  claude_mpm/services/parent_directory_manager/README.md,sha256=VEdJXvxsoCA-kuBWJ_t-RZf-jU_oB43_7Inw9V6AFFk,2909
129
130
  claude_mpm/services/parent_directory_manager/__init__.py,sha256=IonvPwRV-JP58qHQGzuLxGHh83pB4SgLTzsRYbejSUQ,22889
@@ -148,12 +149,15 @@ claude_mpm/ui/rich_terminal_ui.py,sha256=gx_9TD0kR4Exq867pHjVVs_b-gw1q267t5oA2ZD
148
149
  claude_mpm/ui/terminal_ui.py,sha256=E_M-L-6EuGp6L8pRpaWEhTqf-ddDXhZp5W85D0XNRPw,11928
149
150
  claude_mpm/utils/__init__.py,sha256=E8Hvv6ykL6rnnc8-YmfoGNpRCZbcIirxcFuNz7YvDIg,346
150
151
  claude_mpm/utils/config_manager.py,sha256=TlekZYIWOz_ouWHQU4Gc-zckhoFK9AqA25b6A_XZdDc,16412
152
+ claude_mpm/utils/error_handler.py,sha256=W_Zc0FrKudpXvxT66Oxx0v8WkR8HA2KlynzzGy3eGcU,8168
151
153
  claude_mpm/utils/import_migration_example.py,sha256=W4a4XH3FY_VBB00BB8Lae2aRPM021PxLHzdUfEs0B5w,2463
152
154
  claude_mpm/utils/imports.py,sha256=wX-SOXUHbemx01MHRGQpVwajzXH6qYdQkYNFCIbb2mw,6851
153
155
  claude_mpm/utils/path_operations.py,sha256=6pLMnAWBVzHkgp6JyQHmHbGD-dWn-nX21yV4E_eT-kM,11614
154
156
  claude_mpm/utils/paths.py,sha256=Xv0SZWdZRkRjN9e6clBcA165ya00GNQxt7SwMz51tfA,10153
155
- claude_mpm-0.3.0.dist-info/METADATA,sha256=GPamifCu72Ep3mYGN47C3BR8BijeR7ojZbkN10O4OSQ,8792
156
- claude_mpm-0.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
157
- claude_mpm-0.3.0.dist-info/entry_points.txt,sha256=PknO31um7d8bt6GjOiVeYpdJpjND0_C1z-LQfY6UfiU,142
158
- claude_mpm-0.3.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
159
- claude_mpm-0.3.0.dist-info/RECORD,,
157
+ claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
158
+ claude_mpm/validation/agent_validator.py,sha256=6Ry2ogyh9-nNlGT6NyK-HIN7-YvKEGJCU-8XT5QdJ4Y,6921
159
+ claude_mpm-1.1.0.dist-info/METADATA,sha256=xkVOC-NAOLEt2M5EVJhQabxT_dC5pPQC3wak-LS9PS0,10207
160
+ claude_mpm-1.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
161
+ claude_mpm-1.1.0.dist-info/entry_points.txt,sha256=PknO31um7d8bt6GjOiVeYpdJpjND0_C1z-LQfY6UfiU,142
162
+ claude_mpm-1.1.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
163
+ claude_mpm-1.1.0.dist-info/RECORD,,
@@ -1,42 +0,0 @@
1
- """Configuration for hook service integration."""
2
-
3
- import os
4
- from pathlib import Path
5
-
6
-
7
- class HookConfig:
8
- """Hook service configuration."""
9
-
10
- # Service settings
11
- DEFAULT_PORT = 8080
12
- PORT_RANGE_START = 8080
13
- PORT_RANGE_END = 8090
14
-
15
- # Timeouts
16
- SERVICE_START_TIMEOUT = 3.0 # seconds
17
- REQUEST_TIMEOUT = 30 # seconds
18
- HEALTH_CHECK_TIMEOUT = 2.0 # seconds
19
-
20
- # Paths
21
- HOOK_SERVICE_LOG_DIR = Path.home() / ".claude-mpm" / "logs"
22
- HOOK_SERVICE_PID_DIR = Path.home() / ".claude-mpm" / "run"
23
-
24
- # Enable/disable hooks by default
25
- HOOKS_ENABLED_BY_DEFAULT = True
26
-
27
- # Hook service endpoints
28
- HEALTH_ENDPOINT = "/health"
29
- SUBMIT_HOOK_ENDPOINT = "/hooks/submit"
30
- PRE_DELEGATION_HOOK_ENDPOINT = "/hooks/pre-delegation"
31
- POST_DELEGATION_HOOK_ENDPOINT = "/hooks/post-delegation"
32
- TICKET_EXTRACTION_HOOK_ENDPOINT = "/hooks/ticket-extraction"
33
-
34
- @classmethod
35
- def get_hook_service_url(cls, port: int) -> str:
36
- """Get the hook service URL for a given port."""
37
- return f"http://localhost:{port}"
38
-
39
- @classmethod
40
- def is_hooks_enabled(cls) -> bool:
41
- """Check if hooks are enabled via environment variable."""
42
- return os.environ.get("CLAUDE_MPM_HOOKS_ENABLED", str(cls.HOOKS_ENABLED_BY_DEFAULT)).lower() in ("true", "1", "yes")
@@ -1,264 +0,0 @@
1
- """Client for interacting with the hook service.
2
-
3
- DEPRECATED: This HTTP-based hook client is deprecated and will be removed in a future release.
4
- Please use the JSON-RPC implementation from claude_mpm.hooks.json_rpc_hook_client instead.
5
- See /docs/hook_system_migration_guide.md for migration instructions.
6
- """
7
-
8
- import json
9
- import logging
10
- import warnings
11
- from typing import Any, Dict, List, Optional
12
- from urllib.parse import urljoin
13
-
14
- import requests
15
- from requests.adapters import HTTPAdapter
16
- from requests.packages.urllib3.util.retry import Retry
17
-
18
- from claude_mpm.hooks.base_hook import HookType
19
- from claude_mpm.core.logger import get_logger
20
-
21
- logger = get_logger(__name__)
22
-
23
-
24
- class HookServiceClient:
25
- """Client for interacting with the centralized hook service.
26
-
27
- DEPRECATED: Use JSONRPCHookClient from claude_mpm.hooks.json_rpc_hook_client instead.
28
- """
29
-
30
- def __init__(self, base_url: str = "http://localhost:5001", timeout: int = 30):
31
- """Initialize hook service client.
32
-
33
- Args:
34
- base_url: Base URL of hook service
35
- timeout: Request timeout in seconds
36
- """
37
- warnings.warn(
38
- "HookServiceClient is deprecated and will be removed in a future release. "
39
- "Please use JSONRPCHookClient from claude_mpm.hooks.json_rpc_hook_client instead. "
40
- "See /docs/hook_system_migration_guide.md for migration instructions.",
41
- DeprecationWarning,
42
- stacklevel=2
43
- )
44
- self.base_url = base_url.rstrip('/')
45
- self.timeout = timeout
46
-
47
- # Setup session with retry logic
48
- self.session = requests.Session()
49
- retry_strategy = Retry(
50
- total=3,
51
- backoff_factor=1,
52
- status_forcelist=[429, 500, 502, 503, 504]
53
- )
54
- adapter = HTTPAdapter(max_retries=retry_strategy)
55
- self.session.mount("http://", adapter)
56
- self.session.mount("https://", adapter)
57
-
58
- def health_check(self) -> Dict[str, Any]:
59
- """Check health of hook service.
60
-
61
- Returns:
62
- Health status dictionary
63
- """
64
- try:
65
- response = self.session.get(
66
- urljoin(self.base_url, '/health'),
67
- timeout=self.timeout
68
- )
69
- response.raise_for_status()
70
- return response.json()
71
- except Exception as e:
72
- logger.error(f"Health check failed: {e}")
73
- return {
74
- 'status': 'unhealthy',
75
- 'error': str(e)
76
- }
77
-
78
- def list_hooks(self) -> Dict[str, List[Dict[str, Any]]]:
79
- """List all registered hooks.
80
-
81
- Returns:
82
- Dictionary mapping hook types to hook info
83
- """
84
- try:
85
- response = self.session.get(
86
- urljoin(self.base_url, '/hooks/list'),
87
- timeout=self.timeout
88
- )
89
- response.raise_for_status()
90
- data = response.json()
91
- return data.get('hooks', {})
92
- except Exception as e:
93
- logger.error(f"Failed to list hooks: {e}")
94
- return {}
95
-
96
- def execute_hook(self, hook_type: HookType, context_data: Dict[str, Any],
97
- metadata: Optional[Dict[str, Any]] = None,
98
- specific_hook: Optional[str] = None) -> List[Dict[str, Any]]:
99
- """Execute hooks of a given type.
100
-
101
- Args:
102
- hook_type: Type of hooks to execute
103
- context_data: Data to pass to hooks
104
- metadata: Optional metadata
105
- specific_hook: Optional specific hook name to execute
106
-
107
- Returns:
108
- List of execution results
109
- """
110
- try:
111
- payload = {
112
- 'hook_type': hook_type.value,
113
- 'context': context_data,
114
- 'metadata': metadata or {}
115
- }
116
-
117
- if specific_hook:
118
- payload['hook_name'] = specific_hook
119
-
120
- response = self.session.post(
121
- urljoin(self.base_url, '/hooks/execute'),
122
- json=payload,
123
- timeout=self.timeout
124
- )
125
- response.raise_for_status()
126
- data = response.json()
127
-
128
- if data.get('status') == 'success':
129
- return data.get('results', [])
130
- else:
131
- logger.error(f"Hook execution failed: {data.get('error')}")
132
- return []
133
-
134
- except Exception as e:
135
- logger.error(f"Failed to execute hooks: {e}")
136
- return []
137
-
138
- def execute_submit_hook(self, prompt: str, **kwargs) -> List[Dict[str, Any]]:
139
- """Execute submit hooks on a user prompt.
140
-
141
- Args:
142
- prompt: User prompt to process
143
- **kwargs: Additional context data
144
-
145
- Returns:
146
- List of execution results
147
- """
148
- context_data = {'prompt': prompt}
149
- context_data.update(kwargs)
150
- return self.execute_hook(HookType.SUBMIT, context_data)
151
-
152
- def execute_pre_delegation_hook(self, agent: str, context: Dict[str, Any],
153
- **kwargs) -> List[Dict[str, Any]]:
154
- """Execute pre-delegation hooks.
155
-
156
- Args:
157
- agent: Agent being delegated to
158
- context: Context being passed to agent
159
- **kwargs: Additional data
160
-
161
- Returns:
162
- List of execution results
163
- """
164
- context_data = {
165
- 'agent': agent,
166
- 'context': context
167
- }
168
- context_data.update(kwargs)
169
- return self.execute_hook(HookType.PRE_DELEGATION, context_data)
170
-
171
- def execute_post_delegation_hook(self, agent: str, result: Any,
172
- **kwargs) -> List[Dict[str, Any]]:
173
- """Execute post-delegation hooks.
174
-
175
- Args:
176
- agent: Agent that was delegated to
177
- result: Result from agent
178
- **kwargs: Additional data
179
-
180
- Returns:
181
- List of execution results
182
- """
183
- context_data = {
184
- 'agent': agent,
185
- 'result': result
186
- }
187
- context_data.update(kwargs)
188
- return self.execute_hook(HookType.POST_DELEGATION, context_data)
189
-
190
- def execute_ticket_extraction_hook(self, content: Any,
191
- **kwargs) -> List[Dict[str, Any]]:
192
- """Execute ticket extraction hooks.
193
-
194
- Args:
195
- content: Content to extract tickets from
196
- **kwargs: Additional data
197
-
198
- Returns:
199
- List of execution results
200
- """
201
- context_data = {'content': content}
202
- context_data.update(kwargs)
203
- return self.execute_hook(HookType.TICKET_EXTRACTION, context_data)
204
-
205
- def get_modified_data(self, results: List[Dict[str, Any]]) -> Dict[str, Any]:
206
- """Extract modified data from hook results.
207
-
208
- Args:
209
- results: Hook execution results
210
-
211
- Returns:
212
- Combined modified data from all hooks
213
- """
214
- modified_data = {}
215
-
216
- for result in results:
217
- if result.get('modified') and result.get('data'):
218
- modified_data.update(result['data'])
219
-
220
- return modified_data
221
-
222
- def get_extracted_tickets(self, results: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
223
- """Extract tickets from hook results.
224
-
225
- Args:
226
- results: Hook execution results
227
-
228
- Returns:
229
- List of extracted tickets
230
- """
231
- all_tickets = []
232
-
233
- for result in results:
234
- if result.get('success') and 'tickets' in result.get('data', {}):
235
- tickets = result['data']['tickets']
236
- if isinstance(tickets, list):
237
- all_tickets.extend(tickets)
238
-
239
- return all_tickets
240
-
241
-
242
- # Convenience function for creating a default client
243
- def get_hook_client(base_url: Optional[str] = None) -> 'JSONRPCHookClient':
244
- """Get a hook client instance.
245
-
246
- DEPRECATED: This function now returns a JSONRPCHookClient for compatibility.
247
- Import directly from claude_mpm.hooks.json_rpc_hook_client instead.
248
-
249
- Args:
250
- base_url: Ignored (kept for backward compatibility)
251
-
252
- Returns:
253
- JSONRPCHookClient instance
254
- """
255
- warnings.warn(
256
- "get_hook_client from hook_client module is deprecated. "
257
- "Import from claude_mpm.hooks.json_rpc_hook_client instead.",
258
- DeprecationWarning,
259
- stacklevel=2
260
- )
261
-
262
- # Import and return JSON-RPC client for compatibility
263
- from claude_mpm.hooks.json_rpc_hook_client import JSONRPCHookClient
264
- return JSONRPCHookClient()