Pular para o conteúdo

Build a partir do código

O repositório é um monorepo de workspaces npm. Não há project references de TypeScript e não há bundler: cada pacote compila com tsc e publica dist/.

Terminal window
npm install # instala todos os workspaces
npm run build # build de todos
npm test # vitest em todos

A ordem do build importa e já está fixada no script da raiz: core-edgeprotocolotelconnector-sdkdemoconnectors → o resto. O build por workspaces não é topológico, então sem esse pré-build o dist/ do runner não resolve os @rootpilot/*.

Nem todo pacote compila com as mesmas flags, e isso é deliberado.

Perfil Pacotes Flags
tsconfig.base.json protocol, otel, connector-sdk, runner strict cheio: noUncheckedIndexedAccess, exactOptionalPropertyTypes, verbatimModuleSyntax, isolatedModules.
tsconfig.migrated.json connectors, core-edge Igual, mas com noUncheckedIndexedAccess e exactOptionalPropertyTypes desligados.

O segundo perfil existe porque esses pacotes vieram de um monólito escrito só com strict: true. Ligar as duas flags geraria milhares de ! arriscados sobre código já testado, com ganho próximo de zero. Subir para strict cheio é hardening futuro, não dívida esquecida.

  • ESM + NodeNext. "type": "module", e todo import relativo carrega a extensão .js.
  • Dependências honestas. Cada pacote declara só o que importa; zod é peerDependency apenas onde é de fato usado.
  • Testes. vitest em todos. Nos pacotes migrados os testes ficam colocados em src/**/__tests__/*.test.ts para minimizar churn, uma divergência consciente em relação à convenção tests/ dos pacotes nativos.
Terminal window
docker build -f apps/runner/Dockerfile -t rootpilot-runner .

O contexto de build é a raiz do repositório, não apps/runner: o runner depende dos workspaces irmãos.

A imagem tem três estágios, e o terceiro é o que importa para você:

  1. build: npm ci && npm run build.
  2. prune: npm ci --omit=dev, que preserva os symlinks de workspace e derruba o toolchain.
  3. runtime: copia apenas dist/, os package.json e as dependências de produção.

Os @rootpilot/* são versionados por semver com retrocompatibilidade, o que é crítico para uma frota cattle, onde runners de versões diferentes convivem. publishConfig.access é public.