These were represented a protocol in the original proposal so that implementations could choose the most suitable way of representing them — clients that just use the API shouldn't necessarily need to know how it was implemented.
But it's a good point that making them structs would make it clear that this isn't something that clients should implement. This proposed amendment to use @main doesn't touch this part of the original, but it may be appropriate to extend it to address this as well.
This was modeled on some of the existing types such as Target and Product which are classes with static constructors that make them look similar to enums. But it's a good point that it should at least be a struct instead of a class.
More broadly, since it seems that enums can now (as of Swift 5.1) have default values for any parameters, these types in PackageDescription could now be enums as well.
This was to be consistent with some of the existing APis in PackageDescription, but it's a good point that this could do better as an enum, especially now that enum cases can have individual availability annotations (which wasn't true at the time PackageDescription was created).
I agree, and will update this part of the suggested amendment.
The proposed amendment doesn't change this part of the proposal, but I see the point. If the amendment can be broadened then I think that suggestion make sense.
It reads a little awkwardly but the idea was to capture not just a configuration or a plugin but specifically the intent to use the plugin for that target. I'm concerned that Plugin here wouldn't be specific enough, since that's also the name for defining a plugin, and to me at least, PluginConfiguration doesn't strongly enough suggest that this indicates the use of a particular plugin. But I agree that PluginUsage is a bit awkward.
Makes sense. On the one hand, this is another case that this proposed amendment to adopt @main doesn't touch, but on the other hand, it would be good to refine the API before it has real use.