Extensions are packaged in zip files that are extracted as part of the deployment process.
When packaging extensions you need to consider how it will be deployed, how to keep the extensions portable, and minimize the amount of manual work that is required in deployment. In all but the simplest cases you will package several related query and import extensions together in a single package.

Make sure to include the type directory in the package so it can be unzipped in the %PLUGIN_ROOT% directory. Also make sure that the first subdirectory is the target system familiar name to ensure extensions for different target systems don’t accidentally conflict. (By familiar name we mean a name by which the end user would refer to the system).

The directory structure is visible to the user, and we use it to make it easy for the user to navigate.
For query extensions it is suggested to put all extensions directly into the system directory as shown below:

\Query
    \<System>
        \icon.png
        \Read_<EntityA>.pyplugin
        \Read_<EntityA>.py
        \Read_<EntityB>.pyplugin
        \Read_<EntityB>.py

If there is a significant number of query extensions (>20), try to find a way to subdivide them into subfolders:

\Query
    \<System>
        \icon.png
        \Accounting
            \Read_<EntityA>.pyplugin
            \Read_<EntityA>.py
            \Read_<EntityB>.pyplugin
            \Read_<EntityB>.py
            \...
        \TransactionMgmt
            \...
            
Import extensions implementing CUD-behavior it is suggested to create a subdirectory per entity:

\DataProcessing
    \<System>
        \<EntityA>
            \Create_<EntityA>.pyplugin
            \Create_<EntityA>.py
            \Update_<EntityA>.pyplugin
            \Update_<EntityA>.py
            \Delete_<EntityA>.pyplugin
            \Delete_<EntityA>.py
        \<EntityB>
            \Create_<EntityB>.pyplugin
            \Create_<EntityB>.py
            \Update_<EntityB>.pyplugin
            \Update_<EntityB>.py
            \Delete_<EntityB>.pyplugin
            \Delete_<EntityB>.py