In technical implementation it depends on ability to take one reference (say, J2) and find the corresponding references in the other channels (say, J4,6,8,10). You, the end user, modify one channel (the footprints around J2). Then you just select that footprint and tell the plugin to update other channels. The code takes the corresponding footprints in the channels as location anchors. Placements and rotations are kept, the other footprints of the hierachical sheet are moved relatively.
In this way the initial placement in row or circle isn’t necessarily needed in the plugin - the users can place the anchor footprints however they want first and then apply the relative modifications.
To take care of several groups the user could select the channels to which the changes are applied. For example there’s the master anchor footprint J2, then there’s list J4,6,8,10 (in the UI a list view with tick boxes). The user can select J6 and J10 to be updated and leave off 4 and 8. For the other group the user would modify the components around J4, would select it as the master anchor, then select J8 to be updated.
This is the minimal functionality. There’s no need to save anything. Notice that the choice of the “anchor footprint” isn’t fixed; the user can modify the positions and select another footprint as the anchor for the next update.
A bit more complex scenario is that the user can select several items amongst which the anchor would be seleced. Unfortunately the python API, AFAIK, doesn’t let the user use the context menu or interact with the board so that the footprint on which the menu would be called would be selected as the anchor. Now, if there are several items in the selection, the end user must select the anchor footprint from a list of the selected items. This would allow partial updates (e.g. one component is in different location in every channel and isn’t moved because it’s not selected).
The same complex scenario could be applied to all other board items, I think. The only requirement is that the anchor footprint can be chosen at the same time. The other items (which don’t belong to the schematic - tracks, zones, even graphics) would be copied and positioned relative to that. In my opinion there would be no need to know what those items are.
For the non-footprint items knowing what to keep or delete is a problem, but if I have understood correctly you have solved that by deleting everything from the bounding box, then pasting the new design. That would probably work in this case, too.