Ir al contenido principal

Plantillas

Plantillas

AppKit utiliza un sistema de plantillas basado en el comando databricks apps init de la Databricks CLI. Las plantillas definen la estructura del project y los archivos .tmpl se procesan con el motor text/template de Go para generar un output personalizado.

Cómo funcionan los archivos .tmpl

La CLI procesa cualquier archivo que termine en .tmpl durante databricks apps init:

  1. Se elimina el sufijo .tmpl (por ejemplo, .env.tmpl.env)
  2. Se evalúan y sustituyen las expresiones de template de Go
  3. El archivo renderizado se escribe en el directorio de salida

Los archivos cuyo nombre empieza por _ se renombran con el prefijo . (por ejemplo, _gitignore.gitignore).

Variables de template

VariableDescripción
.projectNameNombre del proyecto tomado de --name o del prompt interactivo
.workspaceHostURL del workspace de Databricks
.profileNombre del perfil de la Databricks CLI (vacío si se usa autenticación basada en host)
.appDescriptionDescripción de la app
.plugins.<name>No nulo para cada plugin seleccionado, lo que permite usar condicionales
.dotEnv.contentContenido de .env generado a partir de los recursos del plugin
.dotEnv.exampleContenido de .env.example generado con marcadores de posición
.bundle.*Secciones generadas de databricks.yml (variables, recursos, variables de destino)
.appEnvEntradas de entorno generadas en app.yaml

Contenido condicional

Usa los condicionales de los templates de Go para incluir o excluir código según los plugins seleccionados:

{{- if .plugins.analytics}}
import { analytics } from '@databricks/appkit';
{{- end}}

appkit.plugins.json

El manifiesto de plugins determina el comportamiento de la CLI durante databricks apps init:

  • UI de selección de plugins — plugins seleccionables que se muestran en el prompt interactivo
  • Prompts de recursos — los recursos obligatorios/opcionales piden valores al usuario (p. ej., el ID del SQL Warehouse)
  • Relleno de .dotEnv — los campos de recursos con una propiedad env se escriben en .env
  • Generación de app.yaml — los campos de recursos generan entradas env + valueFrom
  • Generación de databricks.yml — los campos de recursos generan variables de bundle y entradas de recursos de la app

El manifiesto sincronizado lo genera appkit plugin sync --write a partir del manifest.json de cada plugin (consulta Manifiesto del plugin para conocer el contrato de autoría). La estructura en disco incluye un campo version que la CLI utiliza para negociar funcionalidades:

  • "1.0" / "1.1" — estructuras anteriores; siguen siendo legibles.
  • "2.0" — estructura actual. Añade scaffolding (obligatorio para la CLI cuando version es "2.0"; se valida al analizar el archivo, no mediante el JSON Schema publicado) y el campo origin en cada entrada de campo de recurso. JSON Schema publicado en https://databricks.github.io/appkit/schemas/template-plugins.schema.json.

Propiedades de los campos de recurso

Cada campo de recurso del manifiesto sincronizado puede tener estas propiedades:

PropiedadDescripción
envNombre de la variable de entorno que se escribe en .env y app.yaml
descriptionSe muestra en el prompt interactivo y en la descripción de la variable del bundle
localOnlySolo se escribe en .env para el desarrollo local; se excluye de app.yaml y de las variables del bundle
bundleIgnoreSe excluye de las variables de databricks.yml (pero se mantiene en .env)
valueValor predeterminado que se usa cuando no se proporciona ningún valor de entrada
resolveLa CLI lo completa automáticamente mediante llamadas a la API en lugar de solicitarlo (ver más abajo)
examplesValores de ejemplo que se muestran en las descripciones de los campos
discoveryCómo la CLI enumera los valores candidatos del campo (ver Manifiesto del plugin — Descubrimiento de recursos).
originCampo calculado de v2.0. Cómo se determina el valor — ver más abajo.

origin (v2.0)

origin se calcula durante la sincronización a partir de las demás propiedades del campo; los autores de plugins no lo escriben. Indica a los agentes de scaffolding cómo llega cada valor a la aplicación en ejecución:

OriginDisparadorSignificado
"platform"localOnly: trueLo inyecta automáticamente Databricks Apps durante el deploy. Se genera solo para el .env local; no aparece en app.yaml ni en las variables del bundle.
"static"value definidoLiteral fijo en el código. La CLI no lo solicita.
"cli"resolve definidoLo resuelve la CLI mediante llamadas a la API (p. ej. postgres:host).
"user"ninguno de los anterioresEl usuario debe proporcionar el valor durante la inicialización.

La precedencia sigue el orden anterior (localOnly prevalece sobre value, que a su vez prevalece sobre resolve). La transformación sobrescribe cualquier origin editado a mano en la siguiente sincronización: por construcción, no puede haber divergencia entre el valor almacenado en disco y la forma real del campo.

Resolvers

Los campos con una propiedad resolve los completa automáticamente la CLI a partir de llamadas a la API, en lugar de solicitarlos al usuario. El formato es <type>:<field>.

Actualmente, solo el tipo de recurso postgres cuenta con un resolver. A partir de los nombres de recurso branch y database proporcionados por el usuario, deriva lo siguiente:

Clave de resolveDescripción
postgres:hostHost de Postgres del read-write endpoint del branch
postgres:databaseNameNombre de la base de datos Postgres del recurso database
postgres:endpointPathNombre del recurso endpoint de Lakebase de los endpoints del branch

Ejemplo de definición de campo:

{
  "host": {
    "env": "PGHOST",
    "localOnly": true,
    "resolve": "postgres:host",
    "description": "Postgres host for local development."
  }
}

Tras la sincronización, el campo incluye "origin": "platform" (porque localOnly tiene prioridad sobre resolve en los campos exclusivamente locales que se inyectan durante el deploy).

Propagación de scaffolding.rules

El bloque scaffolding.rules de cada plugin (consulta Manifiesto del plugin — Reglas de scaffolding) se propaga sin cambios a su entrada en appkit.plugins.json. La CLI entrega las reglas combinadas a nivel de plugin —junto con el scaffolding.rules de nivel superior del template— a los agentes de scaffolding que ejecutan databricks apps init.

Modelo de combinación:

  1. Recopila las reglas de cada plugin seleccionado y de cada plugin con requiredByTemplate: true.
  2. Aplica por encima el scaffolding.rules a nivel de template.
  3. Las reglas a nivel de plugin prevalecen sobre los valores predeterminados integrados en la skill o definidos a nivel de template en el mismo punto de la directiva.
  4. Un must de un plugin que entra en conflicto con un never del template (o viceversa) detiene el flujo de inicialización; consulta las reglas de validación a continuación.

Descriptor scaffolding (v2.0)

El bloque scaffolding del nivel superior de appkit.plugins.json describe el comando de scaffolding, sus flags y las reglas transversales que todo agente de scaffolding debe respetar. La CLI lo exige cuando version es "2.0". Este requisito se valida durante el análisis: el JSON Schema publicado marca únicamente version y plugins como campos obligatorios de nivel superior, ya que no puede expresar requisitos condicionales.

{
  "scaffolding": {
    "command": "databricks apps init",
    "flags": {
      "--name": {
        "description": "Project name — sets {{.projectName}} in package.json, databricks.yml, and .env. Required for non-interactive scaffolding.",
        "required": true,
        "pattern": "^[a-z][a-z0-9-]*$"
      },
      "--features": {
        "description": "Plugins to enable (comma-separated, no spaces; must match keys in this manifest's plugins map)",
        "required": false,
        "pattern": "^[a-zA-Z0-9_-]+(,[a-zA-Z0-9_-]+)*$"
      },
      "--profile": {
        "description": "Databricks CLI profile to use for authentication (global flag)",
        "required": false
      }
    },
    "rules": {
      "must": [
        "Keep all secrets and credentials only in app.yaml, databricks.yml, and/or .env"
      ],
      "should": [
        "ask user when in doubt of resource to use for plugin"
      ],
      "never": [
        "guess resources when multiple or no options are available",
        "embed secrets in files that will go to the client-bundle"
      ]
    }
  }
}
CampoDescripción
commandComando de scaffolding que el agente debe invocar.
flagsMapa de nombre de flag a { description, required?, pattern?, default? }.
rules.mustAcciones que el agente de scaffolding siempre debe realizar.
rules.shouldAcciones recomendadas: se aplican salvo que las anule una regla a nivel de plugin.
rules.neverAcciones que el agente de scaffolding nunca debe realizar.

El ejemplo anterior muestra tres flags. El conjunto canónico de flags que se incluye con cada manifiesto de template sincronizado es:

FlagObligatorioDescripción
--nameNombre del proyecto: define {{.projectName}} en package.json, databricks.yml y .env.
--templatenoRuta del template (directorio local o URL de GitHub).
--versionnoVersión de AppKit que se usará; por defecto, se detecta automáticamente.
--featuresnoPlugins que se habilitarán (separados por comas, sin espacios; deben coincidir con las claves del mapa plugins).
--setnoDefine valores de recursos (formato: plugin.resourceKey.field=value, repetible).
--output-dirnoDirectorio donde se escribirá el proyecto.
--descriptionnoDescripción de la app.
--runnoEjecuta la app tras crearla (none, dev, dev-remote).
--auto-approvenoOmite las preguntas sobre recursos opcionales. No se recomienda para la inicialización dirigida por agentes: entra en conflicto con la regla "pregunta al usuario ante la duda".
--profilenoPerfil de Databricks CLI que se usará para la autenticación (flag global).

El esquema limita cada elemento de regla a 120 caracteres. Los textos largos no superan la validación: divídelos en directivas concretas y accionables.

El descriptor es canónico: AppKit es el propietario de los valores y los incluye con cada manifiesto de template sincronizado. Los autores de agentes consumidores (scaffolders dirigidos por LLM, ejecutores de CLI personalizados) deben tratar las listas de reglas como contratos de obligado cumplimiento, no como sugerencias.

Filtro de sustituibilidad (reglas de template)

Las reglas a nivel de template superan el mismo filtro de sustituibilidad que rige las reglas a nivel de plugin: cada entrada debe describir una decisión transversal del agente que el esquema no pueda codificar por sí solo. Reglas como «modificar únicamente los archivos dentro del directorio del template» o «listar los volúmenes tras solicitar catálogo/esquema» se omiten a propósito: la primera es inalcanzable en cuanto se lee el manifiesto como fuente de verdad, y la segunda ya se codifica estructuralmente como parents: ["catalog", "schema"] en el tipo de descubrimiento volume (consulta Manifiesto del plugin — Prompts transitorios).

Véase también

Databricks Developer Hub

¿Todo listo para lanzar tu próxima aplicación basada en agentes en minutos?

Leer la documentación