Composer предоставляет отличную возможность - собственные приватные репозитории, это когда исходники ваших наработок (библиотек/фреймворков) лежат в ваших приватных не публичных github|gitlab репах но при этом выглядят как полноценные composer пакеты. Подробнее про приватные репы - читайте тут (там же я картинку взял).

И тут возникает проблема - вы хотите простой доступ к своему коду для разработчиков и при этом ограничить заказчика кодом который нужен ему и не давать доступа к будущим версиям ваших наработок.

Лайфхак простой и элегантный - доступ к гиту по ключам, вам нужно ограничить доступ к репе кода ключем, прописать это ключ в composer.json и добавить его в .gitignore. Также в гит положить код вашего фреймворка/библиотеки из vendor

composer.json

{
  "repositories"[
  {
      "type""composer",
      "url""https://privcomposer.corp.com",
      "options"{
         "ssh2"{
           "username""git",
              "pubkey_file""./.ssh/id_rsa.pub",
              "privkey_file""./.ssh/id_rsa"
          }
      }
   }

.gitignore

/.ssh/*
/vendor/
!/vendor/corp.com/

Нюанс, если в разработке применяется наш расширенный Docker рецепт - ключ нужно прописывать в app контейнере:

RUN mkdir -p /root/.ssh
ADD .ssh/id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config
RUN echo "Host privcomposer.corp.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

Автодеплой при наличии ключей в папке естественно проходит как должен, при этом заказчик на своем сервере получает код приложения, все депенденсы и ваш проприетарный код конкретной версии БЕЗ доступа к самому репозиторию

Это самый простой вариант, как иллюстрация концепции - более расширенные например:

  1. Использование личных ключей разработчиков
  2. Выдача ключей заказчику с доступом в отдельную ветку-версию