Qual pacote usar?

Escolha pela camada — OpenAPI gerada, helpers de domínio ou extensão Go.

  1. Passo 1

    API REST completa

    @mira/commerce-client-sdk — 65+ ops geradas da OpenAPI SSOT.

    Ver instalação
  2. Passo 2

    Checkout headless

    @mira/commerce-checkout-sdk — sessão, patch e place-order tipados.

    Guia checkout
  3. Passo 3

    Protótipo / app Mirá

    lib/commerce-client/ — facade live com auth bridge e tipos de domínio.

    Ver facade

Catálogo de pacotes

SSOT humano: docs/sdk-wiring.md · Versão alinhada à OpenAPI 0.3.0.

PacotePúblicoEstadoQuando usar
@mira/commerce-client-sdkIntegradores + coreGerado (65+ ops)Qualquer chamada REST — scripts, BFF, apps cliente
@mira/commerce-checkout-sdkParceiros checkoutHelpers Fase 3bFluxo sessions — ver headless-checkout
@mira/commerce-uiClientes B2CScaffold Fase 6Shells platform/member reutilizáveis (extract incremental)
commerce-ext (Go)Plugins / client templateFase 2b+Hooks, manifest, verify — ver extensibility
lib/commerce-client/App Next.js deste repoLive 100%Preferir em app/ — não publicar como pacote npm

Arquitetura

Fluxo de dados
┌─────────────┐     ┌──────────────────────┐     ┌─────────────────────────┐
│  app/ UI    │────▶│ lib/commerce-client/ │────▶│ @mira/commerce-client-  │
│  (Next.js)  │     │ facade (live)        │     │ sdk (gerado OpenAPI)    │
└─────────────┘     └──────────────────────┘     └───────────┬─────────────┘
                                                               │
                    ┌──────────────────────┐                   │
                    │ @mira/commerce-      │◀──────────────────┘
                    │ checkout-sdk         │   (integradores headless)
                    └──────────────────────┘
                                                               ▼
                                                    GET/POST /api/commerce/v1/*  (browser demo)
                                                               │
                                                    POST/GET /commerce-api/v1/*  (integrador)
                                                               ▼
                                                    cmd/api (Go) → Postgres

Dev local: middleware + rewrite /commerce-api/* → localhost:8080. Produção demo: BFF /api/commerce/v1 — ver docs/deploy-ovh.md.

Instalação

Monorepo core: workspace packages. Repo cliente (Fase 4): GitHub Packages — ADR 0008.

Monorepo (este repo)
// package.json raiz já resolve workspace:*
import { createCommerceClient, listProducts } from "@mira/commerce-client-sdk"
import { createCheckoutSession } from "@mira/commerce-checkout-sdk"
Repo cliente (futuro publish)
npm install @mira/[email protected]
npm install @mira/[email protected]   # checkout headless
npm install @mira/[email protected]             # opcional — shells UI
  • packages/commerce-client-sdk/

    Cliente TS gerado (@hey-api/openapi-ts)

  • packages/commerce-checkout-sdk/

    Helpers checkout sobre o client SDK

  • packages/commerce-ui/

    Scaffold UI — Fase 6

  • templates/mira-commerce-client-template/

    Manifest + verify CI cliente

Cliente base — createCommerceClient

Server-side (integrador / BFF)
import { createCommerceClient, listProducts, resolvePrice } from "@mira/commerce-client-sdk"

const client = createCommerceClient({
  baseUrl: process.env.COMMERCE_API_URL, // ex.: https://demo.mira-dev.tech/commerce-api/v1
  token: process.env.MC_API_TOKEN,       // mc_live_… — nunca no browser
})

const { data: products } = await listProducts({
  client,
  query: { member_id: "550e8400-…", limit: 20 },
})

const { data: price } = await resolvePrice({
  client,
  query: { sku_id: "…", member_id: "…", channel: "web" },
})
Browser via proxy (protótipo Mirá)
import { createCommerceClient } from "@mira/commerce-client-sdk"

// baseUrl browser demo: /api/commerce/v1 (BFF — Bearer server-side)
// Dev local: middleware injecta token em /commerce-api/*
const client = createCommerceClient({ token: sessionBearer })

// Preferir facade em app/:
import { getProducts, getOrders } from "@/lib/commerce-client"
OpçãobaseUrlAuth
Integrador server-sideURL absoluta da APIBearer mc_live_… (env)
Protótipo Next.js (demo)/api/commerce/v1BFF — cookies ou storefront bearer
Dev local Mac/commerce-api/v1middleware → dev tokens
Checkout compradorqualquerX-Checkout-Session-Token (cks_tok_…)
Conta compradorqualquerBearer mc_sess_… (pós magic link)

Checkout SDK (@mira/commerce-checkout-sdk)

Sessão → place-order
import { createCommerceClient } from "@mira/commerce-client-sdk"
import {
  createCheckoutSession,
  patchCheckoutSession,
  placeCheckoutOrder,
} from "@mira/commerce-checkout-sdk"

const client = createCommerceClient({ baseUrl, token: integratorToken })

const session = await createCheckoutSession(client, {
  memberId: "550e8400-…",
  warehouseId: "660e8400-…",
  channel: "web",
  state: { items: [{ sku_id: "…", qty: 2 }] },
})

await patchCheckoutSession(client, session.id, session.sessionToken, {
  delivery: { mode: "pickup", slot_id: "…" },
})

const order = await placeCheckoutOrder(client, {
  sessionId: session.id,
  sessionToken: session.sessionToken,
  idempotencyKey: crypto.randomUUID(),
})

Guia completo com erros HTTP, anti-fraude e padrão BFF: Checkout headless

Facade lib/commerce-client/

AspectoFacadeSDK direto
Import em app/import { getOrders } from '@/lib/commerce-client'Evitar — sem auth bridge
Tipos de domínioRe-export de lib/types.ts + mapeamentotypes.gen.ts (OpenAPI)
Handlerslib/commerce-client/domains/live/*.tsFunções geradas listX, createX…
Modo APISempre live (sem mock fallback)N/A
// lib/commerce-client/index.ts — ponto único para UI
import { getOrders, createOrder, testErpConnection } from "@/lib/commerce-client"

if (isLiveMode()) { /* sempre true */ }

Domínios cobertos (client SDK)

DomínioExemplos geradosGuia domínio
CatálogolistProducts, listServices, getCatalogSpecifications—
PedidoslistOrders, createOrder, submitOrder, initiateOrderPaymentheadless-checkout
Checkout sessionscreateCheckoutSession, patchCheckoutSession, placeCheckoutOrderheadless-checkout
Preços / promolistPrices, resolvePrice, listPromotions, listCoupons—
ERPcreateErpConnection, testErpConnection, generateErpMappingserp-integration
Auth staff/customerrequestStaffMagicLink, verifyCustomerMagicLink, getCustomerMe—
Tokens / RBAClistApiTokens, createApiToken, rotateApiTokenapi-access-policies.md
AnalyticsanalyticsAsk, executeAnalyticsReport—
Dev / MCPgetDeveloperOps, tryMcpToolmcp-tools.md

Lista completa: packages/commerce-client-sdk/src/generated/sdk.gen.ts · Explorer: /docs/apis

Regenerar e validar

ComandoQuando
npm run sdk:generateApós alterar as fontes em services/api/openapi/src/
npm run sdk:checkCI — regen + falha se drift em src/generated/
npm run spec:refreshSync public/openapi + regen SDK + explorer
npm run spec:validateGate completo antes de PR — inclui sdk:check
Fluxo após mudança OpenAPI
1. Editar as fontes em services/api/openapi/src/ (paths/<tag>/, schemas/)
2. npm run spec:refresh          # ou openapi:sync + sdk:generate
3. Ajustar lib/commerce-client/domains/live/ se novos paths
4. npm run spec:validate         # deve ficar verde
5. Commit packages/commerce-client-sdk/src/generated/ junto com as fontes do spec

Auth em dev local

Sessão UI (mock-session)Bearer injectadoEscopo
platformmc_live_dev_platform_001Tenant platform — admin
membermc_live_dev_member_001Tenant member — lojista

Pré-requisito: API Go em execução (go run ./cmd/api) · WireGuard se Postgres OVH.

Princípios

OpenAPI → SDK

Nunca editar src/generated/ à mão — sempre regenerar a partir da spec.

Verificação: sdk:check

Secrets server-side

mc_live_… e mc_sess_… só em BFF ou backend — nunca expor no bundle browser.

Verificação: api-access-policies.md

UI usa facade

app/ importa lib/commerce-client — não o pacote gerado diretamente.

Verificação: module-boundaries.md

Anti-patterns

EvitarPreferir
Fetch manual sem SDKFunções geradas — tipos e paths alinhados à spec
Editar sdk.gen.tsnpm run sdk:generate + commit generated/
mc_live_… no React clientBFF proxy com token server-side
Duplicar helpers checkout@mira/commerce-checkout-sdk
Import SDK em plugin Gocommerce-ext — hooks e manifest YAML

SSOT e guias relacionados

  • docs/sdk-wiring.md

    Documento canónico wiring protótipo → SDK

  • services/api/openapi/src/

    Contrato REST — fontes da geração (o spec.yaml é gerado)

  • docs/headless-checkout.md

    Checkout headless — parceiros

  • docs/erp-integration.md

    ERP — wizard e mapeamentos

  • docs/fase-4-client-template.md

    Template repo cliente

  • docs/fase-6-commerce-ui.md

    Roadmap @mira/commerce-ui

  • docs/adr/0008-registry-github-packages.md

    Decisão publish npm GitHub Packages