DealMachine

Inteligência de propriedades, proprietários, pessoas e empresas para vendas imobiliárias, marketing, prospecção, enriquecimento e geração de leads.

Documentação

CLI do DealMachine

Mantenedores: instruções para agentes, desenvolvimento, referência atual de comandos e versões npm.

CLI do DealMachine (dm) — inteligência imobiliária a partir da linha de comando.

Uma CLI independente baseada em Commander.js que se comunica com a API REST do DealMachine. Fornece comandos para autenticação, pesquisa de propriedades e pessoas, enriquecimento, listas, prospects, tags, webhooks, e-mail e utilitários de desenvolvimento. Compila para JavaScript ESM via tsc.

Este pacote tem zero dependências de @dealmachine/* — é um binário autocontido que se comunica exclusivamente por meio da API pública.


Integrações com agentes de IA

Este repositório também é o pacote de distribuição pública para o servidor MCP do DealMachine e a skill do DealMachine.

  • Servidor MCP hospedado: https://mcp.dealmachine.com
  • Documentação da API: https://api.docs.dealmachine.com
  • Conta e chaves de API: https://dealmachine.com/settings/developer
  • Política de privacidade: https://dealmachine.com/privacy-policy
  • Termos de serviço: https://dealmachine.com/terms-of-service
  • Suporte: support@dealmachine.com

O servidor MCP suporta OAuth 2.1 para ChatGPT, Claude, Cursor, Codex e outros clientes compatíveis. Ele também pode usar uma chave de API do DealMachine em clientes de desenvolvimento que suportam configuração de bearer-token.

O pacote do plugin inclui:

  • Uma conexão MCP hospedada para ferramentas de propriedades, pessoas, enriquecimento, vendas comparáveis e conta
  • Uma skill com ciência de créditos que descobre filtros e campos, conta primeiro e confirma operações pagas de grande volume
  • Um pacote portátil de Agent Plugins para clientes compatíveis
  • Manifestos para OpenAI, Claude, Cursor, GitHub Copilot e Gemini
  • Metadados oficiais do Registro MCP em server.json

O pacote portátil segue o Agent Plugins 1.0.0:

dealmachine-cli/
├── plugin.json
├── mcp.json
└── skills/
    └── dealmachine/
        ├── SKILL.md
        ├── REFERENCE.md
        └── SETUP.md

Clientes compatíveis descobrem a skill do DealMachine a partir de skills/dealmachine/ e se conectam ao servidor MCP HTTP Streamable hospedado declarado em mcp.json. Manifestos específicos de clientes permanecem no repositório para compatibilidade, metadados de marketplace e apresentação mais rica.

Exemplos de solicitações:

  • "Encontre propriedades de proprietários ausentes com alto patrimônio em Austin e estime o custo de créditos primeiro."
  • "Consulte o proprietário desta propriedade e encontre dados de contato disponíveis."
  • "Encontre vendas comparáveis para esta propriedade."
  • "Pesquise pessoas que correspondam a esses critérios para uma lista de prospecção direcionada."

Instalação direta da skill:

npx skills add DealMachine/dealmachine-cli

Índice


Instalação

Via npm (global)

npm install -g dealmachine
dm login

O pacote de implementação canônico é @dealmachine/cli. O pacote dealmachine é o alias curto de instalação e fornece o mesmo comando dm.

A partir do código-fonte

cd dealmachine-cli
npm run build
node dist/index.js whoami

Link para desenvolvimento local

cd dealmachine-cli
npm link
dm --version

A entrada binária é dist/index.js, declarada em package.json sob bin.dm. Requer Node.js >= 18.


Autenticação

A CLI suporta dois métodos de autenticação.

Fluxo de Autenticação de Dispositivo (RFC 8628)

O comando padrão dm login usa a Concessão de Autorização de Dispositivo OAuth 2.0 (RFC 8628). Este é o fluxo recomendado para uso interativo:

dm login
  1. A CLI solicita um código de dispositivo de POST /v1/auth/device/code com o ID do cliente dealmachine-next-cli e o nome do host da sua máquina.
  2. Uma URL de verificação e um código de usuário são exibidos. O navegador abre automaticamente (a menos que --no-browser).
  3. Você autoriza o dispositivo no navegador inserindo o código de usuário.
  4. A CLI consulta POST /v1/auth/device/token no intervalo especificado pelo servidor.
  5. Em caso de sucesso, a chave de API, o ID da chave e os detalhes da organização são armazenados em ~/.dealmachine/config.json.

A consulta trata todas as respostas RFC 8628: authorization_pending, slow_down (recua por 5s), access_denied e expired_token.

# Skip auto-opening the browser
dm login --no-browser

# Target a specific environment
dm login --env local
dm login --env staging

Login Direto com Chave de API

Para pipelines de CI, scripts ou desenvolvimento local, passe uma chave de API diretamente:

dm login --key dm_sk_live_abc123...

A chave é verificada em relação a GET /v1/account antes de ser armazenada. Se a verificação falhar, a CLI sai com um código não zero.

Se você ainda não tem uma chave de API, use dm signup, dm plans e dm checkout primeiro. O checkout do plano público aceita apenas preços Basic e Pro de autoatendimento do catálogo de planos compartilhado e está limitado a 60.000 créditos de dados mensais.

Alternando Ambientes

Se você já está conectado, pode alternar o ambiente de API de destino sem sair:

dm login --env local       # Switch to http://localhost:3001/v1
dm login --env staging     # Switch to https://api-staging.v2.dealmachine.com/v1
dm login --env production  # Switch to https://api.v2.dealmachine.com/v1

Logout

dm logout

Remove o arquivo de configuração em ~/.dealmachine/config.json.


Configuração

As credenciais são armazenadas em ~/.dealmachine/config.json com permissões de arquivo 0600 (somente leitura/gravação do proprietário). O diretório de configuração ~/.dealmachine/ é criado com modo 0700.

Esquema do Arquivo de Configuração

{
  "apiKey": "dm_sk_live_...",
  "keyId": "key_abc123",
  "organizationId": 42,
  "organizationName": "Acme Corp",
  "organizationSlug": "acme-corp",
  "apiEnvironment": "production"
}

Variáveis de Ambiente

A CLI verifica estas variáveis de ambiente para resolução da URL da API (em ordem de prioridade):

VariávelFinalidadeExemplo
DM_API_URL / DEALMACHINE_API_URLSubstituição direta de URLhttp://localhost:3001/v1
DM_ENV / DEALMACHINE_ENVIRONMENTNome do ambientelocal, staging ou production

Se nenhuma estiver definida, a CLI usa o campo apiEnvironment no arquivo de configuração e, em seguida, o padrão production.

Ambientes de API

AmbienteURL
localhttp://localhost:3001/v1
staginghttps://api-staging.v2.dealmachine.com/v1
productionhttps://api.v2.dealmachine.com/v1

Comandos

Comandos de Agents

dm agents

Exibe orientações concisas para agentes que usam a CLI. Este é o primeiro comando recomendado quando um agente tem acesso a dm, mas ainda não carregou o Playbook do DealMachine.

dm agents
dm agents --json

O guia instrui os agentes a usar --json e --quiet, verificar a autenticação, buscar filtros e campos atualizados antes das pesquisas, contar antes de trabalhos que consomem créditos e confirmar o uso esperado de créditos antes de buscar registros ou exportar.

dm agents guide

Exibe explicitamente a mesma orientação concisa para agentes.

dm agents guide
dm agents guide --json

dm agents playbook

Exibe o Markdown do Playbook do DealMachine incluído no pacote. Os agentes devem carregar isso antes de traduzir solicitações em linguagem natural sobre propriedades, pessoas, contatos, enriquecimento, listas, exportação, comparáveis ou uso de créditos em comandos da CLI.

dm agents playbook
dm agents playbook --json
dm agents skill        # alias

O código-fonte público da CLI mantém seu Playbook incluído em playbook/PLAYBOOK.md. A compilação grava o código-fonte selecionado em dist/agents/dealmachine-playbook.md, para que o comando funcione tanto a partir de um pacote CLI publicado quanto de uma cópia local do código-fonte.

dm agents install claude-code

Instala o Playbook como uma skill nativa do Claude Code. O escopo pessoal é o padrão. O escopo de projeto instala no repositório atual.

dm agents install claude-code
dm agents install claude-code --project

dm agents permissions

Exibe a lista de permissões restrita do Claude Code para comandos gratuitos de descoberta e contagem. Comandos pagos e de mutação não são pré-aprovados.

dm agents permissions
dm agents permissions --json

Comandos de Auth

dm signup

Cria uma conta pública de API e recebe uma chave de API:

dm signup developer@example.com --first-name Ada --last-name Lovelace --phone-number +15551234567
dm signup developer@example.com --login

dm plans

Lista os planos públicos Basic e Pro de autoatendimento:

dm plans
dm plans --json

dm checkout

Cria uma sessão de checkout no Stripe usando um ID de preço de dm plans:

dm checkout --price-id price_xxx_monthly

dm login

Autentica com sua conta do DealMachine.

dm login                            # Device auth flow (opens browser)
dm login --no-browser               # Device auth, manual code entry
dm login --key dm_sk_live_abc123    # Direct API key
dm login --env local                # Target local API
OpçãoDescrição
--no-browserNão abrir o navegador automaticamente
--key <api-key>Login direto com uma chave de API (ignora o navegador)
--env <environment>Ambiente de API: local, staging ou production

dm logout

Remove as credenciais armazenadas.

dm logout

dm whoami

Exibe o status atual de autenticação.

dm whoami               # Show stored credentials
dm whoami --verify      # Verify credentials against the API
OpçãoDescrição
--verifyVerifica as credenciais com a API

Comandos de Config

dm config get [key]

Obtém um valor de configuração ou exibe todos os valores quando nenhuma chave é fornecida.

dm config get                   # Show all config values
dm config get apiEnvironment    # Show specific value
dm config get apiKey            # Shows truncated key (first 20 chars)

Chaves disponíveis: organizationName, organizationSlug, organizationId, apiEnvironment, keyId, apiKey.

dm config set <key> <value>

Define um valor de configuração. Apenas apiEnvironment é editável.

dm config set apiEnvironment local
dm config set apiEnvironment staging
dm config set apiEnvironment production

dm config path

Exibe o caminho absoluto para o arquivo de configuração.

dm config path
# /Users/you/.dealmachine/config.json

Comandos de Account

dm account

Exibe informações da conta, incluindo nome da organização, ID, data de criação e tipo de autenticação.

dm account

Saída:

Account
────────────────────────────────────────
Organization:  Acme Corp
Org ID:        42
Created:       Jan 15, 2025
Auth Type:     api_key

Comandos de Usage

dm usage

Exibe o uso de créditos para o ciclo de cobrança atual.

dm usage           # Human-readable table
dm usage --json    # Machine-readable JSON

Saída:

Credit Usage
──────────────────────────────────────────────────
  Plan:         Pro
  Cycle:        Mar 1, 2026 : Mar 31, 2026

  Credits:      4,200 / 10,000 (42%)
  Remaining:    5,800

  Breakdown:
    Properties: 3,100
    People:     1,100

Comandos de Properties

dm properties search

Pesquisa propriedades com filtros e localizações.

# Inline JSON body
dm properties search --body '{
  "locations": [{"type": "zip_code", "code": "78704"}],
  "filters": [{"filter_id": "property_type", "operator": "is_any_of", "value": ["single_family"]}]
}'

# From a file
dm properties search -f search.json

# Pipe from stdin
cat search.json | dm properties search

# Machine-readable output
dm properties search -f search.json --json              # Free estimate for scripts and agents
dm properties search -f search.json --json --yes        # Run after approval

# Explicit free estimate
dm properties search -f search.json --estimate-cost

# Query Builder protocol filters
dm properties search --include-lists 123,456 --exclude-previously-exported --body '{"locations":[]}'
OpçãoDescrição
--body <json>Corpo da solicitação como string JSON
-f, --file <path>Ler corpo da solicitação de um arquivo JSON
--include-lists <ids>Lista de IDs separados por vírgula para incluir
--exclude-lists <ids>Lista de IDs separados por vírgula para excluir
--exclude-previously-exportedExcluir registros já exportados pela sua organização
--bigquery-data-environment <n>Ambiente de dados do Query Builder (1 produção, 2 staging, 3 desenvolvimento)
--estimate-costVisualizar contagens e custo de créditos sem consumir créditos
--yesConfirmar gasto de créditos aprovado para execução não interativa
--jsonSaída como JSON

dm properties count

Contar propriedades que correspondem aos filtros sem consumir créditos.

dm properties count --body '{"locations": [{"type": "state", "code": "TX"}]}'
dm properties count -f filters.json --json

dm properties get <id>

Obter uma única propriedade pelo seu ID DealMachine.

dm properties get prop_12345
dm properties get prop_12345 --contact-audience owners_and_family
dm properties get prop_12345 --contact-audience none
dm properties get prop_12345 --fields estimated_value,equity
dm properties get prop_12345 --json
OpçãoDescrição
--contact-audience <audience>owners, owners_and_family, renters, residents, all, none
--fields <csv>IDs de campos de propriedade separados por vírgula de dm fields
--jsonSaída como JSON

A consulta de propriedade usa como padrão owners. Se você precisar apenas dos dados da propriedade, use --contact-audience none. Isso omite contatos e evita créditos de pessoas.

dm properties ids [ids...]

Obter várias propriedades pelos seus IDs em uma única solicitação em lote.

# Positional arguments
dm properties ids prop_111 prop_222 prop_333

# Via JSON body
dm properties ids --body '{"ids": ["prop_111", "prop_222"]}'

# From file
dm properties ids -f ids.json --contact-audience owners
dm properties ids -f ids.json --contact-audience none
OpçãoDescrição
--body <json>Corpo da solicitação como string JSON
-f, --file <path>Ler corpo da solicitação de um arquivo JSON
--contact-audience <audience>Incluir contatos: owners, owners_and_family, renters, residents, all, none
--jsonSaída como JSON

dm properties export

Exportar propriedades como CSV (até 1.000.000 de registros). Retorna URLs de download assinadas.

dm properties export -f search.json
dm properties export -f search.json --require-phone --scrub-dnc
dm properties export --body '{"locations": [...]}' --mobile-only --json
OpçãoDescrição
--body <json>Corpo da solicitação como string JSON
-f, --file <path>Ler corpo da solicitação de um arquivo JSON
--require-phoneIncluir apenas registros onde o contato tem um número de telefone
--require-emailIncluir apenas registros onde o contato tem um endereço de e-mail
--mobile-onlyIncluir apenas números de telefone celular
--landline-onlyIncluir apenas números de telefone fixo
--scrub-dncExcluir contatos no registro Do Not Call
--jsonSaída como JSON

Comandos de Pessoas

dm people search

Buscar pessoas com filtros e localizações.

dm people search --body '{
  "locations": [{"type": "zip_code", "code": "78704"}],
  "filters": [{"filter_id": "age", "operator": "between", "value": [30, 50]}]
}'
dm people search -f people-search.json --json
dm people search -f people-search.json --estimate-cost
dm people search -f people-search.json --json --yes
dm people search --include-lists 123 --exclude-lists 456 --exclude-previously-exported --body '{"locations":[]}'

A Busca de Pessoas não interativa retorna uma estimativa gratuita, a menos que --yes seja fornecida. Uma pessoa específica pelo nome usa dm enrich name, não a Busca de Pessoas.

dm people count

Contar pessoas que correspondem aos filtros sem consumir créditos.

dm people count -f filters.json

dm people get <id>

Obter uma única pessoa pelo seu ID DealMachine.

dm people get per_12345
dm people get per_12345 --include-properties --property-limit 20
dm people get per_12345 --fields estimated_household_income,estimated_value
dm people get per_12345 --json
OpçãoDescrição
--include-propertiesIncluir propriedades associadas
--property-limit <n>Máximo de propriedades associadas a retornar, de 1 a 100
--fields <csv>IDs de campos separados por vírgula de dm fields
--jsonSaída como JSON

dm people ids [ids...]

Obter várias pessoas pelos seus IDs em uma única solicitação em lote.

dm people ids per_111 per_222 per_333
dm people ids --body '{"ids": ["per_111", "per_222"]}' --include-properties --property-limit 20
dm people ids per_111 per_222 --fields estimated_household_income,estimated_value
OpçãoDescrição
--include-propertiesIncluir propriedades associadas
--property-limit <n>Máximo de propriedades associadas a retornar por pessoa, até 100
--fields <csv>IDs de campos separados por vírgula de dm fields

dm people export

Exportar pessoas como CSV (até 1.000.000 de registros). Retorna URLs de download assinadas.

dm people export -f search.json --require-email
dm people export -f search.json --mobile-only --scrub-dnc --json

As opções de filtro de contato são as mesmas de dm properties export.


Comandos de Enriquecimento

Todos os comandos de enriquecimento suportam três modos de entrada: um argumento posicional para consulta de item único, --body/-f para cargas JSON, e -f com um arquivo .csv para enriquecimento em lote a partir de CSV. Lotes maiores que 250 itens são automaticamente divididos em partes. Cada comando de enriquecimento aceita --fields <csv> e envia os IDs de campos selecionados para a API. Correspondências de e-mail, telefone e nome também incluem um property_count gratuito; use --include-properties quando precisar dos próprios registros de propriedade.

dm enrich address [address]

Consultar uma propriedade pelo endereço da rua.

# Single address
dm enrich address "123 Main St, Austin, TX 78704"
dm enrich address "123 Main St, Austin, TX 78704" --contact-audience none
dm enrich address "123 Main St, Austin, TX 78704" --fields estimated_value,equity

# Batch from JSON
dm enrich address --body '{"data": [{"full_address": "123 Main St, Austin, TX"}]}'

# Batch from CSV (auto-detected by .csv extension)
dm enrich address -f addresses.csv --contact-audience owners

# CSV columns: full_address (or street, city, state, zip)
OpçãoDescrição
--body <json>Corpo da solicitação como string JSON
-f, --file <path>Ler de arquivo JSON ou CSV
--contact-audience <audience>owners, owners_and_family, renters, residents, none
--fields <csv>IDs de campos separados por vírgula de dm fields
--jsonSaída como JSON

Use --contact-audience none sempre que precisar apenas da propriedade. A resposta omite contatos e consome zero créditos de pessoas.

dm enrich latlng [coords]

Consultar uma propriedade por coordenadas de latitude/longitude.

dm enrich latlng 30.25,-97.75
dm enrich latlng -f coordinates.csv --fields estimated_value,equity --contact-audience none
# CSV columns: latitude, longitude (or lat, lng/lon/long)

dm enrich apn [apn]

Consultar uma propriedade pelo Número de Parcela do Avaliador. Refine os resultados com --state ou --zip.

dm enrich apn "0123-456-789" --state TX
dm enrich apn -f parcels.csv --zip 78704 --fields estimated_value,equity
# CSV columns: apn (or parcel_id, parcel_number)
OpçãoDescrição
--state <code>Refinar por estado (ex.: TX)
--zip <code>Refinar por código postal
--contact-audience <audience>owners, owners_and_family, renters, residents, none
--fields <csv>IDs de campos separados por vírgula de dm fields

dm enrich email [email]

Consultar uma pessoa pelo endereço de e-mail.

dm enrich email jane@example.com
dm enrich email jane@example.com --include-properties
dm enrich email -f emails.csv --fields estimated_household_income,estimated_value --json
# CSV columns: email (or email_address)
OpçãoDescrição
--include-propertiesIncluir propriedades associadas
--fields <csv>IDs de campos separados por vírgula de dm fields

dm enrich phone [phone]

Consultar uma pessoa pelo número de telefone.

dm enrich phone 5125551234
dm enrich phone -f phones.csv --include-properties --fields estimated_value
# CSV columns: phone (or phone_number)
OpçãoDescrição
--include-propertiesIncluir propriedades associadas
--fields <csv>IDs de campos separados por vírgula de dm fields

dm enrich name [name]

Consultar pessoas pelo nome. Suporta o formato "Primeiro Sobrenome" ou apenas "Sobrenome".

dm enrich name "Jane Doe" --state TX --estimate-cost
dm enrich name "Jane Doe" --state TX --json --yes
dm enrich name "Doe" --state TX --page 2
dm enrich name "Jane Doe" --zip 78704 --include-properties
dm enrich name "Jane Doe" --fields estimated_household_income,estimated_value
OpçãoDescrição
--state <code>Refinar por estado
--zip <code>Refinar por código postal
--include-propertiesIncluir propriedades associadas
--fields <csv>IDs de campos de dm fields
--estimate-costVisualizar contagem e créditos
--yesConfirmar gasto de créditos aprovado
--page <n>Número da página
--per-page <n>Resultados por página

Comandos de Comparáveis

dm comps [property_ids...]

Encontrar propriedades comparáveis (comparáveis de vendas) para uma ou mais propriedades.

# Single property with defaults
dm comps prop_12345

# Multiple properties with options
dm comps prop_12345 prop_67890 --radius 2 --timeframe 12months --limit 50

# Full control via JSON body
dm comps --body '{
  "property_ids": ["prop_12345"],
  "location": {"type": "radius", "radius_miles": 1.5},
  "criteria": {"timeframe": "6months", "sort_by": "match", "limit": 25}
}'
OpçãoDescrição
--body <json>Corpo da solicitação como string JSON
-f, --file <path>Ler corpo da solicitação de um arquivo JSON
--radius <miles>Raio de busca em milhas (padrão: 1)
--timeframe <period>3months, 6months, 12months, all (padrão: 6meses)
--limit <n>Máx. de comparáveis por propriedade (padrão: 25, máx: 100)
--sort-by <field>distance, price, date, match (padrão: correspondência)
--sort-direction <dir>asc, desc (padrão: desc)
--include-foreclosuresIncluir vendas de execução hipotecária
--jsonSaída como JSON

A saída inclui detalhes da propriedade em questão, estimativa de valor com intervalo de confiança, estatísticas resumidas (preço médio/mediano, preço por m²) e uma tabela de propriedades comparáveis.


Comandos de Listas

dm lists search

Buscar e listar todas as listas salvas.

dm lists search
dm lists search --search "Austin" --source-type properties --sort newest
dm lists search --page 2 --per-page 50 --json
OpçãoDescrição
--search <term>Buscar listas pelo nome
--source-type <type>properties ou people
--sort <order>newest, oldest, name, count
-p, --page <n>Número da página
--per-page <n>Resultados por página

dm lists create

Criar uma nova lista.

# Empty list
dm lists create --name "Austin Leads"

# Pre-populated with record IDs (max 250)
dm lists create --name "Hot Leads" --source-type properties --ids 123,456,789

# With search filters for a list build
dm lists create --name "TX SFR" -f search-filters.json
OpçãoDescrição
--name <name>Nome da lista (obrigatório)
--source-type <type>properties ou people
--ids <csv>IDs de registros separados por vírgula para pré-popular (máx. 250)
--body <json>Corpo da solicitação como JSON (filtros/localizações)
-f, --file <path>Ler corpo da solicitação de um arquivo JSON

dm lists get <id>

Obtenha detalhes de uma lista específica, incluindo status, progresso e estado de erro.

dm lists get list_abc123

dm lists update <id>

Renomeie uma lista.

dm lists update list_abc123 --name "New Name"

dm lists delete <id>

Exclua uma lista e todos os seus itens.

dm lists delete list_abc123

dm lists build <id>

Construa uma lista a partir de filtros de pesquisa. Esta é uma operação assíncrona — consulte dm lists get para verificar o status.

dm lists build list_abc123 -f search-filters.json

dm lists import <id>

Importe IDs de registros para uma lista existente.

dm lists import list_abc123 --ids 111,222,333 --source-type properties
dm lists import list_abc123 -f import-payload.json

dm lists items <id>

Liste itens em uma lista com paginação.

dm lists items list_abc123
dm lists items list_abc123 --page 2 --per-page 100 --json

dm lists add <id>

Adicione itens a uma lista por ID.

dm lists add list_abc123 --ids 111,222,333
dm lists add list_abc123 --ids 111,222 --id-type internal_property_id
OpçãoDescrição
--ids <csv>Lista de IDs separados por vírgula para adicionar (obrigatório)
--id-type <type>internal_property_id ou internal_person_id

dm lists remove <id>

Remova itens de uma lista por ID.

dm lists remove list_abc123 --ids 111,222,333

dm lists export <id>

Exporte itens da lista. Créditos são cobrados por registro.

dm lists export list_abc123
dm lists export list_abc123 --fields "full_address,estimated_value,owner_name" --anchor property
OpçãoDescrição
--fields <csv>Lista de campos separados por vírgula para exportar
--anchor <type>property ou person

Comandos de Filtros

dm filters

Liste os filtros de pesquisa disponíveis com seus tipos, operadores e agrupamentos.

dm filters
dm filters --source-type properties --search "bed"
dm filters --group-id building_information --json
OpçãoDescrição
--source-type <type>properties ou people
--group-id <id>Filtrar por ID do grupo
--search <term>Pesquisar filtros por nome
--page <n>Número da página
--per-page <n>Resultados por página

Comandos de Campos

dm fields

Liste os campos de dados disponíveis com sinalizadores de filtrável/ordenável.

dm fields
dm fields --source-type people --search "phone"
dm fields --group-id contact_info --json
OpçãoDescrição
--source-type <type>properties ou people
--group-id <id>Filtrar por ID do grupo
--search <term>Pesquisar campos por nome
--page <n>Número da página
--per-page <n>Resultados por página

Comandos de Localizações

Pesquise e recupere localizações do DealMachine.

dm locations search -q "Harris" --type county --state TX --json
dm locations get loc_city_48106 --json

dm locations autocomplete permanece disponível como um alias obsoleto para dm addresses autocomplete.


Comandos de Atividade

dm activity search

Pesquise atividades passadas da API com filtros de tipo e pesquisa de texto livre.

dm activity search -t search_properties enrich_address
dm activity search -q "Austin" --page 2
dm activity search --body '{"types": ["search_properties"], "page": 1}'
OpçãoDescrição
--body <json>Corpo da solicitação como string JSON
-f, --file <path>Ler corpo da solicitação de um arquivo JSON
-t, --types <types...>Filtrar por tipos de atividade (separados por espaço)
-q, --query <text>Pesquisa de texto livre em toda a atividade
--page <n>Número da página
--per-page <n>Resultados por página

dm activity get <id>

Obtenha detalhes completos de um registro de atividade específico, incluindo a solicitação original, resumo do resultado e IDs de entidades (pessoas e propriedades).

dm activity get act_abc123
dm activity get act_abc123 --json

Comandos de Endereços

dm addresses autocomplete <query>

Retorne sugestões gratuitas e limitadas de endereço e localização normalizada.

dm addresses autocomplete "1200 Barton Springs" --state TX
dm addresses autocomplete "saint louis 63101" --scope location --limit 5 --json
OpçãoDescrição
--scope <scope>all, address, ou location, padrão all
--state <code>Prefira uma abreviação de estado de duas letras
--limit <n>Máximo de sugestões, padrão 5 e máximo 10
--latitude <number>Latitude para classificação por proximidade, requer longitude
--longitude <number>Longitude para classificação por proximidade, requer latitude
--jsonSaída da resposta JSON bruta

O preenchimento automático não solicita campos, não realiza enriquecimento nem consome créditos de dados.

dm addresses validate [address]

Valide e padronize endereços via USPS.

# Single address
dm addresses validate "123 Main St, Austin, TX 78704"

# Batch via JSON
dm addresses validate --body '{"data": [{"full_address": "123 Main St, Austin TX"}]}'

# From file
dm addresses validate -f addresses.json --json

A saída mostra cada endereço como válido, corrigido (com correções listadas) ou inválido (com motivo).


Comandos de Desenvolvimento

Utilitários de desenvolvimento local que operam diretamente contra o contêiner MySQL do Docker (dealmachine-next-mysql). Eles exigem que o banco de dados local esteja em execução (npm run db:start a partir da raiz do repositório).

dm dev license add <key_id>

Adicione uma licença a uma chave de API no banco de dados local.

dm dev license add key_abc123 --type state --code TX
dm dev license add key_abc123 --type zip_code --code 78704
dm dev license add key_abc123 --type unlimited
dm dev license add key_abc123 --type county --code 48453 --expires 2026-12-31
OpçãoDescrição
--type <type>state, county, zip_code, ou unlimited (obrigatório)
--code <code>Código de localização: abreviação de estado, código FIPS ou CEP
--expires <date>Data de expiração no formato ISO

dm dev license list [key_id]

Liste todas as licenças, opcionalmente filtradas por ID da chave.

dm dev license list
dm dev license list key_abc123

dm dev license remove <license_id>

Remova uma licença pelo seu ID numérico.

dm dev license remove 42

Opções Globais

Todo comando suporta estes sinalizadores:

SinalizadorDescrição
--jsonSaída como JSON legível por máquina (para scripts e pipes)
--quietSuprimir spinners e saída decorativa para agentes/scripts
--helpMostrar informações de uso para qualquer comando
--versionMostrar a versão da CLI

Métodos de Entrada

Comandos que aceitam um corpo de solicitação suportam três métodos de entrada, verificados nesta ordem:

  1. --body <json> -- String JSON inline.
  2. -f, --file <path> -- Ler de um arquivo JSON. Comandos de enriquecimento também aceitam arquivos .csv para processamento em lote.
  3. Pipe de stdin -- Ler JSON de entrada via pipe (detectado quando stdin não é um TTY).
# Inline
dm properties search --body '{"locations": [...]}'

# File
dm properties search -f query.json

# Pipe
cat query.json | dm properties search

# CSV enrichment (enrich commands only)
dm enrich address -f addresses.csv

Enriquecimento em Lote CSV

Os comandos enrich detectam arquivos .csv pela extensão e os analisam automaticamente. Nomes de colunas esperados por comando:

ComandoColunas ObrigatóriasNomes Alternativos de Colunas
enrich addressfull_addressou street + city, state, zip
enrich latlnglatitude, longitudelat, lng/lon/long
enrich apnapnparcel_id, parcel_number
enrich emailemailemail_address
enrich phonephonephone_number

Lotes maiores que 250 itens são automaticamente divididos em blocos com spinners de progresso. Se um limite de exportação for atingido no meio do lote, a CLI para e retorna os resultados coletados até o momento.


Estrutura do Projeto

dealmachine-cli/
  scripts/
    copy-agent-assets.mjs      # Bundles the Playbook Markdown into dist/agents
  src/
    index.ts                  # Program entrypoint -- registers all 17 command groups
    lib/
      config.ts               # Read/write ~/.dealmachine/config.json (mode 0600)
      client.ts               # HTTP client wrapper (apiRequest, formatDate, getApiKey)
      api.ts                  # Device auth flow client (requestDeviceCode, pollForToken, verifyCredentials)
      output.ts               # Formatting helpers (printTable, printJson, printKeyValue, parseRequestBody)
    commands/
      agents.ts               # dm agents    -- agent guide and Playbook output
      login.ts                # dm login     -- device auth + API key login
      logout.ts               # dm logout    -- remove credentials
      whoami.ts               # dm whoami    -- show/verify auth status
      config.ts               # dm config    -- get, set, path
      account.ts              # dm account   -- show account info
      usage.ts                # dm usage     -- credit usage
      properties.ts           # dm properties -- search, count, get, ids, export
      people.ts               # dm people    -- search, count, get, ids, export
      enrich.ts               # dm enrich    -- address, latlng, apn, email, phone, name
      comps.ts                # dm comps     -- comparable properties
      lists.ts                # dm lists     -- full CRUD + build, import, export
      filters.ts              # dm filters   -- list available filters
      fields.ts               # dm fields    -- list available fields
      activity.ts             # dm activity  -- search, get
      addresses.ts            # dm addresses -- validate
      dev.ts                  # dm dev       -- local license management
  dist/                       # Compiled output (ESM)
  package.json
  tsconfig.json

Módulos Principais

MóduloResponsabilidade
lib/config.tsGerencia ~/.dealmachine/config.json. Impõe permissões de arquivo 0600 e permissões de diretório 0700. Fornece auxiliares tipados de leitura/escrita/exclusão.
lib/client.tsCliente HTTP central. Resolve a URL base da API a partir de variáveis de ambiente, configuração ou padrões. Anexa o cabeçalho Authorization: Bearer e User-Agent versionado. Sai com código não zero em erros HTTP.
lib/api.tsImplementação do fluxo de autorização de dispositivo. Lida com POST /v1/auth/device/code e POST /v1/auth/device/token com polling compatível com RFC 8628 e mapeamento de erros. Também fornece verifyCredentials para validação de chave.
lib/output.tsToda a formatação de saída: printTable (colunas de largura automática), printJson, printKeyValue, printPagination, printCredits, printTotals, printWarning, printHeader. Também exporta parseRequestBody que lida com --body, -f e entrada stdin.

Compilação

npm run build      # Compile TypeScript and bundle agent Playbook assets to dist/
npm run dev        # Watch mode (tsc --watch)
npm run eval:cold-start:local      # Verify a clean local install and routing contract
npm run eval:cold-start:published  # Verify the latest public npm artifact
npm run eval:cold-start:deployed   # Verify deployed documentation and skill assets

As verificações publicadas e implantadas são portões de lançamento. Espera-se que falhem antes de um lançamento ser publicado ou a implantação da documentação atingir produção. O catálogo de cenários é armazenado em evals/claude-code-name-lookup.json para que as mesmas variantes de prompt permaneçam visíveis e revisáveis.

Binário Independente

O dist/index.js compilado inclui um shebang #!/usr/bin/env node e é declarado em package.json sob bin.dm. Quando instalado globalmente via npm, torna-se disponível como dm no PATH.

Para distribuição como binário independente sem npm:

# Build
cd dealmachine-cli
npm run build

# The entire dist/ directory is the distributable artifact
# dist/index.js is the entrypoint (requires Node.js >= 18 on the target machine)

O array files em package.json garante que apenas dist/ seja incluído no pacote publicado.

Configuração TypeScript

  • Alvo: ES2022
  • Módulo: NodeNext (ESM)
  • Modo estrito habilitado
  • Gera declarações, mapas de declaração e mapas de origem
  • Sem referências de projeto (compilação independente)

Adicionando Novos Comandos

Etapa 1: Criar o arquivo do comando

Crie src/commands/mycommand.ts:

/**
 * MyCommand -- description of what this command does
 */

import chalk from 'chalk';
import ora from 'ora';
import { apiRequest } from '../lib/client.js';
import { printJson, printHeader, printKeyValue } from '../lib/output.js';

interface MyResponse {
  data: { id: string; name: string };
}

export async function myCommand(options: { json?: boolean }): Promise<void> {
  const spinner = ora('Doing something...').start();
  const data = await apiRequest<MyResponse>('/my-endpoint');
  spinner.stop();

  if (options.json) {
    printJson(data);
    return;
  }

  printHeader('My Command');
  printKeyValue({
    ID: data.data.id,
    Name: data.data.name,
  });
  console.log();
}

Etapa 2: Registrar em index.ts

Importe e conecte o comando em src/index.ts:

import { myCommand } from './commands/mycommand.js';

// Top-level command
program
  .command('mycommand')
  .description('Description shown in --help')
  .option('--json', 'Output as JSON')
  .action(async (options) => {
    await myCommand(options);
  });

// Or as a subcommand group
const myGroup = program.command('mygroup').description('Group description');

myGroup
  .command('sub1')
  .description('Subcommand description')
  .action(async (options) => {
    await mySub1(options);
  });

Etapa 3: Compilar e testar

npm run build
node dist/index.js mycommand --json

Convenções

  • Um arquivo por grupo de comandos em src/commands/.
  • Sempre suporte --json para saída legível por máquina.
  • Use ora para spinners durante chamadas de API.
  • Use chalk para saída de terminal colorida.
  • Use apiRequest<T> de lib/client.ts para todas as chamadas de API — ele lida com autenticação, erros e saídas.
  • Use parseRequestBody de lib/output.ts quando o comando aceitar entrada --body, -f ou stdin.
  • Use printHeader, printTable, printKeyValue, printCredits, printPagination para formatação de saída consistente.
  • Todos os imports devem usar a extensão .js (requisito ESM com resolução NodeNext).

Dependências

Tempo de Execução

PacoteVersãoFinalidade
commander^12.1.0Framework de CLI — registro de comandos, análise de opções, geração de ajuda
chalk^5.3.0Estilização de strings no terminal (cores, negrito, esmaecido)
ora^8.1.0Animações de spinner para operações assíncronas
open^10.1.0Abre o navegador para o fluxo de autenticação do dispositivo

Dev

PacoteVersãoFinalidade
typescript^5.6.3Compilador TypeScript
@types/node^22.0.0Definições de tipos do Node.js

Dependências Internas de Pacotes

Nenhuma. Este pacote é um binário totalmente autônomo com zero dependências de @dealmachine/*. Ele se comunica exclusivamente por meio da API REST pública.

Usado Por

O Playbook em packages/playbooks/playbook/ usa comandos dm para executar fluxos de trabalho de inteligência de propriedades. A CLI é a interface principal pela qual o Playbook interage com os dados do DealMachine. Os agentes podem carregar o Playbook incluído diretamente com dm agents playbook.

Rastreamento de trabalho de staging da fábrica

O fluxo de trabalho factory-release-intake.yml é mantido no master e lê PRs mesclados do staging. Ele relata a origem e, quando registrado, a implantação exata de staging para Factory Releases, reutilizando links do Linear ou criando um problema de rastreamento piloto configurável. A reconciliação agendada tenta novamente eventos perdidos sem problemas duplicados. Ele não implanta este repositório, executa QA ou aprova produção.

O coletor é gerado a partir da Factory. Consulte ingestão automática de staging para configuração, propriedade da origem, regeneração e recuperação. O staging permanece como o branch sendo verificado, mesmo que o fluxo de trabalho de relatório viva no master.