claude-mpm 3.7.4__py3-none-any.whl → 3.7.8__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 (48) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/INSTRUCTIONS.md +18 -0
  3. claude_mpm/agents/schema/agent_schema.json +1 -1
  4. claude_mpm/agents/templates/code_analyzer.json +26 -11
  5. claude_mpm/agents/templates/data_engineer.json +3 -6
  6. claude_mpm/agents/templates/documentation.json +2 -2
  7. claude_mpm/agents/templates/engineer.json +1 -1
  8. claude_mpm/agents/templates/ops.json +3 -8
  9. claude_mpm/agents/templates/qa.json +2 -3
  10. claude_mpm/agents/templates/research.json +1 -2
  11. claude_mpm/agents/templates/security.json +2 -5
  12. claude_mpm/agents/templates/ticketing.json +3 -3
  13. claude_mpm/agents/templates/version_control.json +3 -3
  14. claude_mpm/agents/templates/web_qa.json +3 -3
  15. claude_mpm/agents/templates/web_ui.json +3 -3
  16. claude_mpm/cli/commands/agents.py +118 -1
  17. claude_mpm/cli/parser.py +11 -0
  18. claude_mpm/core/framework_loader.py +8 -7
  19. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +46 -2
  20. claude_mpm/dashboard/templates/index.html +5 -5
  21. claude_mpm/services/agents/deployment/agent_deployment.py +5 -1
  22. claude_mpm/services/agents/deployment/async_agent_deployment.py +5 -1
  23. claude_mpm/services/agents/management/agent_capabilities_generator.py +21 -11
  24. claude_mpm/services/ticket_manager.py +207 -44
  25. claude_mpm/utils/agent_dependency_loader.py +66 -15
  26. claude_mpm/utils/robust_installer.py +587 -0
  27. {claude_mpm-3.7.4.dist-info → claude_mpm-3.7.8.dist-info}/METADATA +17 -21
  28. {claude_mpm-3.7.4.dist-info → claude_mpm-3.7.8.dist-info}/RECORD +32 -47
  29. claude_mpm/.claude-mpm/logs/hooks_20250728.log +0 -10
  30. claude_mpm/agents/agent-template.yaml +0 -83
  31. claude_mpm/cli/README.md +0 -108
  32. claude_mpm/cli_module/refactoring_guide.md +0 -253
  33. claude_mpm/config/async_logging_config.yaml +0 -145
  34. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +0 -34
  35. claude_mpm/dashboard/.claude-mpm/memories/README.md +0 -36
  36. claude_mpm/dashboard/README.md +0 -121
  37. claude_mpm/dashboard/static/js/dashboard.js.backup +0 -1973
  38. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +0 -36
  39. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +0 -39
  40. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +0 -38
  41. claude_mpm/hooks/README.md +0 -96
  42. claude_mpm/schemas/agent_schema.json +0 -435
  43. claude_mpm/services/framework_claude_md_generator/README.md +0 -92
  44. claude_mpm/services/version_control/VERSION +0 -1
  45. {claude_mpm-3.7.4.dist-info → claude_mpm-3.7.8.dist-info}/WHEEL +0 -0
  46. {claude_mpm-3.7.4.dist-info → claude_mpm-3.7.8.dist-info}/entry_points.txt +0 -0
  47. {claude_mpm-3.7.4.dist-info → claude_mpm-3.7.8.dist-info}/licenses/LICENSE +0 -0
  48. {claude_mpm-3.7.4.dist-info → claude_mpm-3.7.8.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,14 @@
1
- claude_mpm/VERSION,sha256=ylX16D6J_BLcp6RucFpwigUNg-xKBWf6teZHvDkja3k,6
1
+ claude_mpm/VERSION,sha256=BXhWYSEVQa6g8aUMUQUyDJPjR2fFFYOS2g9Qv5wTxLQ,6
2
2
  claude_mpm/__init__.py,sha256=ix_J0PHZBz37nVBDEYJmLpwnURlWuBKKQ8rK_00TFpk,964
3
3
  claude_mpm/__main__.py,sha256=8IcM9tEbTqSN_er04eKTPX3AGo6qzRiTnPI7KfIf7rw,641
4
4
  claude_mpm/constants.py,sha256=a2fA1SJNEGW9jemlVoFnYoQ673ixAL3YWR4aSBo8os8,4949
5
5
  claude_mpm/deployment_paths.py,sha256=JO7-fhhp_AkVB7ZssggHDBbee-r2sokpkqjoqnQLTmM,9073
6
6
  claude_mpm/init.py,sha256=BFbQspcg74TM15zdghRJ-NHpVpUzB6jfBzrMLXXvgX0,14859
7
7
  claude_mpm/ticket_wrapper.py,sha256=bWjLReYyuHSBguuiRm1d52rHYNHqrPJAOLUbMt4CnuM,836
8
- claude_mpm/.claude-mpm/logs/hooks_20250728.log,sha256=5CAZYZB8sl1mE50SphO3RbdW6E_VVT6YUBCwzN-Y-RI,1244
9
8
  claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=VbIyiYPTpYB4FnhultZjjnlqfKKMcPywchTCVKWqE-s,6205
10
9
  claude_mpm/agents/BASE_PM.md,sha256=SxWPqfmNOV_yB_YK9NwEvj-pfdpjebKVO9233cY4AsI,9553
11
- claude_mpm/agents/INSTRUCTIONS.md,sha256=j_EUFgakltVfEF84pR4Blngr3cqOca6-FVP4r6XB594,10912
10
+ claude_mpm/agents/INSTRUCTIONS.md,sha256=tuIVjgHUjWxLcU3pTpl0vYs-UBQtPOD6YuOSWa5y3x8,11515
12
11
  claude_mpm/agents/__init__.py,sha256=r-p7ervzjLPD7_8dm2tXX_fwvdTZy6KwKA03ofxN3sA,3275
13
- claude_mpm/agents/agent-template.yaml,sha256=koKJn8MCAJx0QNQMHouvIZrwvw5qjPV0U-aV-YVyk6s,2036
14
12
  claude_mpm/agents/agent_loader.py,sha256=DgY0CMShaxdANV5GYT1Bd-lYizRKz89KpuR89VRx9GY,59534
15
13
  claude_mpm/agents/agent_loader_integration.py,sha256=h07Kmk4D75jmHxz5BucP6oQ5VhqVgQ35Sn5w3hcZNYI,7474
16
14
  claude_mpm/agents/agents_metadata.py,sha256=Xju9Yim6XSv2u1J_Swre5VJySbdxxC-9TzpOfXG8ibg,5170
@@ -20,20 +18,20 @@ claude_mpm/agents/base_agent_loader.py,sha256=Ur2pcYQXInS_z8MAD3154rvPn-zEpD2fx6
20
18
  claude_mpm/agents/frontmatter_validator.py,sha256=OR6DWgGxV7b6A6WPAM9ikkDqCJitmp3UgYC45TkB5ZU,22630
21
19
  claude_mpm/agents/system_agent_config.py,sha256=Lke4FFjU0Vq3LLo4O7KvtHxadP7agAwC-ljCXK40h_A,23526
22
20
  claude_mpm/agents/backups/INSTRUCTIONS.md,sha256=tdekngpZ5RjECYZosOaDSBmXPZsVvZcwDQEmmlw7fOQ,14268
23
- claude_mpm/agents/schema/agent_schema.json,sha256=7zuSk4VfBNTlQN33AkfJp0Y1GltlviwengIM0mb7dGg,8741
21
+ claude_mpm/agents/schema/agent_schema.json,sha256=6fqrQUG3sPVX7IKdcP_LYYZeYt3W9NxNBzSG0-XOBCw,8747
24
22
  claude_mpm/agents/templates/__init__.py,sha256=7UyIChghCnkrDctvmCRYr0Wrnn8Oj-eCdgL0KpFy1Mo,2668
25
- claude_mpm/agents/templates/code_analyzer.json,sha256=8_kBi3iq0osk0Zt6r33P8K0EVsGpW_fM0vB_EpetfQM,11206
26
- claude_mpm/agents/templates/data_engineer.json,sha256=2fzNu2gh863WkEPND5DcfaRkVWDtOmILWmWzcM3N9QE,15345
27
- claude_mpm/agents/templates/documentation.json,sha256=bFwv23ZGI9UNQ36E859LxQqPkTsi5wJ3aNC_wrx3y-I,11905
28
- claude_mpm/agents/templates/engineer.json,sha256=Ez7y57JUp0IEVkWYPjKeV9Z4vp_Y-YtuYMu4jr5MONg,16576
29
- claude_mpm/agents/templates/ops.json,sha256=BwtcIMDnYDnW-SWanYyyzXSxqnVF-M-xuBmq55MjMgg,13912
30
- claude_mpm/agents/templates/qa.json,sha256=3T2zSNjsry-ntk9lIiGZeo0OC1m9S-GsHuJgveARDsY,10838
31
- claude_mpm/agents/templates/research.json,sha256=44ZMDnUKoiAHJ8ZBBCLR-GWDRz2PPFMmjkURC48jG9E,15362
32
- claude_mpm/agents/templates/security.json,sha256=Otd3Q4hCOsupFmpaS345fnl2iqLfTnbKlmL-7bOvwJo,12427
33
- claude_mpm/agents/templates/ticketing.json,sha256=20DrLN_9v7M8qSxiYHkf1CTWExPMSXjmnnaQj--EoCI,18347
34
- claude_mpm/agents/templates/version_control.json,sha256=XOKVjsyLuC_ORkNn_jl4ILkFDlo-OmO6M4FN8wj5fiY,11710
35
- claude_mpm/agents/templates/web_qa.json,sha256=McmGb5mHr5ngvQ7oKyeIcdVNkoTjzSd1JlGqtgl1xjU,17620
36
- claude_mpm/agents/templates/web_ui.json,sha256=1yJeA3BBzeZ24Q4IRYSbBwWRe2jiaNf8B86NhVeM-KY,22693
23
+ claude_mpm/agents/templates/code_analyzer.json,sha256=EVW_-TS5CPwUu-VOeZYJaU4mGJI8P47weHUPbl34KA0,17718
24
+ claude_mpm/agents/templates/data_engineer.json,sha256=fdLyaLsV50BvJvny14QYBE-NTyjeR9ocPJqZe83CPOc,15248
25
+ claude_mpm/agents/templates/documentation.json,sha256=FTUb5jwKxw3Lu5LvqwrjmPbovmfyJUPv6476dzV2NMA,11905
26
+ claude_mpm/agents/templates/engineer.json,sha256=fueZXgxAzO6a7-p9oj7hNh6PX6gUoEw-DMjqaAHCrqg,16570
27
+ claude_mpm/agents/templates/ops.json,sha256=Vl_sMZW8gykAQjbfCESm9g25DBuaFAiZZaPhLcYrSYY,13776
28
+ claude_mpm/agents/templates/qa.json,sha256=ypGUn2MPDX1ytD9eMS0RxTAEsbyOfnZIeAE601e3znQ,10807
29
+ claude_mpm/agents/templates/research.json,sha256=UZUnencW3wy1jAAKsZfCdkrPvRBi7IF3qTr3w3mlUdU,15319
30
+ claude_mpm/agents/templates/security.json,sha256=JHmrkiiG0yNqzOOHjC4W8otQESq1PADDJ0nwan2pxb0,12349
31
+ claude_mpm/agents/templates/ticketing.json,sha256=MqOozO-MuotBW_HZSYo2Zl7-C4wKakJtqA0W7Hn7H7Q,23620
32
+ claude_mpm/agents/templates/version_control.json,sha256=_XpmGFWPX8X0GRxypbMiiFyc4QYbOEhu-Q-nBFbZ7PI,11692
33
+ claude_mpm/agents/templates/web_qa.json,sha256=U0wtWk9ysfg_AGUdJHZMAQVfkPSWJy8919SKHWpr2rg,17616
34
+ claude_mpm/agents/templates/web_ui.json,sha256=l0ZnZol99Au6AzySQHpJ5os8OEC2uLeBYurlAmcOODU,22698
37
35
  claude_mpm/agents/templates/.claude-mpm/memories/README.md,sha256=gDuLkzgcELaaoEB5Po70F0qabTu11vBi1PnUrYCK3fw,1098
38
36
  claude_mpm/agents/templates/.claude-mpm/memories/engineer_agent.md,sha256=oX-L8D2oyS-NAoe5UNVTbfmLWYTpp1gYq6dKAm6KxLI,1150
39
37
  claude_mpm/agents/templates/.claude-mpm/memories/qa_agent.md,sha256=3GOmBq3t3y1-mvWC7_lJ4ltsujJ14wCZCSzEVWCIrz8,1065
@@ -47,14 +45,13 @@ claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json,sha256=_FHWnUeh
47
45
  claude_mpm/agents/templates/backup/research_agent_20250726_234551.json,sha256=o4n_sqSbjnsFRELB2q501vgwm-o2tQNLJLYvnVP9LWU,5629
48
46
  claude_mpm/agents/templates/backup/security_agent_20250726_234551.json,sha256=l5YuD-27CxKSOsRLv0bDY_tCZyds0yGbeizLb8paeFY,2322
49
47
  claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json,sha256=too38RPTLJ9HutCMn0nfmEdCj2me241dx5tUYDFtu94,2143
50
- claude_mpm/cli/README.md,sha256=BJhHwcwwrxqM0ZCoIJBPvumb32IL1gd-5RcVe2kYQGY,3370
51
48
  claude_mpm/cli/__init__.py,sha256=5LuZoio9fl5UEWVKblC9r7f60UlsQxY_iHCihagw--I,6985
52
49
  claude_mpm/cli/__main__.py,sha256=vShalycGU13i1-OOixEb_bjl8da4_FolrKdvoiZB-64,769
53
- claude_mpm/cli/parser.py,sha256=mOd9pZYrULJC5lzcDzlyjWVRnYoCoo8JGIZMYgeNjbQ,24508
50
+ claude_mpm/cli/parser.py,sha256=ZtqaWem-WTXmzzLWZlmnheuSZN2s3B6ykjcw-U6Yck0,24826
54
51
  claude_mpm/cli/ticket_cli.py,sha256=Jftgan7t7ZGNWo9zuZoPcw5zItCrVpBjPSOWz3FuIXE,919
55
52
  claude_mpm/cli/utils.py,sha256=qNIbQcA6iE46lsve-GyoIw6eyd9ksHZz3tQA4bSmtt8,6325
56
53
  claude_mpm/cli/commands/__init__.py,sha256=ywtU6fk3ZQEVaDn1pj-rVYadcjCI0-aRkVZjJXq2RtQ,633
57
- claude_mpm/cli/commands/agents.py,sha256=VBK_VVl3FLSrKn7Rd3woRmcIV-YQYvf6PNrIo7Jc4Fw,29202
54
+ claude_mpm/cli/commands/agents.py,sha256=zDmoUxhZVqFtOJc7FInWJWSR2gJz85Or2Dv2-aos0NY,33461
58
55
  claude_mpm/cli/commands/aggregate.py,sha256=rFFIYlOosGnw_DvTuWKw_6sxJeYag3RdACPSz0RHZyE,14869
59
56
  claude_mpm/cli/commands/config.py,sha256=50LzTVlvR1LbeW25i-oSx4D6BZGa48DXuLLGXKhejyk,9919
60
57
  claude_mpm/cli/commands/info.py,sha256=ETL6jC08OTQVTPjs219Y0m3FzfKOUlI0-yI81AI8FXY,2990
@@ -66,10 +63,8 @@ claude_mpm/cli_module/__init__.py,sha256=CkMp4gzWKoZZF_qKyBDi2sQaZw_GLWZYLtKouv-
66
63
  claude_mpm/cli_module/args.py,sha256=nilYpziBsoEySO4W1hQ2MRJyn9TFx3c3TrucyMMhRtk,7970
67
64
  claude_mpm/cli_module/commands.py,sha256=CBNfO-bXrZ0spjeW_7-swprEq5V4PQSc0qhl9SLP5UU,7168
68
65
  claude_mpm/cli_module/migration_example.py,sha256=C-_GbsW8dGzutnNeRLLld74ibDLyAOQx0stdpYZS0hs,6137
69
- claude_mpm/cli_module/refactoring_guide.md,sha256=fl1PGwLZAj4OYWmU0syg1jDd81PqK7rC7rhwgFId5BE,7048
70
66
  claude_mpm/config/__init__.py,sha256=xte4oPG1ubIKhzne1do7slU6FbGebXin_QmyzGRn8c8,1114
71
67
  claude_mpm/config/agent_config.py,sha256=QS-25LSiNz4uOocjIM_FX_SGoRQHJOfkBZCKlz09K5k,13830
72
- claude_mpm/config/async_logging_config.yaml,sha256=SBnTiykFxPpHU5yV-oFeRPAzTP7ewRbdl7dt3PPADds,3805
73
68
  claude_mpm/config/paths.py,sha256=bOxSLNPBDQ3GM4NupY4Z0Jrxykgtw40z92Ytc-LMCuo,9670
74
69
  claude_mpm/config/socketio_config.py,sha256=fSzqleM9EzehWg3U_--0y_zVgXZo7Q45JCI_a2xPs1g,9452
75
70
  claude_mpm/core/__init__.py,sha256=yEiE03zgfISu6rSaLIUJ5vruNhkYrDHN69YeWRlrEIY,1079
@@ -83,7 +78,7 @@ claude_mpm/core/config_aliases.py,sha256=uilRxeIVMY4ZM_I7lnUeR0n4_nmiOpW2jY2_aW4
83
78
  claude_mpm/core/config_paths.py,sha256=SwoB02p7GVw5pnEasC5wPyjfFZKxCsQvQmepRCpm-Es,4971
84
79
  claude_mpm/core/container.py,sha256=P4c4nSo_USSfHTxvpR1sQkVGNsgqozZBN27l3IXqiDc,12216
85
80
  claude_mpm/core/factories.py,sha256=hdC1BwS8gIYXt7NxoJxas3URIPxkWU8FcRbuy31ctB0,6310
86
- claude_mpm/core/framework_loader.py,sha256=6_9PxI5f4kBmC0q_8BZ3OmGvUwoEufqirxZhC14ipDo,26098
81
+ claude_mpm/core/framework_loader.py,sha256=XoCcJoz3LWEoPCmUVV2QIf-HyDmDL7fILdBlXsjc2Cw,26174
87
82
  claude_mpm/core/hook_manager.py,sha256=pVjVTu54FvpzI4F91VWX-hNStTeQelKCUM3qLjE8MhE,7045
88
83
  claude_mpm/core/injectable_service.py,sha256=7fOny9c6x8IJ9hVZmFql1eNDXXB1jcWbsxfTKbMZk74,7497
89
84
  claude_mpm/core/interfaces.py,sha256=TpP474EKEng-1TrjKUsN69qq6dXy8zIjicS7iV-ZPV0,15269
@@ -95,22 +90,18 @@ claude_mpm/core/service_registry.py,sha256=1DnOOWLoDjQJB49YRlV_Ehf6YP79ilPMtHNpS
95
90
  claude_mpm/core/session_manager.py,sha256=D6ZA7bHAgfdkv0nLKjza0FKDng5iqi___IESrb3nSuk,8292
96
91
  claude_mpm/core/socketio_pool.py,sha256=B83uDsmqRF5S0QDwwatyKS-m2SdTvotCVfc3_2uQxd8,22438
97
92
  claude_mpm/core/tool_access_control.py,sha256=htZbDhC8s7D7BVqfmk0BwRrYJnlnUAk8_NeJKOaeNlg,6632
98
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log,sha256=sIDaaPfbtKTAYy6CoS-Tu12J5vRHBmNvXV88HPlP-hI,4210
99
- claude_mpm/dashboard/README.md,sha256=BuaFPsg9QOvxd_TAw9a5OdgaBDg8OUJ8eeBOpqe6LK8,4050
100
93
  claude_mpm/dashboard/index.html,sha256=lXd4WCDn46w9a6edUpGQIy5DtCmiTvDerd1vY97Ule8,451
101
94
  claude_mpm/dashboard/open_dashboard.py,sha256=aXUc6LzUMwmTQMkl_h2jjvICimr-ED4FPMHP_9mnrgQ,1108
102
95
  claude_mpm/dashboard/test_dashboard.html,sha256=Aakmm9O-pWld_CCXLuUBOJC81Ix9D1avytTN93u0zfc,15090
103
- claude_mpm/dashboard/.claude-mpm/memories/README.md,sha256=gDuLkzgcELaaoEB5Po70F0qabTu11vBi1PnUrYCK3fw,1098
104
96
  claude_mpm/dashboard/static/css/dashboard.css,sha256=z2Z9jLWoPsC71gdQQML9D9Dkr54XnpKhcz4jomCKfdY,49692
105
97
  claude_mpm/dashboard/static/js/dashboard-original.js,sha256=MfrEvUbvB-sU67wslVBEYmk2q9d0s2a_u1NWodJNQrc,162374
106
98
  claude_mpm/dashboard/static/js/dashboard.js,sha256=vCRjE6HfxQ4VGqe8sML2_8lX0w6qoaZF0AmWjKVldpM,72056
107
- claude_mpm/dashboard/static/js/dashboard.js.backup,sha256=UNqDPBwzJ1aZAVCxT-FGBY13nF1Q6W2UUUZggNZnOxY,71607
108
99
  claude_mpm/dashboard/static/js/socket-client.js,sha256=hjh-HGAlTpaX0Cr6A7DG75TZjujPFcRQSdw7FrysCWQ,18912
109
100
  claude_mpm/dashboard/static/js/components/agent-inference.js,sha256=xlH3ka8Ev-WybsMp5wAHTQyJzqpht6n3iksmgGO8nfc,27889
110
101
  claude_mpm/dashboard/static/js/components/event-processor.js,sha256=7CsQw1WtKuhV_uj5AaVNMYj6PAAOcT77dxyucBDqs4w,25428
111
102
  claude_mpm/dashboard/static/js/components/event-viewer.js,sha256=kbRtHcsR3ZmMGK2jmTd3MJ1Ga6FkZJ0IQNrdmGoSrMY,32810
112
103
  claude_mpm/dashboard/static/js/components/export-manager.js,sha256=vaBVwLnjzmS_euyeG5Kuq-LHbINcOAcMdibZtgvrUJk,12032
113
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js,sha256=yTshamd2bOVJFl2p6hCg0kpRZxpIpkX4hSrvMOyfIX4,23968
104
+ claude_mpm/dashboard/static/js/components/file-tool-tracker.js,sha256=wFK0gnn_vSIM-6aGfC_kNmLHA4E_l8-68x7AUtM8084,26430
114
105
  claude_mpm/dashboard/static/js/components/hud-library-loader.js,sha256=LDeHIgoSc_ucgWOWgKqXogeKwf9ClGJTBUErLG3SxzE,7289
115
106
  claude_mpm/dashboard/static/js/components/hud-manager.js,sha256=W-mUqEAiR6zIQAoTT-Tz3_OpwnNRg3KjV_3Ujm6LG04,26538
116
107
  claude_mpm/dashboard/static/js/components/hud-visualizer.js,sha256=C78tZ9if-qhxhfUX3-PMezCBSw9apb3Exp_R23ZmU7I,62850
@@ -119,14 +110,10 @@ claude_mpm/dashboard/static/js/components/session-manager.js,sha256=9BkA4NzM_4k9
119
110
  claude_mpm/dashboard/static/js/components/socket-manager.js,sha256=x0mKU7gIpIkfAPVyCY3i6Idy_QbxfW5Pc3vqv4zgSvg,12362
120
111
  claude_mpm/dashboard/static/js/components/ui-state-manager.js,sha256=5Ligdos7L_UTWMtCW34Y7BNh7msdd9ArCr-7Yr9-VS8,12979
121
112
  claude_mpm/dashboard/static/js/components/working-directory.js,sha256=YGyTP0vCaRc9qR7g2d1INShG0-0_X-xkqCW2IF82eXc,33213
122
- claude_mpm/dashboard/templates/index.html,sha256=ONVRsfpsqmvQDuz9d3QTaF2zN08YoQM9kU-Bxri4660,14997
123
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md,sha256=gDuLkzgcELaaoEB5Po70F0qabTu11vBi1PnUrYCK3fw,1098
124
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md,sha256=t8WHtbTdnh9lKJPaHPD-3nynA7kMCogaEGER-orO4bs,1150
125
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md,sha256=tHMYDLOkL06iaiuI0Lt-UK81iJxMaa8APWfgPXc46nw,1091
113
+ claude_mpm/dashboard/templates/index.html,sha256=vsE5vGsG00q-X6_vqtLF2fVCiCRbCNmxt9axUQSK-Sw,15027
126
114
  claude_mpm/experimental/cli_enhancements.py,sha256=-N5f2u9TaxUcOJegUd3lt1FRz5ErEyYUvvgrNmMRL7Q,11814
127
115
  claude_mpm/generators/__init__.py,sha256=l53aBn6kBQSDz3b6bZkMCJBcEmYnV9hHEZq8LKzXgH8,152
128
116
  claude_mpm/generators/agent_profile_generator.py,sha256=2HjOscogSyvrtQj8KwdgNPS6Ym_QvgX1BMeauQZewZA,5751
129
- claude_mpm/hooks/README.md,sha256=wrj5GP0aiPzx0vQrZlE4I1JaQ_JaO_kdQPj7pgfiQKc,3129
130
117
  claude_mpm/hooks/__init__.py,sha256=Y3JJ_mEtvRP07r_gXkju4c0s18bjIXGH1uAbhSw1ES0,166
131
118
  claude_mpm/hooks/base_hook.py,sha256=a4V2EKEG02QQB0h-pnxhZI-fouKBLYbdBLckcaNuf0k,5098
132
119
  claude_mpm/hooks/memory_integration_hook.py,sha256=z0I5R4rsmLx3mzYf7QLeMTYbRShagjS6u3ASyc4XLv0,16311
@@ -138,7 +125,6 @@ claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=JBbedWNs1EHaUsAkmqfPv_tWxV_
138
125
  claude_mpm/models/__init__.py,sha256=vy2NLX2KT9QeH76SjCYh9dOYKPLRgxGrnwkQFAg08gc,465
139
126
  claude_mpm/models/agent_definition.py,sha256=y9XQOED_maOyiYKhNB8H8MfJJMBN0vIYPS_wCXnRJmA,6647
140
127
  claude_mpm/models/agent_session.py,sha256=cBl71q33TIBX8S6U1w2UnKOjEWyypFB04s0BCyKv0iQ,20174
141
- claude_mpm/schemas/agent_schema.json,sha256=T6yRidCHiRbeXYj1MqZJkepiOfUSN9kwNcU28Zqdi_k,13911
142
128
  claude_mpm/scripts/__init__.py,sha256=zKYLZfT0P5z7C7r1YrhsTDnnyFXY-2awxhLVPYx68ek,552
143
129
  claude_mpm/scripts/socketio_daemon.py,sha256=93jzq-h5GQRK-xYpLaovaqNAXtwR_ZqYjmEMmFn0xE8,9741
144
130
  claude_mpm/scripts/start_activity_logging.py,sha256=9xTu6Kd9lmCx17vMmoAGRXegoaZIVqLzLJoXQDeZ9Yw,2917
@@ -158,21 +144,21 @@ claude_mpm/services/response_tracker.py,sha256=QdktFGGuV653WYnDKbEiiGXfb_B8zVjRB
158
144
  claude_mpm/services/socketio_client_manager.py,sha256=2Ly63iiGA_BUzf73UwQDu9Q75wA1C4O1CWFv8hi8bms,18074
159
145
  claude_mpm/services/socketio_server.py,sha256=E1i_YrUFa7AKdxfKgNkC0daUzytA8qiHRJxD_JRcXPk,84929
160
146
  claude_mpm/services/standalone_socketio_server.py,sha256=TfdtwdtlKA6cZyTon9O7zkSeu0H-1HpW0te7vu1r3o0,55214
161
- claude_mpm/services/ticket_manager.py,sha256=Ki11YjBkDax8BFVSaDdOBk3K4VU5gvdbgq9AmCyyoZ0,7454
147
+ claude_mpm/services/ticket_manager.py,sha256=qXdNd5_ihIANZnXAnB6h2IHaizinrbby40DVRG3F4wE,16667
162
148
  claude_mpm/services/ticket_manager_di.py,sha256=pIsIGncbboKzBYSRQTO7ZX5MuQzV6iFfIflvKe6u1jw,11123
163
149
  claude_mpm/services/ticketing_service_original.py,sha256=_GbPCPuIAlfxQGfmHN-LQ6sjuDk00eNdY7rlS4qhjI4,16745
164
150
  claude_mpm/services/agents/__init__.py,sha256=F5yJSTruNz0qiI2--oJIBO5-LoGQ6wXHvbt1sk-eVLU,2224
165
151
  claude_mpm/services/agents/deployment/__init__.py,sha256=PhQQ108KP9RoxLLh_8aoPIjmwJau3az_10cEoPDm7DQ,538
166
- claude_mpm/services/agents/deployment/agent_deployment.py,sha256=H9uSYzo7f0Xk9gqLa6pr0nH9rNqtqqmHiF5j38YsUYk,100930
152
+ claude_mpm/services/agents/deployment/agent_deployment.py,sha256=3hnVugOSGlUyyWVPE9g9ZyOwj8fM4NBgboAPSsQJWck,101181
167
153
  claude_mpm/services/agents/deployment/agent_lifecycle_manager.py,sha256=b7guIDwEiJNRWtaRx1PwusqZX5QCnXqq-tl5AQOFp7Y,50136
168
154
  claude_mpm/services/agents/deployment/agent_versioning.py,sha256=y4SiKGKdTn-9_Ht6nGlmKGJW6MLgEHZUy5SR1OPTZZM,1108
169
- claude_mpm/services/agents/deployment/async_agent_deployment.py,sha256=x7ufcxEd3cBN7l1L2Z7lmq_OhPoknKS4_Rv1FZ7U-Uc,24015
155
+ claude_mpm/services/agents/deployment/async_agent_deployment.py,sha256=adD0XfNnxmHpTYRU9Ud4osmGvkp02ZQc8xELs-poxMM,24266
170
156
  claude_mpm/services/agents/loading/__init__.py,sha256=NN4JGAH7nsoY7qTW-jIBKOJPpLJVcD4P6S2Vmdd7QH8,305
171
157
  claude_mpm/services/agents/loading/agent_profile_loader.py,sha256=2L_KIBk-ltt0lWQ5MzZE2JTdYxj4m8Rc7aeLoAiCp4k,25741
172
158
  claude_mpm/services/agents/loading/base_agent_manager.py,sha256=y_MKtqReD5h70BpCTO4JbkcSUIxCsdzYaHyLMbdNLYU,15028
173
159
  claude_mpm/services/agents/loading/framework_agent_loader.py,sha256=fyP54zrNxv-Xe8hRMInTnltaMtFgmRuCfMbaArPlkmc,17560
174
160
  claude_mpm/services/agents/management/__init__.py,sha256=ZZm0jEdso59S72fw4O8jnU1iGWfDN68nWdXe9APvi8U,233
175
- claude_mpm/services/agents/management/agent_capabilities_generator.py,sha256=hWG0zV2InmzrDMxSbQzjVBBTzEaxg0bFxl8tmTMJ8qA,6565
161
+ claude_mpm/services/agents/management/agent_capabilities_generator.py,sha256=Q6oS7vHFnqhegpi8NuDRe8egL34Nan5ssh_HxLRW1ic,7075
176
162
  claude_mpm/services/agents/management/agent_management_service.py,sha256=OKU6dxxR1x53I9eimlJPMUDV9Hbc-Urw5gerCvM1nEk,23053
177
163
  claude_mpm/services/agents/memory/__init__.py,sha256=IzY-iU93_v9HBCHZ0UaSYkdLWXobFRLcjdJXd6iAuFY,455
178
164
  claude_mpm/services/agents/memory/agent_memory_manager.py,sha256=8JIcNEdmofEiWyVqX3SG5s--hQVAcVRj142YB9asvjU,58846
@@ -181,7 +167,6 @@ claude_mpm/services/agents/registry/__init__.py,sha256=_NsxGhhykoj0NecfA4o8Xscrv
181
167
  claude_mpm/services/agents/registry/agent_registry.py,sha256=jb-hIDGAoLWqBauS49N5Iin-nSozspGgUtb-gAROCfc,31570
182
168
  claude_mpm/services/agents/registry/deployed_agent_discovery.py,sha256=EFsrutLB3Kxa5TXoQC2aVNx5cMIAaDcTqCBnF1FfrPc,9762
183
169
  claude_mpm/services/agents/registry/modification_tracker.py,sha256=efkl652bAHhxUc6keoE2dOxlaQXtDnC3lkmR_jat4u4,34565
184
- claude_mpm/services/framework_claude_md_generator/README.md,sha256=_-ty72t2afPagDVVUEizPkhs4BYkCeqCnZDNPgZAYtY,3511
185
170
  claude_mpm/services/framework_claude_md_generator/__init__.py,sha256=OtnwxLiJektfFtsKdkHM1X27rKkFiNd_rcf4843ziKw,7334
186
171
  claude_mpm/services/framework_claude_md_generator/content_assembler.py,sha256=DNMVz6Jvy7bxxa8WNL2h-JwrK89bJpuxXEI5xD1i8mY,6570
187
172
  claude_mpm/services/framework_claude_md_generator/content_validator.py,sha256=89QSGil9_NL15ci3HsVVQmfg7MZvsJS3i_ELP5yD-gA,4583
@@ -208,14 +193,13 @@ claude_mpm/services/memory/router.py,sha256=ECQQ1v0BsMFQ4RXqpKfc9fwAXpzx5Kk0QlmJ
208
193
  claude_mpm/services/memory/cache/__init__.py,sha256=FBff6fkrJWuWbQjQ4MoOxQa6ybRVBeH29hQC2XP0DEU,350
209
194
  claude_mpm/services/memory/cache/shared_prompt_cache.py,sha256=bw1FDXM6iMuVfFxx_RNlIFZfiGC10p18Npwk-IGFCJ0,29899
210
195
  claude_mpm/services/memory/cache/simple_cache.py,sha256=eVJq7mD4fn-EfRaLgKJxP65rqQrup-AqB-Cf7EFYy58,10480
211
- claude_mpm/services/version_control/VERSION,sha256=MMmeixA-rL5vbW4bVLBsptXzFktPUAlDNKUXrpXKj7o,5
212
196
  claude_mpm/services/version_control/__init__.py,sha256=5BFbqFUMtpCyDbMcekRjCQ4jgBAJI50PhfuZ8S5NTjk,1513
213
197
  claude_mpm/services/version_control/branch_strategy.py,sha256=xOLeNcu0AtpgIRmNkew-fNvXVcGHRuAe6MqOyyS36HQ,23068
214
198
  claude_mpm/services/version_control/conflict_resolution.py,sha256=yWa9fzmkds1U0EBw-LyTZvlj56MpEEsRmryLQg4KDdU,26084
215
199
  claude_mpm/services/version_control/git_operations.py,sha256=197Cmk_cLzSVzqNPQHKvsTGncWXEI3F5OOCmo4sWgTg,28422
216
200
  claude_mpm/services/version_control/semantic_versioning.py,sha256=xiDsirwq8CApnOBc4UMf4VcrgolzQgfK2T_Yi3mY7Bk,29039
217
201
  claude_mpm/utils/__init__.py,sha256=E8Hvv6ykL6rnnc8-YmfoGNpRCZbcIirxcFuNz7YvDIg,346
218
- claude_mpm/utils/agent_dependency_loader.py,sha256=1nQdHKRs8f-DvdCP8x9na6lZAejH1iLpvu6Yjn07Tvc,25885
202
+ claude_mpm/utils/agent_dependency_loader.py,sha256=AWLDapjGZNHoRBJVCqR6iTK2-P71tEtPitFKKSmMLl4,28281
219
203
  claude_mpm/utils/config_manager.py,sha256=TlekZYIWOz_ouWHQU4Gc-zckhoFK9AqA25b6A_XZdDc,16412
220
204
  claude_mpm/utils/console.py,sha256=5mBwhNU5p9fIveIbbdzuttJw182wv_VaAfe11iGFyTA,278
221
205
  claude_mpm/utils/dependency_cache.py,sha256=gecpOA0BZYNiowUiAWNMTgPOoSJb9wvIivs7-mnLaCc,12351
@@ -228,12 +212,13 @@ claude_mpm/utils/import_migration_example.py,sha256=W4a4XH3FY_VBB00BB8Lae2aRPM02
228
212
  claude_mpm/utils/imports.py,sha256=wX-SOXUHbemx01MHRGQpVwajzXH6qYdQkYNFCIbb2mw,6851
229
213
  claude_mpm/utils/path_operations.py,sha256=6pLMnAWBVzHkgp6JyQHmHbGD-dWn-nX21yV4E_eT-kM,11614
230
214
  claude_mpm/utils/paths.py,sha256=DlkYrIVvfgyuF9cN01cWuxehK0UUsCfjp6ymrv8XY7A,10253
215
+ claude_mpm/utils/robust_installer.py,sha256=5-iW4Qpba4DBitx5Ie3uoUJgXBpbvuLUJ_uNGgOxwi4,19855
231
216
  claude_mpm/utils/session_logging.py,sha256=9G0AzB7V0WkhLQlN0ocqbyDv0ifooEsJ5UPXIhA-wt0,3022
232
217
  claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
233
218
  claude_mpm/validation/agent_validator.py,sha256=Jy7Oi7GVM7jqFYLVFDQ9pKYXsXH2KEf5uorflIwWGC4,20348
234
- claude_mpm-3.7.4.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
235
- claude_mpm-3.7.4.dist-info/METADATA,sha256=IRP1UaR6GX8kgr57FROQGDJdE2FtwSqa6wTb416ZbkA,11384
236
- claude_mpm-3.7.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
237
- claude_mpm-3.7.4.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
238
- claude_mpm-3.7.4.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
239
- claude_mpm-3.7.4.dist-info/RECORD,,
219
+ claude_mpm-3.7.8.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
220
+ claude_mpm-3.7.8.dist-info/METADATA,sha256=WGPPOTOFRvLJZTz4tzrQc5Qwu6eRSihALdvE3YgDNAQ,11419
221
+ claude_mpm-3.7.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
222
+ claude_mpm-3.7.8.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
223
+ claude_mpm-3.7.8.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
224
+ claude_mpm-3.7.8.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- 2025-07-28 09:57:00,914 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:231 - Claude Code hook event: PostToolUse (session: 9a641bea)
2
- 2025-07-28 09:57:00,914 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:254 - PostToolUse: Bash (exit code: N/A)
3
- 2025-07-28 09:57:09,289 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:231 - Claude Code hook event: PreToolUse (session: 9a641bea)
4
- 2025-07-28 09:57:09,290 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:247 - PreToolUse: Bash
5
- 2025-07-28 09:57:21,601 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:231 - Claude Code hook event: PreToolUse (session: 9a641bea)
6
- 2025-07-28 09:57:21,601 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:247 - PreToolUse: LS
7
- 2025-07-28 09:57:25,939 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:231 - Claude Code hook event: PostToolUse (session: 9a641bea)
8
- 2025-07-28 09:57:25,939 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:254 - PostToolUse: LS (exit code: N/A)
9
- 2025-07-28 09:57:35,668 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:231 - Claude Code hook event: PreToolUse (session: 9a641bea)
10
- 2025-07-28 09:57:35,668 - claude_mpm_hooks_claude_mpm - INFO - hook_handler.py:247 - PreToolUse: Bash
@@ -1,83 +0,0 @@
1
- # Agent Profile Template Configuration
2
- # Inspired by awesome-claude-code's template system
3
-
4
- profile:
5
- name: "{{AGENT_NAME}}"
6
- version: "{{VERSION}}"
7
- description: "{{DESCRIPTION}}"
8
- author: "{{AUTHOR}}"
9
- created: "{{CREATED_DATE}}"
10
-
11
- # Categories for organizing agents
12
- categories:
13
- - id: analysis
14
- title: "Code Analysis Agents"
15
- description: |
16
- > Agents specialized in analyzing codebases, identifying patterns, and providing insights
17
- icon: "🔍"
18
-
19
- - id: implementation
20
- title: "Implementation Agents"
21
- description: |
22
- > Agents focused on writing and modifying code
23
- icon: "🛠️"
24
-
25
- - id: testing
26
- title: "Testing & QA Agents"
27
- description: |
28
- > Agents dedicated to testing, quality assurance, and validation
29
- icon: "🧪"
30
-
31
- - id: security
32
- title: "Security Agents"
33
- description: |
34
- > Agents specialized in security analysis and vulnerability detection
35
- icon: "🔒"
36
-
37
- agents:
38
- - name: "{{AGENT_ID}}"
39
- category: "{{CATEGORY}}"
40
- role: "{{ROLE}}"
41
- description: "{{AGENT_DESCRIPTION}}"
42
-
43
- capabilities:
44
- - "{{CAPABILITY_1}}"
45
- - "{{CAPABILITY_2}}"
46
- - "{{CAPABILITY_3}}"
47
-
48
- constraints:
49
- - "{{CONSTRAINT_1}}"
50
- - "{{CONSTRAINT_2}}"
51
-
52
- tools:
53
- - name: "{{TOOL_NAME}}"
54
- description: "{{TOOL_DESCRIPTION}}"
55
- required: true
56
-
57
- prompt_template: |
58
- You are a {{ROLE}} agent specializing in {{SPECIALIZATION}}.
59
-
60
- ## Your Capabilities:
61
- {{CAPABILITIES_LIST}}
62
-
63
- ## Your Constraints:
64
- {{CONSTRAINTS_LIST}}
65
-
66
- ## Context:
67
- {context}
68
-
69
- ## Task:
70
- {task}
71
-
72
- ## Additional Instructions:
73
- {{ADDITIONAL_INSTRUCTIONS}}
74
-
75
- examples:
76
- - scenario: "{{EXAMPLE_SCENARIO}}"
77
- input: "{{EXAMPLE_INPUT}}"
78
- expected_output: "{{EXAMPLE_OUTPUT}}"
79
-
80
- best_practices:
81
- - "{{BEST_PRACTICE_1}}"
82
- - "{{BEST_PRACTICE_2}}"
83
- - "{{BEST_PRACTICE_3}}"
claude_mpm/cli/README.md DELETED
@@ -1,108 +0,0 @@
1
- # Claude MPM CLI Architecture
2
-
3
- This document describes the refactored CLI architecture for claude-mpm.
4
-
5
- ## Overview
6
-
7
- The CLI has been refactored from a single monolithic `cli.py` file into a modular structure that improves maintainability and code organization.
8
-
9
- ## Directory Structure
10
-
11
- ```
12
- cli/
13
- ├── __init__.py # Main entry point - orchestrates the CLI flow
14
- ├── parser.py # Argument parsing logic - single source of truth for CLI arguments
15
- ├── utils.py # Shared utility functions
16
- ├── commands/ # Individual command implementations
17
- │ ├── __init__.py
18
- │ ├── run.py # Default command - runs Claude sessions
19
- │ ├── tickets.py # Lists tickets
20
- │ ├── info.py # Shows system information
21
- │ └── agents.py # Manages agent deployments
22
- └── README.md # This file
23
- ```
24
-
25
- ## Key Design Decisions
26
-
27
- ### 1. Modular Command Structure
28
- Each command is implemented in its own module under `commands/`. This makes it easy to:
29
- - Add new commands without touching existing code
30
- - Test commands in isolation
31
- - Understand what each command does
32
-
33
- ### 2. Centralized Argument Parsing
34
- All argument definitions are in `parser.py`. This provides:
35
- - Single source of truth for CLI arguments
36
- - Reusable argument groups (common arguments, run arguments)
37
- - Clear separation of parsing from execution
38
-
39
- ### 3. Shared Utilities
40
- Common functions are in `utils.py`:
41
- - `get_user_input()` - Handles input from files, stdin, or command line
42
- - `get_agent_versions_display()` - Formats agent version information
43
- - `setup_logging()` - Configures logging based on arguments
44
- - `ensure_directories()` - Creates required directories on first run
45
-
46
- ### 4. Backward Compatibility
47
- The refactoring maintains full backward compatibility:
48
- - `__main__.py` still imports from `claude_mpm.cli`
49
- - The main `cli/__init__.py` exports the same `main()` function
50
- - All existing commands and arguments work exactly as before
51
-
52
- ## Entry Points
53
-
54
- 1. **Package execution**: `python -m claude_mpm`
55
- - Uses `__main__.py` which imports from `cli/__init__.py`
56
-
57
- 2. **Direct import**: `from claude_mpm.cli import main`
58
- - Imports the main function from `cli/__init__.py`
59
-
60
- 3. **Shell script**: `claude-mpm` command
61
- - Calls `python -m claude_mpm` with proper environment setup
62
-
63
- ## Adding New Commands
64
-
65
- To add a new command:
66
-
67
- 1. Create a new module in `commands/`:
68
- ```python
69
- # commands/mycommand.py
70
- def my_command(args):
71
- """Execute my command."""
72
- # Implementation here
73
- ```
74
-
75
- 2. Add the command to `commands/__init__.py`:
76
- ```python
77
- from .mycommand import my_command
78
- ```
79
-
80
- 3. Add parser configuration in `parser.py`:
81
- ```python
82
- # In create_parser()
83
- mycommand_parser = subparsers.add_parser(
84
- "mycommand",
85
- help="Description of my command"
86
- )
87
- # Add command-specific arguments
88
- ```
89
-
90
- 4. Add the command mapping in `cli/__init__.py`:
91
- ```python
92
- # In _execute_command()
93
- command_map = {
94
- # ... existing commands ...
95
- "mycommand": my_command,
96
- }
97
- ```
98
-
99
- ## Removed Files
100
-
101
- - `cli_main.py` - Redundant entry point, functionality moved to `__main__.py`
102
- - Original `cli.py` - Split into the modular structure described above
103
-
104
- ## Preserved Files
105
-
106
- - `cli_enhancements.py` - Experimental Click-based CLI with enhanced features
107
- - Kept for reference and future enhancement ideas
108
- - Not currently used in production
@@ -1,253 +0,0 @@
1
- # CLI Refactoring Guide
2
-
3
- This guide shows how to refactor the main() function in `/src/claude_mpm/cli.py` to reduce complexity from 16 to under 10.
4
-
5
- ## Current Issues
6
-
7
- 1. **High Cyclomatic Complexity (16)**
8
- - Multiple nested conditionals
9
- - Duplicate argument definitions
10
- - Mixed concerns in one function
11
-
12
- 2. **Code Duplication**
13
- - Arguments defined twice (global level + run subcommand)
14
- - Similar patterns repeated for each command
15
-
16
- 3. **Poor Maintainability**
17
- - Adding new commands requires multiple changes
18
- - Hard to test individual components
19
-
20
- ## Refactoring Steps
21
-
22
- ### Step 1: Update imports in cli.py
23
-
24
- ```python
25
- # Add to imports
26
- from .cli import ArgumentRegistry, CommandRegistry, register_standard_commands
27
- ```
28
-
29
- ### Step 2: Replace main() function
30
-
31
- Replace the entire `main()` function with:
32
-
33
- ```python
34
- def main(argv: Optional[list] = None):
35
- """Main CLI entry point with reduced complexity."""
36
- # Initialize registries
37
- arg_registry = ArgumentRegistry()
38
- cmd_registry = CommandRegistry(arg_registry)
39
-
40
- # Register standard commands
41
- register_standard_commands(cmd_registry)
42
-
43
- # Create parser
44
- parser = argparse.ArgumentParser(
45
- prog="claude-mpm",
46
- description=f"Claude Multi-Agent Project Manager v{__version__}",
47
- epilog="By default, runs an orchestrated Claude session."
48
- )
49
-
50
- # Store version for ArgumentRegistry
51
- parser._version = f"claude-mpm {__version__}"
52
-
53
- # Apply global arguments
54
- arg_registry.apply_arguments(parser, groups=['global'])
55
-
56
- # Apply run arguments at top level (for default behavior)
57
- arg_registry.apply_arguments(parser, groups=['run'], exclude=['no_hooks'])
58
-
59
- # Set up subcommands
60
- cmd_registry.setup_subcommands(parser)
61
-
62
- # Parse arguments
63
- args = parser.parse_args(argv)
64
-
65
- # Set up logging
66
- _setup_logging(args)
67
-
68
- # Initialize hook service
69
- hook_manager = _initialize_hook_service(args)
70
-
71
- try:
72
- # Execute command
73
- result = cmd_registry.execute_command(args, hook_manager=hook_manager)
74
- if result is None and not args.command:
75
- parser.print_help()
76
- return 1
77
- return result or 0
78
-
79
- except KeyboardInterrupt:
80
- get_logger("cli").info("Session interrupted by user")
81
- return 0
82
- except Exception as e:
83
- logger = get_logger("cli")
84
- logger.error(f"Error: {e}")
85
- if args.debug:
86
- import traceback
87
- traceback.print_exc()
88
- return 1
89
- finally:
90
- if hook_manager:
91
- hook_manager.stop_service()
92
- ```
93
-
94
- ### Step 3: Extract helper functions
95
-
96
- Add these helper functions after main():
97
-
98
- ```python
99
- def _setup_logging(args):
100
- """Set up logging based on arguments."""
101
- if args.debug and args.logging == "OFF":
102
- args.logging = "DEBUG"
103
-
104
- if args.logging != "OFF":
105
- setup_logging(level=args.logging, log_dir=args.log_dir)
106
- else:
107
- import logging
108
- logger = logging.getLogger("cli")
109
- logger.setLevel(logging.WARNING)
110
-
111
-
112
- def _initialize_hook_service(args):
113
- """Initialize hook service if enabled."""
114
- if getattr(args, 'no_hooks', False):
115
- return None
116
-
117
- try:
118
- from .config.hook_config import HookConfig
119
-
120
- if not HookConfig.is_hooks_enabled():
121
- get_logger("cli").info("Hooks disabled via configuration")
122
- return None
123
-
124
- hook_manager = HookServiceManager(log_dir=args.log_dir)
125
- if hook_manager.start_service():
126
- logger = get_logger("cli")
127
- logger.info(f"Hook service started on port {hook_manager.port}")
128
- print(f"Hook service started on port {hook_manager.port}")
129
- return hook_manager
130
- else:
131
- logger = get_logger("cli")
132
- logger.warning("Failed to start hook service")
133
- print("Failed to start hook service, continuing without hooks")
134
- return None
135
-
136
- except Exception as e:
137
- get_logger("cli").warning(f"Hook service init failed: {e}")
138
- return None
139
- ```
140
-
141
- ### Step 4: Update command handler signatures
142
-
143
- Ensure all command handlers accept `**kwargs`:
144
-
145
- ```python
146
- def run_session(args, hook_manager=None, **kwargs):
147
- """Run an orchestrated Claude session."""
148
- # ... existing implementation
149
-
150
- def list_tickets(args, **kwargs):
151
- """List recent tickets."""
152
- # ... existing implementation
153
-
154
- def show_info(args, hook_manager=None, **kwargs):
155
- """Show framework and configuration information."""
156
- # ... existing implementation
157
- ```
158
-
159
- ## Benefits Achieved
160
-
161
- ### Complexity Reduction
162
- - **Before**: Cyclomatic complexity of 16
163
- - **After**: Cyclomatic complexity of ~8
164
-
165
- ### Code Organization
166
- - Centralized argument definitions
167
- - No duplicate argument definitions
168
- - Clear separation of concerns
169
- - Easier to add new commands
170
-
171
- ### Maintainability
172
- - New commands can be added with a single `register()` call
173
- - Arguments are defined once and reused
174
- - Helper functions are testable in isolation
175
- - Registry pattern allows for extension
176
-
177
- ## Adding New Commands
178
-
179
- With the registry system, adding a new command is simple:
180
-
181
- ```python
182
- # In your code or plugin
183
- def my_command(args, **kwargs):
184
- """Implementation of your command."""
185
- print(f"Running my command with args: {args}")
186
- return 0
187
-
188
- # Register it
189
- cmd_registry.register(
190
- name='mycommand',
191
- help_text='Description of my command',
192
- handler=my_command,
193
- argument_groups=['framework'], # Reuse existing argument groups
194
- extra_args={
195
- 'custom_arg': {
196
- 'flags': ['--custom'],
197
- 'type': str,
198
- 'help': 'A custom argument for this command'
199
- }
200
- }
201
- )
202
- ```
203
-
204
- ## Testing
205
-
206
- The refactored code is easier to test:
207
-
208
- ```python
209
- # Test argument registry
210
- def test_argument_registry():
211
- registry = ArgumentRegistry()
212
- parser = argparse.ArgumentParser()
213
- registry.apply_arguments(parser, groups=['logging'])
214
-
215
- # Verify logging arguments were added
216
- args = parser.parse_args(['--logging', 'DEBUG'])
217
- assert args.logging == 'DEBUG'
218
-
219
- # Test command registry
220
- def test_command_registry():
221
- arg_reg = ArgumentRegistry()
222
- cmd_reg = CommandRegistry(arg_reg)
223
-
224
- called = False
225
- def test_handler(args, **kwargs):
226
- nonlocal called
227
- called = True
228
- return 0
229
-
230
- cmd_reg.register('test', 'Test command', test_handler)
231
-
232
- parser = argparse.ArgumentParser()
233
- cmd_reg.setup_subcommands(parser)
234
-
235
- args = parser.parse_args(['test'])
236
- result = cmd_reg.execute_command(args)
237
-
238
- assert called
239
- assert result == 0
240
- ```
241
-
242
- ## Migration Checklist
243
-
244
- - [ ] Create `/src/claude_mpm/cli/` directory
245
- - [ ] Create `args.py` with ArgumentRegistry
246
- - [ ] Create `commands.py` with CommandRegistry
247
- - [ ] Create `__init__.py` to export classes
248
- - [ ] Update imports in `cli.py`
249
- - [ ] Replace main() function
250
- - [ ] Add helper functions
251
- - [ ] Update command handler signatures
252
- - [ ] Test the refactored CLI
253
- - [ ] Verify complexity is reduced to ≤10