diff --git a/localizedContent/es/content/features/code-actions.md b/localizedContent/es/content/features/code-actions.md
index e97fef7bd..26081c5d5 100644
--- a/localizedContent/es/content/features/code-actions.md
+++ b/localizedContent/es/content/features/code-actions.md
@@ -122,7 +122,7 @@ Las acciones de código siguientes aparecerán con puntos verde azulado debajo d
| DR011 | [Reescribir con ISBLANK](xref:DR011) | En lugar de comparar una expresión con [`BLANK()`](https://dax.guide/BLANK), usa la función [`ISBLANK`](https://dax.guide/ISBLANK). Ejemplo: `IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` |
| DR012 | [Eliminar BLANK innecesario](xref:DR012) | Algunas funciones de DAX, como [`IF`](https://dax.guide/IF) y [`SWITCH`](https://dax.guide/SWITCH), ya devuelven `BLANK()` cuando la condición es falsa, así que no hace falta especificar `BLANK()` explícitamente. Ejemplo: `IF(a > b, a, BLANK())` -> `IF(a > b, a)` |
| DR013 | [Simplificar la lógica negada](xref:DR013) | Cuando se niega una expresión lógica, suele ser más legible reescribirla usando el operador negado. Ejemplo: `NOT(a = b)` -> `a <> b` |
-| DR014 | [Simplificar con IN](xref:DR014) | Reescriba los predicados compuestos (comparaciones de igualdad de una misma expresión combinadas con [`OR`](https://dax.guide/OR) o [`\|\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo: \`a = 1 \\ |
+| DR014 | [Simplificar con IN](xref:DR014) | Reescriba los predicados compuestos (comparaciones de igualdad de una misma expresión combinadas con [`OR`](https://dax.guide/OR) o [`\|\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo: `a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` |
### Reescrituras
diff --git a/localizedContent/es/content/features/te-cli/includes/te-cli-preview-notice.md b/localizedContent/es/content/features/te-cli/includes/te-cli-preview-notice.md
new file mode 100644
index 000000000..791c29254
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/includes/te-cli-preview-notice.md
@@ -0,0 +1,2 @@
+> [!IMPORTANT]
+> The Tabular Editor CLI is in **Limited Public Preview**. It is offered for evaluation with a Tabular Editor account; no license is required during preview. Commands, flags, and outputs may change before general availability. **The preview build stops functioning after 2026-09-30.** We recommend against using the CLI in production CI/CD pipelines during preview. Please refer to our license agreement.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-auth.md b/localizedContent/es/content/features/te-cli/te-cli-auth.md
new file mode 100644
index 000000000..054f1fdb9
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-auth.md
@@ -0,0 +1,226 @@
+---
+uid: te-cli-auth
+title: Authentication and Connections
+author: Peer Grønnerup
+updated: 2026-05-06
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# Authentication and Connections
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+The Tabular Editor CLI authenticates to Power BI Service, Microsoft Fabric, and Azure Analysis Services using the same Power BI Desktop client ID that Tabular Editor 3 uses. Tokens are cached locally so you authenticate once and re-run commands silently until the refresh token expires (typically 90 days).
+
+## Authentication methods
+
+The CLI supports the full Azure Identity credential chain:
+
+| Method | When to use | `--auth` value |
+| ---------------------------------------------------- | ------------------------------------------------------------- | --------------------------------------------------------- |
+| Interactive browser | Local development - opens the system browser | `interactive` (default) |
+| Service principal (client secret) | Automation, CI/CD, headless / SSH / WSL | `spn` (with `-u / -p / -t`) or `env` |
+| Service principal (certificate) | Automation with certificate-based auth | `spn` (with `-u / -t / --certificate`) |
+| Environment variables | `AZURE_CLIENT_ID` / `AZURE_CLIENT_SECRET` / `AZURE_TENANT_ID` | `env` |
+| Managed identity | Azure VMs, Azure Container Apps, Azure Functions | `managed-identity` |
+
+> [!NOTE]
+> `--auth` is a **global** option, available on every `te` command - not just `te auth login`. Pass it to [`te deploy`](xref:te-cli-commands#deploy), [`te refresh`](xref:te-cli-commands#refresh), [`te query`](xref:te-cli-commands#query), [`te connect`](xref:te-cli-commands#connect), or any other command that connects to a remote endpoint, to override the default chain for that invocation. The default (`auto`) tries environment credentials first, then falls back to the cached or interactive browser login.
+
+For headless, SSH, WSL, or devcontainer scenarios, use a service principal - `te auth login -u -p -t ` (or `--certificate`). The login is cached, so subsequent commands acquire tokens silently with `--auth auto`.
+
+## `te auth login`
+
+Authenticate and cache the result for subsequent commands:
+
+```bash
+# Browser-based interactive login (default)
+te auth login
+
+# Service principal with client secret
+te auth login -u "$AZURE_CLIENT_ID" -p "$AZURE_CLIENT_SECRET" -t "$AZURE_TENANT_ID"
+
+# Service principal - read secret from stdin
+echo "$AZURE_CLIENT_SECRET" | te auth login -u "$AZURE_CLIENT_ID" -p - -t "$AZURE_TENANT_ID"
+
+# Service principal with certificate
+te auth login -u "$AZURE_CLIENT_ID" -t "$AZURE_TENANT_ID" --certificate ./sp.pfx --certificate-password "$CERT_PASSWORD"
+
+# Managed identity (Azure-hosted)
+te auth login --identity
+```
+
+After a successful service-principal login the CLI **caches the credentials** so every subsequent `te` command can acquire tokens silently - no need to re-pass `-u / -p / -t` or set the `AZURE_CLIENT_*` environment variables. Pass `--save=false` for a one-shot login that doesn't update the cache, or run `te auth logout` to clear it.
+
+> [!WARNING]
+> Passing secrets directly on the command line exposes them to process listings and shell history. Prefer the `AZURE_CLIENT_SECRET` environment variable, or pipe the secret via stdin with `-p -`.
+
+## `te auth status`
+
+Display the current authentication state without opening a browser:
+
+```bash
+te auth status
+te auth status --output-format json
+```
+
+This returns an exit code of `0` when a valid session exists, `1` when not logged in or expired.
+
+## `te auth logout`
+
+Clear all cached credentials:
+
+```bash
+te auth logout
+```
+
+## Credential storage
+
+The CLI stores access/refresh tokens and service-principal records in the **OS-native secure store** by default. A `0600` file fallback is selected automatically only when the OS keystore is unavailable (e.g., headless Linux without libsecret/D-Bus).
+
+| Platform | Backend | Storage location |
+| --------------------------------- | --------------------------------------------- | -------------------------------------------------------------- |
+| Windows | DPAPI | Per-user, managed by MSAL |
+| Linux | libsecret (system keyring) | Per-user, managed by MSAL |
+| macOS | Keychain | Service `com.tabulareditor.cli.*`, account `te-msal-cache.bin` |
+| Any (fallback) | `0600` file | `~/.te-cli/te-msal-cache.bin` and per-key `.bin` blobs |
+
+Interactive browser and service-principal flows share the same cache; MSAL's account model distinguishes them - there are no separate `auth-record*.json` sidecar files. Run any command with `--debug` to see which backend was selected at startup.
+
+`te auth logout` clears every cached record (both the MSAL token cache and any SPN blobs) regardless of which backend is in use.
+
+## `te connect` - set the active connection
+
+`te connect` persists an active connection for the current terminal session. Subsequent commands that take `-s` / `-d` can omit them:
+
+```bash
+# Remote workspace
+te connect my-workspace my-model
+
+# Local TMDL folder, .bim file, or .SemanticModel container
+te connect ./my-model
+
+# Connect to a running Power BI Desktop instance (Windows only)
+te connect --local
+
+# Show the active connection
+te connect
+
+# Clear the active connection (and any workspace mirror)
+te connect --clear
+```
+
+Active-connection state is per-terminal-session: opening a new terminal starts fresh.
+
+### Workspace mode (`-w` / `--workspace`)
+
+`te connect -w ` pairs a primary source with a secondary mirror so every subsequent `--save` writes to both. Use it to keep a local working copy of a remote model in sync, or to push local edits to a workspace as you save:
+
+```bash
+# Mirror remote workspace ↔ local TMDL folder
+te connect Finance "Revenue Model" -w ./revenue-model
+
+# Mirror local source ↔ remote workspace (initial deploy + auto-redeploy on save)
+te connect ./revenue-model -w Finance "Revenue Model"
+```
+
+Save order is always **local first, then remote**, so the on-disk copy reflects the latest user change even if the server push fails. See @te-cli-commands#workspace-mode-w--workspace for `--workspace-format`, overwrite semantics, and clearing the mirror.
+
+## Connecting to different clouds
+
+The CLI detects the correct scope from the server URL for:
+
+- Power BI Service and Fabric (commercial, US Gov, China, Germany clouds)
+- Azure Analysis Services (`asazure://...`)
+- Local SSAS (`localhost`, named instances - Windows only)
+
+Pass an XMLA endpoint, workspace name, or `powerbi://` URL as `--server`:
+
+```bash
+te connect "powerbi://api.powerbi.com/v1.0/myorg/Finance" "Revenue Model"
+te connect "powerbi://api.powerbi.com/v1.0/SpaceParts/Finance" "Revenue Model"
+te connect "asazure://westeurope.asazure.windows.net/myaas" "MyModel"
+te connect localhost "AdventureWorks"
+```
+
+## Connection profiles
+
+For repeated use of the same connection - especially when you deploy to multiple environments - save named profiles:
+
+```bash
+# Save remote and local profiles
+te profile set prod -s my-workspace -d my-model --description "Production"
+te profile set dev --model ./model --description "Local dev TMDL"
+
+# List and inspect
+te profile list
+te profile show prod
+
+# Use a profile as the active connection
+te connect --profile prod
+
+# One-shot use without changing the active connection
+te deploy ./model --profile staging --force
+```
+
+Profiles can also carry behavioral overrides that take effect whenever the profile is active:
+
+```bash
+# In dev, disable the BPA gate on deploy and loosen validation
+te profile set dev --bpa-on-deploy false --validate-on-mutation false
+
+# In prod, force auto-format before any mutation
+te profile set prod --auto-format true
+```
+
+See @te-cli-config for the full list of overridable behaviors.
+
+## Non-interactive authentication
+
+For CI/CD pipelines, agents, or any unattended context, avoid interactive flows by combining:
+
+- The `--non-interactive` global flag (fails fast instead of prompting).
+- One of the non-interactive auth methods: `env`, `managed-identity`, or explicit service principal credentials.
+
+Environment-based example for a pipeline:
+
+```bash
+export AZURE_CLIENT_ID="your-app-id"
+export AZURE_CLIENT_SECRET="your-client-secret"
+export AZURE_TENANT_ID="your-tenant-id"
+
+te deploy ./model -s my-workspace -d my-model \
+ --auth env \
+ --non-interactive \
+ --force \
+ --ci github
+```
+
+See @te-cli-cicd for complete GitHub Actions and Azure DevOps Pipelines examples.
+
+## Authentication environment variables
+
+The CLI honors the standard Azure.Identity environment variables when you use `--auth env` (and as part of the `auto` chain):
+
+| Variable | Purpose |
+| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `AZURE_CLIENT_ID` | Service principal application ID. |
+| `AZURE_CLIENT_SECRET` | Service principal client secret. Used together with `AZURE_CLIENT_ID` and `AZURE_TENANT_ID`. |
+| `AZURE_TENANT_ID` | Service principal tenant (directory) ID. |
+| `AZURE_CLIENT_CERTIFICATE_PATH` | Path to a PEM or PKCS12 certificate file for certificate-based service principal auth. Used together with `AZURE_CLIENT_ID` and `AZURE_TENANT_ID`. |
+| `AZURE_AUTHORITY_HOST` | Override the authority host for sovereign clouds (e.g., `login.microsoftonline.us`, `login.partner.microsoftonline.cn`, `login.microsoftonline.de`). Defaults to the commercial cloud. |
+
+For CLI-specific environment variables (config paths, debug logging, TE2 compatibility), see @te-cli-config.
+
+## Next steps
+
+- @te-cli-commands - what you can do once connected.
+- @te-cli-config - configuration and profile behavior.
+- @te-cli-cicd - pipeline examples using service principals and managed identity.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-automation.md b/localizedContent/es/content/features/te-cli/te-cli-automation.md
new file mode 100644
index 000000000..9ff078182
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-automation.md
@@ -0,0 +1,193 @@
+---
+uid: te-cli-automation
+title: Automation and Scripting
+author: Peer Grønnerup
+updated: 2026-05-06
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# Automation and Scripting
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+The Tabular Editor CLI is composable; every command supports structured output, disables interactive prompts on demand, and returns predictable exit codes. The same primitives work equally well for shell pipelines, Python scripts, PowerShell automation, and agent-driven workflows.
+
+## Structured output
+
+Use `--output-format` to switch any command between text (human-readable) and machine-readable formats:
+
+| Format | Use for | Notes |
+| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
+| `text` (default) | Human-readable use | Plain text on stdout regardless of whether the stream is a TTY or piped. |
+| `json` | Machine-readable use | Always valid JSON to stdout. Use `--error-format json` if you also want machine-readable errors on stderr. |
+| `csv` | Tabular results (`query`, `bpa run`, `bpa rules`, `vertipaq`, `validate`, `test`, `refresh`, `profile list`, `session list`, `find`, `replace`, `get`, `ls`) | RFC 4180 escaping. |
+| `tmsl` (alias `bim`) | Whole-object TMSL/BIM serialization | Accepted by `te get` and `te ls`. |
+| `tmdl` | Whole-object TMDL serialization | Accepted by `te get` only (single object). |
+
+```bash
+te ls --output-format json
+te query -q "EVALUATE VALUES('Date'[Year])" --output-format csv
+te bpa run --output-format json
+```
+
+> [!NOTE]
+> `--output-format` and `--error-format` are independent. Setting `--output-format json` does _not_ switch stderr to JSON; pass `--error-format json` for that. There is no automatic format switching when stdout is redirected - the default is always `text` unless you ask otherwise.
+
+## Non-interactive mode
+
+Add `--non-interactive` to any command to disable confirmation prompts, credential picklists, and guided wizards. If the command needs input it cannot resolve from flags, environment, or config, it exits non-zero with an actionable error instead of hanging.
+
+```bash
+te deploy ./model --non-interactive --force --ci github
+```
+
+## Exit codes
+
+Every `te` command exits with a predictable status code so callers can branch on success or failure without parsing stdout.
+
+| Exit | Meaning |
+| ---- | ------------------------------------------------------------------------------------------------------------------------------------------ |
+| `0` | Success. |
+| `1` | Generic failure - invalid arguments, command failed, validation errors, auth failure, BPA gate failed at severity ≥ error. |
+| `2` | Used by `te diff` to indicate models differ (distinct from `0` identical and non-zero errors). |
+
+Combine exit codes with `--ci ` annotations and `--trx ` to surface rich failure information in CI - see @te-cli-cicd.
+
+## Errors on stderr
+
+Errors, warnings, and the preview banner are written to **stderr**; structured data is written to **stdout**. This means you can pipe JSON safely without it being contaminated by progress indicators or diagnostic messages:
+
+```bash
+te ls --output-format json | jq '.[] | .name'
+te vertipaq --output-format json > stats.json
+```
+
+## Python
+
+Python is a natural host for orchestrating CLI calls from data pipelines, notebooks, or test harnesses. Invoke `te` with `subprocess.run`, request JSON, and parse stdout:
+
+```python
+import json
+import subprocess
+
+def query(server: str, database: str, dax: str) -> list[dict]:
+ result = subprocess.run(
+ ["te", "query",
+ "-s", server,
+ "-d", database,
+ "-q", dax,
+ "--output-format", "json",
+ "--non-interactive"],
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+ return json.loads(result.stdout)
+
+rows = query("Finance", "Revenue Model", "EVALUATE TOPN(10, 'Sales')")
+for row in rows:
+ print(row)
+```
+
+To capture structured errors from stderr:
+
+```python
+import json
+import subprocess
+
+result = subprocess.run(
+ ["te", "deploy", "./model",
+ "-s", "Finance", "-d", "Revenue",
+ "--output-format", "json", "--non-interactive", "--force"],
+ capture_output=True, text=True,
+)
+
+if result.returncode != 0:
+ try:
+ err = json.loads(result.stderr.strip().splitlines()[-1])
+ print("Deploy failed:", err.get("error"), "- hint:", err.get("hint"))
+ except json.JSONDecodeError:
+ print("Deploy failed:\n", result.stderr)
+```
+
+## PowerShell
+
+PowerShell handles JSON natively. `te` is a regular console binary that works directly in PowerShell pipelines (see @te-cli-migrate if you're porting from the older `TabularEditor.exe` CLI):
+
+```powershell
+$rows = te query -s Finance -d Revenue -q "EVALUATE TOPN(10, 'Sales')" --output-format json --non-interactive
+ | ConvertFrom-Json
+
+$rows | Format-Table
+
+# Check exit code after the pipeline
+if ($LASTEXITCODE -ne 0) {
+ Write-Error "Query failed with exit $LASTEXITCODE"
+ exit $LASTEXITCODE
+}
+```
+
+Read secrets from the environment rather than passing them as plaintext:
+
+```powershell
+$env:AZURE_CLIENT_ID = "your-app-id"
+$env:AZURE_CLIENT_SECRET = "your-client-secret"
+$env:AZURE_TENANT_ID = "your-tenant-id"
+
+te deploy ./model `
+ -s my-workspace -d my-model `
+ --auth env --non-interactive --force --ci vsts
+```
+
+## Bash
+
+Compose commands with pipes and `jq`. The CLI's text output is colorized for humans, but switching to `--output-format json` gives you a clean shape to work with:
+
+```bash
+# Count measures per table
+te ls --type measure --output-format json \
+ | jq -r '.[] | .table' \
+ | sort | uniq -c | sort -rn
+```
+
+```bash
+# Fail the shell script if BPA finds any errors
+te bpa run --fail-on error --output-format json > bpa.json \
+ || { echo "BPA gate failed"; jq '.violations' bpa.json; exit 1; }
+```
+
+## Composability example
+
+Generating a refresh TMSL script and version-controlling it is three commands:
+
+```bash
+te connect MyWorkspace MyModel
+te refresh --type full --dry-run > refresh.tmsl
+cat refresh.tmsl
+```
+
+The resulting TMSL can be reviewed in a pull request, committed, executed by the CLI (`te refresh --type full`), handed to a DBA, or applied by any XMLA-compatible tool. The CLI becomes a building block rather than a black box.
+
+## Useful patterns
+
+A handful of small idioms that come up often when composing `te` commands in scripts or pipelines:
+
+- **Idempotent creates and removes.** `te add Sales/Marker -t Measure -i "0" --if-not-exists --save` and `te rm Sales/OldMeasure --if-exists --save` both exit `0` whether or not the object existed - safe to re-run in CI.
+- **Dry-run diffs.** `te replace` is dry-run by default; add `--save` only when you're satisfied with the preview.
+- **Emit TMSL for review.** `te deploy ./model --xmla deploy.tmsl` produces the deployment script without touching the server - useful for DBA review or manual apply.
+- **Path-only output.** `te ls --paths-only` and `te find --paths-only` emit one object path per line, ideal for piping to `xargs`, `te get`, or `te set`. The model-level containers (`te ls Measures`, `te ls Columns`) compose well with this for whole-model sweeps.
+- **Benchmarking queries.** `te query --trace --cold --runs 5` runs a DAX query with cold cache, five iterations, and captures FE/SE trace events.
+- **Step timings in CI logs.** Long-running commands (`te deploy`, `te refresh`, `te script`, `te validate`) include a `durationMs` field in JSON output - useful for surfacing per-step timings in pipeline summaries.
+
+## Related pages
+
+- @te-cli-cicd - pipeline-specific patterns and YAML examples.
+- @te-cli-commands - full command reference.
+- @te-cli-interactive - when interactive mode fits better than scripting.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-cicd.md b/localizedContent/es/content/features/te-cli/te-cli-cicd.md
new file mode 100644
index 000000000..d39da955b
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-cicd.md
@@ -0,0 +1,235 @@
+---
+uid: te-cli-cicd
+title: CI/CD Integration
+author: Peer Grønnerup
+updated: 2026-05-06
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# CI/CD Integration
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+The Tabular Editor CLI is designed for unattended execution in continuous integration and delivery pipelines. A single binary, structured output, non-interactive mode, native CI annotations for GitHub Actions and Azure DevOps, and VSTEST-compatible test results make it a natural replacement for ad-hoc TE2 invocations.
+
+> [!WARNING]
+> **Do not use the CLI in production pipelines during Limited Public Preview.** Two preview-specific risks apply to pipeline owners:
+>
+> - **Hard expiry.** The preview binary stops functioning on **2026-09-30** - any pipeline depending on it will fail on that date, regardless of your release calendar.
+> - **No backwards-compatibility guarantee.** Commands, flags, output shapes, and exit codes may change between preview builds, so pipeline steps may need updating when you refresh the vendored binary.
+>
+> Build and evaluate in non-production pipelines, and share feedback in the public [TabularEditor/CLI](https://github.com/TabularEditor/CLI) repository so the GA version matches your needs.
+
+## What makes the CLI CI-friendly
+
+- **Single self-contained binary.** No runtime install, no `TabularEditor.exe`, no `start /wait`.
+- **`--non-interactive` global flag.** Disables every prompt; fails fast with actionable errors.
+- **`--force`** on mutating commands (`te deploy`, `te refresh`) skips confirmation prompts.
+- **`--ci vsts` / `--ci github`.** Emit native pipeline annotations to stderr.
+- **`--trx `.** Produce VSTEST results consumable by Azure DevOps test publishing.
+- **Structured errors.** `--output-format json` emits `{"error": "...", "hint": "..."}` to stderr so pipeline steps can fail with a useful message.
+
+## Adding the CLI to your repo
+
+During Limited Public Preview, the CLI is gated behind sign-in on [tabulareditor.com](https://tabulareditor.com/download-tabular-editor-cli), so pipelines cannot fetch the archive from a public URL. The simplest reproducible approach is to commit the binary that matches your runner into your repository and reference it from each pipeline step.
+
+A common layout:
+
+```
+your-repo/
+└── tools/
+ └── te/
+ ├── te # Linux / macOS binary (needs chmod +x at runtime)
+ └── te.exe # Windows binary
+```
+
+Place the **extracted** binary - not the archive - so the pipeline can call it directly. Pick the build that matches your runner OS/arch; see @te-cli-install for the filename table. The self-contained binary is ~70 MB; consider Git LFS if your repo is sensitive to size.
+
+> [!NOTE]
+> Committing the binary also pins the CLI version to whatever you checked in, which is desirable for CI reproducibility. To upgrade, replace the binary in `tools/te/` and commit it - the commit message is your version log. Keep in mind that the preview binary still expires on **2026-09-30** regardless of when you committed it, so a vendored copy is not a permanent dependency - plan to refresh it (and re-validate your pipeline against the new API surface) on preview-build cadence.
+
+## GitHub Actions
+
+A complete deploy + test workflow. The example assumes the Linux `te` binary is committed at `tools/te/te`, and a service principal is stored in repository secrets (`AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_TENANT_ID`).
+
+```yaml
+name: Deploy semantic model
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ env:
+ AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
+ AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
+ AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Tabular Editor CLI
+ run: |
+ chmod +x ./tools/te/te
+ echo "$GITHUB_WORKSPACE/tools/te" >> $GITHUB_PATH
+
+ - name: Validate
+ run: te validate ./model --ci github --trx validate.trx
+
+ - name: Best Practice Analyzer (gate)
+ run: te bpa run ./model --fail-on error --ci github --trx bpa.trx
+
+ - name: Deploy
+ run: |
+ te deploy ./model \
+ -s "${{ vars.WORKSPACE }}" \
+ -d "${{ vars.MODEL }}" \
+ --auth env \
+ --non-interactive \
+ --force \
+ --ci github
+
+ - name: Regression tests
+ run: |
+ te test run \
+ -s "${{ vars.WORKSPACE }}" \
+ -d "${{ vars.MODEL }}" \
+ --auth env --non-interactive \
+ --ci github --trx tests.trx
+
+ - name: Publish test results
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: trx-results
+ path: '*.trx'
+```
+
+## Azure DevOps Pipelines
+
+The Azure DevOps Pipelines equivalent of the GitHub Actions workflow above. The example assumes `te.exe` is committed at `tools\te\te.exe`. `--ci vsts` emits `##vso[...]` commands that the pipeline interprets as errors, warnings, and task-status updates.
+
+```yaml
+trigger:
+ - main
+
+pool:
+ vmImage: 'windows-latest'
+
+variables:
+ - group: 'te-cli-secrets' # Contains AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID
+
+steps:
+ - checkout: self
+
+ - powershell: Write-Host "##vso[task.prependpath]$(Build.SourcesDirectory)\tools\te"
+ displayName: 'Set up Tabular Editor CLI'
+
+ - script: te validate ./model --ci vsts --trx validate.trx
+ displayName: 'Validate'
+
+ - script: te bpa run ./model --fail-on error --ci vsts --trx bpa.trx
+ displayName: 'BPA gate'
+
+ - script: |
+ te deploy ./model ^
+ -s "$(WORKSPACE)" -d "$(MODEL)" ^
+ --auth env --non-interactive --force --ci vsts
+ displayName: 'Deploy'
+ env:
+ AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)
+ AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
+ AZURE_TENANT_ID: $(AZURE_TENANT_ID)
+
+ - script: te test run -s "$(WORKSPACE)" -d "$(MODEL)" --auth env --non-interactive --ci vsts --trx tests.trx
+ displayName: 'Regression tests'
+ env:
+ AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)
+ AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
+ AZURE_TENANT_ID: $(AZURE_TENANT_ID)
+
+ - task: PublishTestResults@2
+ condition: always()
+ inputs:
+ testResultsFormat: 'VSTest'
+ testResultsFiles: '*.trx'
+```
+
+## BPA gate patterns
+
+`te deploy` and `te save` run the Best Practice Analyzer as a pre-flight gate by default. Three behaviors are worth determining up-front:
+
+- **Enforce** - the default. Pipeline fails if BPA finds violations at severity ≥ error. Pair with `--fail-on warning` on a standalone `te bpa run` step if you want warnings to fail too.
+- **Auto-fix** - `--fix-bpa` applies `fixExpression`s in memory for the deployed artifact. Source files are not modified. Useful when the source of truth lives in the model and you want deploys to normalize style without developer intervention.
+- **Bypass** - `--skip-bpa` disables the gate for a single command. Useful for emergency hotfixes; not recommended as a default.
+
+```bash
+# Treat warnings as failures in PR validation
+te bpa run ./model --fail-on warning --ci github --trx bpa.trx
+
+# Auto-fix during deploy (source unchanged)
+te deploy ./model -s my-ws -d my-model --fix-bpa --force --ci github
+
+# Emergency bypass
+te deploy ./model -s my-ws -d my-model --skip-bpa --force --ci github
+```
+
+See @te-cli-config for controlling the BPA gate globally via `bpa.onDeploy` / `bpa.onSave` config keys.
+
+## Refresh patterns
+
+Refresh in pipelines is typically a follow-up step after deployment. Use `--non-interactive` and pick a deterministic `--type`:
+
+```bash
+# Full refresh of the whole model after deploy
+te refresh -s my-ws -d my-model --type full --non-interactive
+
+# Refresh a single fact table (e.g., daily incremental pipeline)
+te refresh -s my-ws -d my-model --table Sales --type full --non-interactive
+
+# Recalculate only (useful after calculation-group changes)
+te refresh -s my-ws -d my-model --type calculate --non-interactive
+```
+
+For incremental refresh workflows, combine `--apply-refresh-policy`, `--effective-date `, and `--partition ` flags. See @te-cli-commands for details.
+
+## Artifact patterns
+
+Emit TMSL or XMLA as an artifact without deploying, so DBAs or a later job can review or apply it:
+
+```bash
+# Produce the XMLA/TMSL script that would deploy - do not deploy
+te deploy ./model -s my-ws -d my-model --xmla deploy.tmsl --force
+
+# Produce the TMSL refresh command - do not execute
+te refresh -s my-ws -d my-model --type full --dry-run > refresh.tmsl
+```
+
+Commit these artifacts to git, upload them to the pipeline's artifact storage, or pass them between jobs. They're plain text and diff cleanly in pull requests.
+
+## Secret handling
+
+| Approach | When to use | Notes |
+| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Service principal via env vars (`AZURE_CLIENT_ID` / `AZURE_CLIENT_SECRET` / `AZURE_TENANT_ID`, `--auth env`) | General CI/CD | Map pipeline secrets to environment variables at the step or job level. Never pass secrets in command arguments. |
+| Service principal via `te auth login` once per job (`echo $SECRET \| te auth login -u $ID -p - -t $TENANT`) | Multi-step jobs | The login is cached, so subsequent `te` commands acquire tokens silently - no need to set `AZURE_CLIENT_*` for every step or re-pass `-u/-p/-t`. Pipe the secret via stdin rather than interpolating it. |
+| Managed identity (`--auth managed-identity`) | Azure VMs, Container Apps, Azure Functions | No secrets to manage. Preferred in Azure-hosted environments. |
+| Certificate (`--certificate `) | Enterprise scenarios with cert rotation | Mount the certificate as a secure file step; pass `--certificate-password` via env. |
+
+> [!WARNING]
+> Do not echo secrets or the output of `te auth status` to pipeline logs. The CLI writes warnings to stderr when secrets are passed on the command line - respect those warnings in CI.
+
+## Related pages
+
+- @te-cli-auth - authentication methods in detail.
+- @te-cli-config - configuration and profile overrides.
+- @te-cli-automation - general scripting patterns.
+- @te-cli-migrate - migrating an existing TE2-based pipeline.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-commands.md b/localizedContent/es/content/features/te-cli/te-cli-commands.md
new file mode 100644
index 000000000..4a92314e5
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-commands.md
@@ -0,0 +1,889 @@
+---
+uid: te-cli-commands
+title: Referencia de comandos
+author: Peer Grønnerup
+updated: 2026-05-12
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# Referencia de comandos
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+Esta página ofrece una breve descripción y un ejemplo por comando. Todos los comandos aceptan `--help` para consultar la documentación completa de las opciones:
+
+```bash
+te deploy --help # Help for a single command
+te bpa run --help # Help for a command with subcommands
+```
+
+> [!NOTE]
+> Durante la versión preliminar, la salida de `--help` de la CLI es la referencia definitiva de parámetros y opciones. El contenido de esta página se ha seleccionado manualmente y puede quedarse atrás respecto a `--help` cuando se añadan novedades entre versiones preliminares.
+
+## Rutas de objeto
+
+El direccionamiento de objetos en la CLI usa una única gramática compartida por todos los comandos. En la referencia siguiente aparecen dos tipos de ruta:
+
+- **``**: identifica **exactamente un** objeto o contenedor. Lo usan los comandos que operan sobre un único destino: `te get`, `te set`, `te add`, `te rm`, `te mv`, `te format -p`, `te deps`, `te macro run --on`.
+- **``**: identifica **cero o más** objetos y admite comodines. Lo usan los comandos que operan sobre un conjunto: `te ls`, `te bpa run --path` y otros comandos de tipo inspección.
+
+Ambas formas de ruta comparten las mismas reglas de sintaxis; solo se diferencian en dos puntos:
+
+- Las rutas de filtro permiten comodines `*`; las rutas de objeto no.
+- Las rutas de objeto permiten el sufijo entre corchetes de DAX (por ejemplo, `Sales[Amount]`); las rutas de filtro no.
+
+### Segmentos y separadores
+
+Una ruta es una secuencia de **segmentos** separados por barras. Cada segmento nombra un único paso: una tabla, un objeto hijo o una palabra clave de contenedor.
+
+- `Sales` — un segmento
+- `Sales/Revenue` — dos segmentos
+- `Roles/Admin/Members/bob` — cuatro segmentos
+
+La entrada vacía y `.` significan «la raíz del modelo»: el punto de partida implícito para las rutas de filtro y el sujeto explícito de las consultas del tipo `te get .`.
+
+### Uso de comillas
+
+La mayoría de los nombres de segmentos funcionan tal cual. Pon un segmento entre comillas cuando su nombre contenga espacios, barras, corchetes o cualquier carácter que, de otro modo, se interpretaría como sintaxis. La CLI sigue las convenciones de comillas de DAX, por lo que el uso de comillas en las rutas de `te` coincide con lo que escribirías dentro de una expresión DAX:
+
+| Forma | Uso | Regla de escape |
+| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
+| `'Net Sales'` | Tablas y objetos con nombre con espacios. | Duplica la comilla simple (`'Bob''s'` → `Bob's`). |
+| `"Net Sales"` | Igual que arriba; conveniente entre distintos shells cuando es engorroso escapar comillas simples. | Duplica la comilla doble (`"He said ""hi"""` → `He said "hi"`). |
+| `[Sales Amount]` | Un sufijo entre corchetes al estilo DAX en una tabla (`'Sales'[Sales Amount]`) o una referencia global al modelo solo entre corchetes (`[Total Sales]`). Solo en rutas de objeto. | Duplica el corchete de cierre (`[foo]]bar]` → `foo]bar`). |
+
+Dentro de los segmentos entre comillas, `*` se trata como un carácter literal, no como un comodín. Por tanto, `'Sa*'` coincide con una tabla cuyo nombre es exactamente `Sa*`.
+
+### Referencias al estilo DAX (solo rutas de objeto)
+
+Se aceptan dos formas con sintaxis DAX en cualquier lugar donde se admita un ``:
+
+- **`'Table'[Member]`** — equivalente a `Table/Member`. El sufijo entre corchetes hace que las coincidencias ambiguas se resuelvan a favor de columnas y medidas frente a jerarquías/particiones.
+- **`[Member]`** — una medida o columna _independiente_, sin tabla delante. Busca en todo el modelo una medida o columna con ese nombre. Las medidas tienen prioridad cuando existen tanto la medida como la columna.
+
+```bash
+te get "'Sales'[Amount]" # Same as te get Sales/Amount
+te get "'Net Sales'[Sales Amount]" # Spaced names via DAX form
+te get "[Total Sales]" # Model-wide measure-or-column lookup
+```
+
+### Contenedores y palabras clave
+
+Varios nombres funcionan como palabras clave de contenedor. Una palabra clave puede usarse sola (para enumerar todo el contenedor) o aparecer dentro de una ruta (para entrar en esa subcolección del elemento padre actual).
+
+| Palabra clave | Ámbito | Significado |
+| -------------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------------------------------------------------------- |
+| `Tables`, `Medidas`, `Columns`, `Hierarchies`, `Particiones` | Modelo | Todos los objetos de ese tipo en todo el modelo. |
+| `Relaciones`, `Roles`, `Perspectives`, `Cultures`, `DataSources`, `Expressions`, `CalculationGroups`, `Functions`, `Annotations` | Modelo | Contenedores a nivel de modelo. |
+| `Medidas`, `Columns`, `Hierarchies`, `Particiones`, `Calendars`, `CalculationItems` | Tabla | Subcontenedores dentro de una tabla. |
+| `Levels` | Jerarquía | Niveles de una jerarquía. |
+| `Members`, `TablePermissions` (alias `Permissions`) | Rol | Elementos hijos de un rol. |
+
+Algunos ejemplos muestran en qué se diferencian las rutas simples y las rutas con ámbito de contenedor:
+
+```bash
+te get Sales/Revenue # Measure or column on Sales
+te get Sales/Measures/Revenue # Same, container-scoped - disambiguates if other kinds share the name
+te get Sales/Geography/Levels/Year # Specific level of a hierarchy
+te get Roles/Admin/Members/bob@example.com # Role member
+te get Sales/refreshPolicy # Refresh-policy sub-object on a table
+te get "Measures/Revenue/KPI" # KPI sub-object of a measure
+```
+
+Pon un segmento entre comillas para forzar la coincidencia literal del nombre cuando el nombre real de un objeto coincide con una palabra clave. La tabla cuyo nombre literal es `Tables` es `'Tables'` y se accede con `te get "'Tables'"`.
+
+### Comodines en rutas de filtro
+
+Las rutas de filtro añaden un único carácter comodín - `*` - que coincide con cualquier secuencia de caracteres dentro de un solo segmento (codicioso, de un solo segmento). Los comodines permiten que `te ls` y comandos similares acoten los resultados.
+
+```bash
+te ls 'Sa*' # Tables whose name starts with Sa
+te ls 'Sales/*Amount' # Children of Sales whose name ends with Amount
+te ls '*/Amount' # An Amount column/measure across every table
+te ls 'Roles/Re*/Members' # Members of every role matching Re*
+```
+
+Una ruta de filtro con **N segmentos** produce resultados con **N niveles de profundidad**; los comodines nunca amplían automáticamente un nivel más allá de lo que hayas escrito. El atajo de un solo segmento `te ls Sales` es la excepción: un nombre de tabla sin calificar y sin comodines se expande a los elementos secundarios directos de la tabla para ajustarse a la intención de "muéstrame qué hay en Sales". En cambio, `te ls Sa*` devuelve solo las tablas coincidentes, sin expansión.
+
+El sufijo entre corchetes de DAX se rechaza en las rutas de filtro; pon entre comillas los nombres que contengan `[` y `]` si necesitas que coincidan literalmente.
+
+### Errores y sugerencias
+
+Los segmentos mal escritos generan un error contextual con una sugerencia de "quizás quisiste decir" cuando la CLI puede deducir lo que querías decir. Las rutas a las que les falta el elemento padre fallan antes de la comprobación del elemento hoja, así que los mensajes señalan el segmento que realmente está mal. Los contenedores vacíos (por ejemplo, `te ls Hierarchies` en un modelo sin jerarquías) muestran un simple mensaje de "no hay nada aquí" en lugar de un error.
+
+## Opciones globales
+
+Estas opciones están disponibles en todos los comandos y se pueden usar antes o después del nombre del subcomando.
+
+| Opción | Descripción |
+| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `-m, --model ` | Ruta al modelo semántico (carpeta TMDL, archivo `.bim` o carpeta de TE). |
+| `-s, --server ` | Nombre del Workspace o punto de conexión (p. ej., `MyWorkspace`, `powerbi://...`, `asazure://...`, `localhost`). |
+| `-d, --database ` | Nombre del modelo semántico en el Workspace. |
+| `--local` | Conecta a una instancia de Power BI Desktop en ejecución local (solo Windows). |
+| `--auth ` | Método de autenticación: `auto`, `interactive`, `spn`, `env`, `managed-identity` (predeterminado: `auto`). |
+| `--output-format ` | Formato de Stdout: `text` (predeterminado), `json`, `csv`, `tmsl` (alias `bim`), `tmdl`. `csv` se respeta en los comandos que emiten datos tabulares; `tmsl`/`tmdl` solo se respeta en `te get` y `te ls` para la serialización de objetos completos. Los comandos rechazan los formatos que no admiten. |
+| `--error-format ` | Formato de stderr para errores, advertencias y sugerencias: `text` (predeterminado) o `json`. Para cualquier otro valor, se usa `text`. Es independiente de `--output-format`, así que puedes combinar stdout en JSON con errores en texto sin formato (o viceversa). |
+| `--recent [N]` | Usa un modelo que hayas usado recientemente. Sin valor = selector interactivo; `N` = el N-ésimo más reciente (1 = el último usado). |
+| `--non-interactive` | Desactiva todas las indicaciones interactivas. Finaliza con un error accionable si falta algún dato obligatorio. |
+| `--debug` | Habilita el registro de depuración en stderr (cadenas de conexión, flujo de autenticación, tiempos). |
+
+En los comandos que leen un modelo, el orden de resolución es:
+
+el argumento posicional `` → la opción global `--model` → `--server`/`--database` (remoto) → conexión activa de `te connect` → `--recent`.
+
+## E/S del modelo
+
+### load
+
+Carga un modelo semántico y muestra un resumen del modelo: nombre, nivel de compatibilidad y recuentos generales de objetos (tablas, medidas, columnas).
+
+```bash
+te load ./model # TMDL folder
+te load model.bim # BIM file
+te load -s MyWorkspace -d MyModel # Remote workspace
+```
+
+### save
+
+Guarda un modelo en disco. Úsalo para escribir en archivos locales un modelo de un Workspace remoto, convertir formatos o guardar de nuevo las ediciones en el origen.
+
+`te save` acepta:
+
+- `-o, --output-path ` - archivo o carpeta de destino. **Opcional** - si se omite, `te save` vuelve a escribir en la ubicación de origen y conserva el formato original.
+- `--serialization ` - `tmdl`, `bim`, `te-folder`, `pbip`, `database.json`. De forma predeterminada, se deduce a partir del modelo cargado (origen BIM → BIM, TMDL `SemanticModel/` → TMDL en `definition/`).
+- `--force` - omite la validación y sobrescribe la salida existente. Algunos rechazos (contenedores ambiguos, raíces de proyecto con varios `SemanticModel`) siguen ocurriendo incluso con `--force`.
+- `--skip-bpa` - omite por completo el control de BPA.
+- `--fix-bpa` - corrige automáticamente las infracciones de BPA cuando las reglas definen una expresión de corrección.
+- `--bpa-rules ` - repetible; reemplaza `bpa.rules` de la configuración de la CLI solo en este guardado. Las reglas integradas siguen aplicándose a menos que `bpa.builtInRules` sea `false`.
+- `--skip-validation` - omite el análisis semántico y la validación de DAX para descargas rápidas en modo passthrough.
+- `--supporting-files` - genera archivos auxiliares de Fabric (`.platform`, `definition.pbism`).
+
+```bash
+te save # Save back to source (no -o needed)
+te save ./model.bim -o ./tmdl-out # Convert BIM to TMDL
+te save -o ./project --serialization pbip # Save as a PBIP project
+te save -o ./out -s my-workspace -d my-model --skip-validation # Fast download
+```
+
+> [!TIP]
+> Use `te save -o -s -d ` para descargar un modelo remoto a disco. Combínalo con `--skip-validation` para obtener el passthrough más rápido cuando solo necesites los bytes (sin análisis semántico de DAX).
+
+### open
+
+Abre un modelo en la aplicación de escritorio de Tabular Editor 3. **Solo para Windows** (requiere que TE3 esté instalado).
+
+```bash
+te open ./my-model
+```
+
+### init
+
+Crea un nuevo modelo semántico vacío en la ruta especificada.
+
+```bash
+te init ./new-model
+```
+
+## Edición del modelo
+
+### set
+
+Establece una propiedad en un objeto del modelo. Acepta un argumento ``.
+
+`te set` acepta:
+
+- `-q ` - nombre de la propiedad (por ejemplo, `expression`, `formatString`, `description`, `isHidden`).
+- `-i ` - valor (usa `-` para leer desde stdin).
+- `--save` / `--save-to ` - guarda los cambios.
+
+```bash
+te set Sales/Amount -q expression -i "SUM(Sales[Amt])" --save
+te set "'Net Sales'[Sales Amount]" -q formatString -i "#,0" --save # DAX form with spaced names
+te set Sales -q isHidden -i true --save
+```
+
+### agregar
+
+Agrega un objeto al modelo. Especifica un `` para el nuevo objeto (el elemento padre ya debe existir; el segmento final es el nuevo nombre) y el tipo mediante `-t` / `--type`. Las relaciones mantienen su sintaxis abreviada (`Sales[Key]->Dim[Key]`).
+
+`te add` acepta:
+
+- `-t, --type `: tipo de objeto. Valores comunes: `Table`, `Measure`, `Column`, `CalculatedColumn`, `Hierarchy`, `Role`, `Perspective`, `Culture`, `CalculationGroup`, `CalculationItem`. Se admite el autocompletado con la tecla Tab; la lista completa se puede obtener ejecutando `te add --help`.
+- `--if-not-exists` - sale con código `0` sin error si el objeto ya existe. Úsalo en canalizaciones de CI/CD idempotentes.
+
+```bash
+te add Sales/Revenue -t Measure -i "SUM(Sales[Amount])" --save
+te add Sales -t Table --save
+te add "Sales[ProdKey]->Product[ProdKey]" --save # Relationship shorthand
+te add Sales/MarketingFlag -t CalculatedColumn -i "Sales[Amount] > 1000" --if-not-exists --save
+te add Perspectives/Default/Sales --save # Include Sales in the Default perspective
+te add Roles/Reader -t Role --save # New role at the model level
+```
+
+En las tablas vinculadas a datos, `te add` también admite la detección del esquema desde orígenes SQL, Lakehouse o Warehouse. Consulta `te add --help` para ver `--source`, `--endpoint`, `--source-table`, `--columns`, etc.
+
+### rm
+
+Elimina un objeto. De forma predeterminada, comprueba las dependencias para evitar romper referencias existentes.
+
+`te rm` acepta:
+
+- `` — argumento posicional: el objeto que se va a eliminar.
+- `--force` — omite la comprobación de objetos dependientes.
+- `--if-exists` — sale con código `0` sin error si el objeto no existe. Úsalo en canalizaciones de CI/CD idempotentes.
+- `--dry-run` — muestra una vista previa de la eliminación sin aplicarla.
+- `--save` — guarda el cambio en el modelo cargado.
+
+```bash
+te rm Sales/Revenue --save
+te rm "'Sales'[Revenue]" --save # DAX form
+te rm Sales/Revenue --dry-run # Preview only
+te rm Sales/OldMeasure --if-exists --save # Idempotent
+```
+
+### mv
+
+Mueve o renombra un objeto del modelo. Tanto el origen como el destino son argumentos ``.
+
+```bash
+te mv Sales/Revenue Finance/Revenue --save # Move measure to another table
+te mv Sales/Revenue Sales/TotalRevenue --save # Rename measure
+```
+
+### replace
+
+Busca y reemplaza texto en los objetos del modelo. Simulación de forma predeterminada; añade `--save` para aplicar.
+
+`te replace` acepta:
+
+- `--in ` — ámbito: `names`, `expressions`, `descriptions`, `displayFolders`, `formatStrings`, `annotations`, `all` (predeterminado: `all`).
+- `--regex` — trata el patrón de búsqueda como una expresión regular.
+- `--case-sensitive` — habilita la coincidencia que distingue entre mayúsculas y minúsculas.
+- `--dry-run` - previsualiza los cambios sin aplicarlos. Comportamiento predeterminado.
+- `--save` - guarda la modificación en la ubicación de origen. Incompatible con `--revert` y `--stage`.
+- `--save-to ` - guarda en una ruta diferente (implica `--save`).
+- `--serialization ` - serialización del modelo: `tmdl`, `bim`, `te-folder`.
+- `--force` - guarda incluso si la sustitución introduce errores de validación de DAX.
+
+`--in expressions` recorre todas las propiedades que contienen expresiones:
+
+- **Medida**: `Expression`, `DetailRowsExpression`
+- **KPI**: `TargetExpression`, `StatusExpression`, `TrendExpression`
+- **Partición**: M de origen y M de sondeo
+- **Permiso de tabla**: `FilterExpression`
+- **Grupo de cálculo**: expresiones de selección
+- **Columna calculada**: expresión DAX
+
+Al añadir al modelo nuevas propiedades basadas en expresiones, se muestran automáticamente.
+
+```bash
+te replace "OldTable" "NewTable" --in expressions --save
+te replace "SUM" "SUMX" --regex --in expressions --save
+```
+
+## Inspección
+
+### ls
+
+Enumera objetos con una navegación similar a la del sistema de archivos. Acepta un argumento `` que admite comodines. Tanto los contenedores de nivel de modelo (`Tables`, `Measures`, `Columns`, `Hierarchies`, `Relationships`, `Roles`, `Perspectives`, `Cultures`) como los contenedores con ámbito de tabla (`Sales/Measures`, `Sales/Columns`, …) se admiten.
+
+`te ls` acepta:
+
+- `--type ` - limita a un tipo de objeto (`table`, `measure`, `column`, `hierarchy`, `partition`, `relationship`, `role`, `perspective`, `culture`). Sin ``, esto equivale a escribir la palabra clave del contenedor correspondiente.
+- `--paths-only` - emite una ruta de objeto por línea, ideal para pasarlo a `xargs`, `te get` o `te set`.
+- `--no-multiline` - contrae las celdas multilínea (normalmente expresiones DAX o M) a una sola línea y las trunca para que las filas sigan siendo fáciles de recorrer en tablas anchas. Solo afecta a la salida de texto; la salida JSON/CSV/TMSL no se ve afectada.
+- `--output-format tmsl` (alias `bim`) - genera los objetos coincidentes como un script TMSL/BIM. Útil para `te ls Tables --output-format bim > tables.json`. `--output-format tmdl` no es compatible con `ls` (TMDL solo admite un único objeto; usa `te get`).
+
+```bash
+te ls # All tables in the model
+te ls Sales # All children of Sales (columns + measures + hierarchies + partitions)
+te ls Sales/Measures # Just Sales's measures
+te ls 'Sales/*Amount' # Children of Sales whose name ends with Amount
+te ls 'Sa*' # Tables whose name starts with Sa (no auto-expansion)
+te ls '*/Amount' # An Amount column/measure across every table
+te ls 'Roles/Re*/Members' # Members of every role matching Re*
+te ls Sales/Geography/Levels # All levels of the Geography hierarchy
+te ls "'Net Sales'/'Sales Amount'" # Quote names containing spaces
+te ls Measures --paths-only # One Table/Measure per line for piping
+te ls --type measure # Same as `te ls Measures`
+te ls Measures --no-multiline # Wide table with column dividers, single-line DAX
+te ls Tables --output-format bim > tables.json # All tables emitted as TMSL/BIM
+```
+
+### get
+
+Obtiene las propiedades de un objeto del modelo. Acepta un ``.
+
+`te get` acepta:
+
+- `-q, --query ` - obtiene una única propiedad (por ejemplo, `expression`, `formatString`).
+- `-t, --type ` - desambigua cuando la ruta coincide con varios elementos secundarios de una tabla (p. ej., una columna y una jerarquía con el mismo nombre). Valores: `Measure`, `Column`, `CalculatedColumn`, `Hierarchy`, `Calendar`, `Partition`, `CalculationItem`.
+- `--output-format tmsl` (alias `bim`) - genera el objeto resuelto como JSON TMSL/BIM.
+- `--output-format tmdl` - genera el objeto resuelto como TMDL (solo objetos con nombre).
+
+`te get` y `te ls` comparten un único catálogo de descriptores, por lo que todas las propiedades aparecen igual en todos los formatos: la tabla de texto y las salidas JSON y CSV muestran el mismo conjunto, y al agregar una propiedad nueva al modelo queda expuesta en todas partes.
+
+```bash
+te get Sales/Amount -q expression # Print DAX
+te get "'Sales'[Amount]" # DAX form: same as Sales/Amount
+te get "[Total Sales]" # Lone-bracket: model-wide measure-or-column
+te get "'Net Sales'[Sales Amount]" -q expression # DAX form with spaced names
+te get "Sales/Revenue/KPI" # KPI sub-object of a measure
+te get Sales --output-format tmdl # Emit the table as TMDL
+te get Sales --output-format bim # Emit the table as TMSL/BIM
+te get Model -q description
+```
+
+### find
+
+Busca texto en todos los objetos del modelo.
+
+`te find` acepta:
+
+- `--in ` - igual que en `te replace` (valor predeterminado: `all`).
+- `--regex`, `--case-sensitive`, `--paths-only`.
+- `--no-multiline` - contrae el contexto de coincidencia multilínea a una sola línea. Solo para la salida de texto.
+
+`--in expressions` abarca todos los `IExpressionObject` del modelo, incluidas las `TargetExpression` / `StatusExpression` / `TrendExpression` de los KPI, la `DetailRowsExpression` de la medida, el M de origen/sondeo de la partición, la `FilterExpression` de los permisos de tabla y las expresiones `MultipleOrEmptySelection` / `NoSelection` del grupo de cálculo; así, un literal como `123` definido en el objetivo de un KPI aparece igual que el cuerpo de una medida.
+
+```bash
+te find "CALCULATE" --in expressions
+te find "Revenue" --in names
+te find "CALCULATE" --in expressions --paths-only | xargs -I{} te get {} -q expression
+```
+
+### diff
+
+Compara dos modelos para detectar diferencias estructurales. Devuelve los siguientes códigos de salida: `0` = idéntico, `1` = diferencias encontradas, `2` = error.
+
+```bash
+te diff ./model-v1 ./model-v2
+te diff old.bim new.bim
+```
+
+### deps
+
+Analiza las dependencias ascendentes y descendentes de un objeto, o detecta objetos sin usar en todo el modelo. La forma de un solo objeto acepta un ``.
+
+`te deps` admite:
+
+- `--unused` - enumera las medidas, las columnas calculadas y **todas las columnas de datos** a las que no hace referencia ninguna expresión DAX y que no se usan en ninguna relación, nivel de jerarquía, ordenación por columna, variación, base de AlternateOf ni rol de tiempo de calendario. Cada resultado muestra `(hidden)` en modo de texto y un campo `isHidden` en JSON.
+- `--hidden` - limita `--unused` a solo los objetos ocultos. Los objetos ocultos y sin usar son los candidatos más seguros para eliminar, porque ningún elemento visible para el usuario depende de ellos.
+
+```bash
+te deps Sales/Revenue # Upstream + downstream for one object
+te deps "'Sales'[Revenue]" # DAX form is accepted everywhere a is
+te deps --unused # All unused measures and columns
+te deps --unused --hidden # Only hidden, unused objects
+```
+
+## Análisis y calidad
+
+### validate
+
+Valida las expresiones del modelo, la integridad del esquema y los errores de TOM.
+
+`te validate` admite:
+
+- `--ci ` - emite anotaciones de CI en stderr: `vsts` o `github`.
+- `--trx ` - escribe los resultados en un archivo `.trx` de VSTEST.
+
+```bash
+te validate ./model
+te validate --ci github --trx results.trx
+```
+
+### bpa run
+
+Ejecuta reglas de Best Practice Analyzer contra un modelo.
+
+`te bpa run` admite:
+
+- `` - argumento posicional: ruta al modelo (alternativa a la opción global `--model`).
+- `-r, --rules ` - ruta(s) o URL(s) a archivo(s) de reglas BPA en formato JSON. Se puede repetir. Sustituye la capa de reglas de usuario en esta invocación: consulta [Orígenes y resolución de reglas](#rule-sources-and-resolution) más abajo.
+- `--no-model-rules` - excluye las reglas de BPA incrustadas en las anotaciones del modelo.
+- `--no-defaults` - excluye las reglas predeterminadas de BPA integradas.
+- `--vpax ` - carga estadísticas del Analizador VertiPaq desde un archivo `.vpax` para habilitar reglas compatibles con VPA.
+- `--vpa-rules` - incluir reglas integradas compatibles con VPA (requiere `--vpax` o un modelo preanotado).
+- `--allow-external-rules` - permitir obtener archivos de reglas de BPA desde direcciones URL incrustadas en las anotaciones del modelo.
+- `--rule ` - ejecutar solo regla(s) específicas por ID. Se puede repetir.
+- `--path ` - limitar el análisis a las tablas que contengan los objetos coincidentes. Acepta nombres literales, palabras clave de contenedor y comodines (por ejemplo, `'Sales'`, `'Sa*'`, `'Sales/Medidas'`, `'*/Amount'`).
+- `--fix` - aplicar expresiones de corrección para corregir automáticamente las infracciones cuando sea posible.
+- `--save` - volver a guardar el modelo en el origen después de aplicar las correcciones.
+- `--save-to ` - guardar el modelo en una ruta diferente después de aplicar las correcciones.
+- `--serialization ` - serialización del modelo: `tmdl`, `bim`, `te-folder`.
+- `--fail-on ` - umbral de fallo: `error` (predeterminado) o `warning`. Sale con el código `1` cuando las infracciones alcanzan el umbral.
+- `--ci ` - emitir comandos de registro de CI a stderr: `vsts` (Azure DevOps), `github` (GitHub Actions).
+- `--trx ` - escribir los resultados como un archivo `.trx` de VSTEST en la PATH especificada.
+- `--no-multiline` - contraer el contenido de varias líneas de las celdas de la tabla de infracciones en una sola línea. Solo salida de texto.
+
+```bash
+te bpa run --fail-on error --ci github
+te bpa run --fix --save
+te bpa run --rule PERF_UNUSED_HIDDEN_COLUMN
+te bpa run --path Sales # Tables touched by the Sales filter only
+te bpa run --path 'Sa*' # Wildcard - every table starting with Sa
+te bpa run --path Sales/Measures # Path filter applied to the matched tables
+```
+
+#### Orígenes de las reglas y su resolución
+
+Cada invocación de `te bpa run` reúne reglas de tres capas independientes:
+
+1. **Reglas de usuario** - se aplica exactamente un origen, en este orden de prioridad:
+ - `-r, --rules `: acepta una PATH de archivo o una URL (prioridad más alta)
+ - La variable de entorno `TE_BPA_RULES`
+ - la matriz `bpa.rules` de la configuración de la CLI (`~/.config/te/config.json`)
+2. **Reglas integradas predeterminadas** - se cargan a menos que se pase `--no-defaults` o que [`bpa.builtInRules`](xref:te-cli-config#built-in-bpa-rules) sea `false` en la configuración. Se omiten las reglas integradas individuales incluidas en `bpa.disabledBuiltInRuleIds`.
+3. **Reglas integradas en el modelo** - reglas en la anotación `BestPracticeAnalyzer_Rules` del modelo; se cargan a menos que se pase `--no-model-rules`. Se omiten las anotaciones de URL externas, a menos que también pases `--allow-external-rules`.
+
+Se eliminan los ID de reglas duplicados (las reglas del usuario prevalecen sobre las integradas). Después se eliminan los ID de reglas de la anotación `BestPracticeAnalyzer_IgnoreRules` del modelo.
+
+La línea `Rules loaded:` de la salida atribuye cada capa que contribuye, por ejemplo:
+
+```
+Rules loaded: 41 from 1 file(s) from bpa.rules config + built-in defaults + model annotations
+```
+
+### reglas de bpa
+
+Administra colecciones de reglas de BPA: enumera, inspecciona, inicializa y activa o desactiva reglas en tu archivo local de reglas o en las anotaciones del modelo. Las reglas integradas son de solo lectura; para omitir una sin perder el resto, usa `te bpa rules disable` (no edites directamente el conjunto integrado).
+
+Subcomandos:
+
+| Subcomando | Propósito |
+| ------------------------------- | ------------------------------------------------------------------------------------------- |
+| `add [model]` | Agrega una nueva regla de BPA. |
+| [`disable`](#bpa-rules-disable) | Desactiva una regla de BPA integrada para el usuario actual. |
+| [`enable`](#bpa-rules-enable) | Vuelve a activar una regla de BPA integrada que se había desactivado antes. |
+| `ignore [model]` | Agrega una regla a la lista de ignorados del modelo. |
+| [`init`](#bpa-rules-init) | Crea un archivo vacío de reglas de BPA en la ruta PATH resuelta. |
+| [`list`](#bpa-rules-list) | Enumera las reglas de BPA de todos los orígenes con su estado. |
+| `rm [model]` | Elimina una regla de BPA. |
+| `set [model]` | Actualiza las propiedades de una regla del BPA. |
+| `unignore [model]` | Elimina una regla de la lista de reglas ignoradas del modelo. |
+
+Todos los subcomandos de `te bpa rules` aceptan:
+
+- `--rules-file `: ruta a un archivo JSON de reglas del BPA. De forma predeterminada, se usa la primera entrada existente de `bpa.rules` en la configuración de la CLI (`~/.config/te/config.json`) o la variable de entorno `TE_BPA_RULES`.
+- `--model-rules`: opera sobre las reglas incrustadas en la anotación del modelo en lugar de un archivo.
+
+> [!IMPORTANT]
+> `te bpa rules set` y `te bpa rules rm` se niegan a modificar los ID de reglas integradas. Si intentas hacerlo, el comando finaliza con el código `1` y te indica que uses `te bpa rules disable`. Para personalizar el comportamiento de una regla integrada, deshabilita la regla integrada y agrega una copia personalizada con un identificador distinto:
+>
+> ```bash
+> te bpa rules disable TE3_BUILT_IN_DATE_TABLE_EXISTS
+> te bpa rules add MY_DATE_TABLE_EXISTS
+> ```
+
+#### bpa rules list
+
+Muestra las reglas de todos los orígenes (integradas, de usuario y del modelo).
+
+`te bpa rules list` acepta:
+
+- (predeterminado) Solo las reglas activas.
+- `--all`: incluye las reglas deshabilitadas e ignoradas.
+- `--disabled`: solo los ID de reglas integradas que el usuario ha deshabilitado mediante `te bpa rules disable`.
+- `--ignored`: solo las reglas cuyos ID aparecen en `BestPracticeAnalyzer_IgnoreRules` en el modelo.
+- `--no-defaults`: excluye las reglas integradas de la salida.
+
+```bash
+te bpa rules list # Active rules
+te bpa rules list --all # Include disabled and ignored rules
+te bpa rules list --ignored
+```
+
+Las reglas integradas deshabilitadas se marcan con un marcador `[disabled]` junto al ID de la regla.
+
+#### bpa rules init
+
+Crea un archivo de reglas del BPA vacío (`[]`) en el PATH configurado. Úsalo una vez antes de ejecutar `te bpa rules set` / `te bpa rules rm` sobre una ruta que todavía no existe.
+
+`te bpa rules init` acepta:
+
+- `--force`: sobrescribe un archivo existente con `[]`. Es obligatorio si el archivo de destino ya existe.
+- `--rules-file ` - ruta del archivo de destino. Puede aparecer antes o después del subcomando `init`.
+
+Resolución de rutas (PATH; se usa la primera coincidencia): `--rules-file` → variable de entorno `TE_BPA_RULES` → primera entrada de `bpa.rules[]` en la configuración de tu CLI → `./BPARules.json` (directorio de trabajo actual).
+
+```bash
+te bpa rules init
+te bpa rules init --rules-file ./MyRules.json
+te bpa rules init --force
+```
+
+#### bpa rules disable
+
+Deshabilita una regla BPA integrada específica. El identificador de la regla se agrega a `bpa.disabledBuiltInRuleIds` en la configuración de tu CLI. Las ejecuciones posteriores del gate (deploy, save, mutation) y `te bpa run` omiten la regla deshabilitada.
+
+El comando es idempotente: ejecutar `disable` sobre una regla ya deshabilitada finaliza correctamente sin modificar la configuración. Finaliza con el código `1` si `` no es una regla BPA integrada; usa `te bpa rules list` para ver los identificadores válidos de reglas BPA integradas.
+
+```bash
+te bpa rules disable TE3_BUILT_IN_DATE_TABLE_EXISTS
+```
+
+#### bpa rules enable
+
+Vuelve a habilitar una regla BPA integrada deshabilitada anteriormente al quitar el identificador de la regla de `bpa.disabledBuiltInRuleIds`. Finaliza con el código `1` si la regla no está deshabilitada actualmente.
+
+```bash
+te bpa rules enable TE3_BUILT_IN_DATE_TABLE_EXISTS
+```
+
+### vertipaq
+
+Analiza las estadísticas de almacenamiento de VertiPaq.
+
+`te vertipaq` acepta:
+
+- `--columns`, `--relationships`, `--partitions`, `--all`.
+- `--export ` - exporta las estadísticas de VertiPaq a un archivo `.vpax` para analizarlas sin conexión.
+- `--import ` - carga un archivo `.vpax` exportado previamente y lo analiza sin conexión.
+- `--obfuscate` - ofusca nombres y expresiones en el VPAX exportado.
+- `--top `, `--stats`, `--annotate`, `--save`.
+
+```bash
+te vertipaq # Columns by size (default)
+te vertipaq --all # Tables, columns, relationships, partitions
+te vertipaq --export stats.vpax
+te vertipaq --import stats.vpax # Analyze offline
+```
+
+### format
+
+Da formato a expresiones DAX o M/Power Query.
+
+`te format` acepta:
+
+- `-e, --expression ` - da formato a una sola expresión en línea.
+- `-p, --path ` - da formato a una medida o columna específica mediante su ruta.
+- `--lang ` - valor predeterminado: `dax`.
+- `--save` / `--save-to` - guarda las expresiones formateadas.
+
+```bash
+te format --save # Format all DAX
+te format -p Sales/Amount --save # Single measure
+te format -e "SUM ( Sales[Amount] )" # Inline
+te format --lang m --save # Format M
+```
+
+## Ejecución
+
+### consulta
+
+Ejecuta una consulta DAX contra un modelo implementado.
+
+`te query` admite:
+
+- `-q, --query ` - consulta en línea.
+- `--file ` - consulta desde un archivo.
+- `--limit ` - valor predeterminado: 100.
+- `-o, --output-file ` - escribe los resultados en un archivo (`.csv`, `.tsv`, `.json`, `.dax`).
+- `--trace`, `--cold`, `--plan`, `--runs ` - seguimiento del rendimiento y pruebas comparativas.
+- `--no-validate` - omite la validación semántica de DAX previa a la ejecución.
+
+```bash
+te query -q "EVALUATE TOPN(5, 'Sales')" -s my-ws -d my-model
+te query --file query.dax --output-format json
+```
+
+### script
+
+Ejecuta uno o varios C# Scripts contra un modelo semántico. La CLI usa el mismo host de scripts que Tabular Editor 3 Desktop, así que un script que se ejecuta en TE3 se ejecuta aquí sin cambios.
+
+`te script` admite:
+
+- `-S, --script ` - archivo `.cs` / `.csx` (repetible).
+- `-e, --expression ` - C# en línea (usa `-` para stdin).
+- `--save` / `--save-to` / `--serialization`.
+- `--dry-run`, `--timeout `.
+
+```bash
+te script --script fix.cs --save
+te script -e "Info(Model.Tables.Count)"
+echo "Info(Model.Name);" | te script -e -
+```
+
+> [!IMPORTANT]
+> Dos detalles de comportamiento que conviene conocer si vas a portar un script antiguo:
+>
+> - **No hay selección interactiva en los scripts de la CLI.** Los asistentes de TE3 Desktop `SelectMeasure()`, `SelectTable()`, `SelectColumn()`, `SelectObject()` y `SelectObjects()` lanzan `NotSupportedException` cuando se invocan desde `te script` - la CLI no tiene interfaz de usuario para mostrar una ventana emergente. Resuelve previamente el/los objeto(s) fuera del script y pásalos, o encapsula la llamada en `try/catch` si el script se comparte con TE3.
+> - **Las directivas `using` predeterminadas coinciden con las de TE3 Desktop.** Los scripts que usan `DataTable`, `File`, `StringBuilder` o `Regex` deben incluir explícitamente la directiva correspondiente `using System.Data;` / `using System.IO;` / `using System.Text;` / `using System.Text.RegularExpressions;`.
+
+> [!NOTE]
+> **Símbolos del preprocesador para scripts compartidos entre hosts.** Los scripts compilados por `te script` tienen definido el símbolo `TECLI`. En los scripts de TE3 Desktop se define `TE3` en su lugar, además de símbolos acotados por versión como `TE3_3_10_OR_GREATER` ... `TE3_3_X_OR_GREATER` para la versión menor actual de TE3. TE2 no define ninguno de los dos símbolos. Úselos para escribir scripts portátiles:
+>
+> ```csharp
+> #if TECLI
+> // CLI-only code - no UI calls
+> Info($"Running under the CLI on {Environment.OSVersion.Platform}");
+> #elif TE3
+> // TE3 Desktop-only code - UI APIs available
+> ShowMessage("Hello from TE3");
+> #else
+> // TE2 (legacy) - neither TECLI nor TE3 is defined
+> Info("Hello from TE2");
+> #endif
+>
+> #if TE3_3_15_OR_GREATER
+> // Gated on a specific TE3 minor version
+> #endif
+> ```
+>
+> Consulta @csharp-scripts para conocer el panorama general del scripting entre versiones.
+
+### macro
+
+Administra y ejecuta macros desde un archivo JSON de macros (normalmente `MacroActions.json`). El archivo de macros se determina en este orden: `--macros ` → la variable de entorno `TE_MACROS_PATH` → `macros` en la configuración de la CLI → `./MacroActions.json`.
+
+Subcomandos:
+
+| Subcomando | Propósito |
+| -------------------------------- | --------------------------------------------------------------------- |
+| `list` | Listar macros. |
+| [`run `](#macro-run) | Ejecutar una macro. |
+| `add ` | Agregar una macro. |
+| `set ` | Actualizar las propiedades de la macro. |
+| `rm ` | Eliminar una macro. |
+| `sort` | Ordenar y reasignar los identificadores. |
+| [`init`](#macro-init) | Crear un archivo de macros vacío en la ruta resuelta. |
+
+#### macro init
+
+Crea un archivo de macros vacío (`{"Actions":[]}`) en la ruta configurada. Úsalo una sola vez cuando el archivo de macros resultante aún no exista.
+
+`te macro init` acepta:
+
+- `--force` - sobrescribe un archivo existente. Obligatorio si el destino ya existe.
+- `--macros ` - ruta del archivo de destino. Puede aparecer antes o después del subcomando `init`.
+
+```bash
+te macro init
+te macro init --macros ./project-macros.json
+te macro init --force
+```
+
+#### macro run
+
+Ejecuta una macro. Las macros que emiten tablas mediante `dataTable.Output()` muestran una salida con formato en la terminal, por lo que las macros de consulta de estilo DAX funcionan igual en `te macro run` que en TE3.
+
+`te macro run` acepta:
+
+- `--on ` - establece el contexto de selección de la macro en un único objeto con nombre (una tabla, una medida, una columna, …). Equivale a hacer clic con el botón derecho en ese objeto en TE3 e invocar la macro desde el menú contextual.
+- `--save` / `--save-to` - guarda cualquier cambio que realice la macro.
+
+```bash
+te macro run "Hide all measures"
+te macro run "Format DAX" --on Sales/Revenue --save
+te macro run "Format DAX" --on "'Net Sales'[Sales Amount]" --save # DAX form works in --on too
+```
+
+## Implementación y actualización
+
+### deploy
+
+Implementa un modelo semántico en Power BI, Fabric o Azure Analysis Services.
+
+`te deploy` acepta:
+
+- `-s, --server` / `-d, --database` - Workspace y modelo de destino.
+- `--deploy-full` - sobrescribir + conexiones + particiones + expresiones compartidas + roles + miembros de roles.
+- `--deploy-connections`
+- `--deploy-partitions`
+- `--skip-refresh-policy`
+- `--deploy-roles`
+- `--deploy-role-members`
+- `--deploy-shared-expressions`
+- `--create-only`
+- `--xmla ` - genera un script XMLA/TMSL en lugar de realizar el despliegue (`-` para stdout).
+- `--skip-bpa` - omite por completo el control de BPA.
+- `--fix-bpa` - corrige automáticamente las infracciones de BPA cuando las reglas definan una expresión de corrección.
+- `--bpa-rules ` - se puede repetir; anula `bpa.rules` de la configuración de tu CLI solo para este despliegue. Las reglas integradas siguen aplicándose a menos que `bpa.builtInRules` sea `false`.
+- `--force` - omite la confirmación interactiva (necesario para CI).
+- `--ci ` - `vsts` o `github`.
+- `--profile ` - uso puntual de un perfil de @te-cli-auth guardado.
+
+```bash
+te deploy ./model -s my-workspace -d my-model --force --ci github
+te deploy ./model --xmla script.tmsl # Generate TMSL only
+te deploy ./model --profile staging --force
+```
+
+> [!IMPORTANT]
+> `te deploy` ejecuta el Best Practice Analyzer como control previo antes de realizar el despliegue. En modo interactivo, se muestran un resumen y un mensaje de confirmación, con **`n` como opción segura predeterminada**. En CI, pasa `--force` para omitir la confirmación. Consulta @te-cli-config para la configuración del control de BPA.
+
+### refresh
+
+Inicia una actualización de datos en un modelo implementado.
+
+`te refresh` admite:
+
+- `--type ` - `full`, `dataonly`, `automatic`, `calculate`, `clearvalues`, `defragment`, `add` (predeterminado: `automatic`).
+- `--table ` - actualiza tabla(s) específicas; se puede repetir.
+- `--partition ` - actualiza partición(es) específicas.
+- `--apply-refresh-policy` - aplica la política de actualización para determinar qué particiones se actualizan con la actualización incremental.
+- `--effective-date ` - establece la fecha efectiva que usa la política de actualización.
+- `--max-parallelism ` - establece el número máximo de particiones que se pueden actualizar en paralelo.
+- `--dry-run` - muestra el script TMSL sin ejecutarlo.
+- `--no-progress`, `--trace [path]`.
+
+```bash
+te refresh --type full # Full refresh
+te refresh --table Sales --type full # Single table
+te refresh --type full --dry-run > refresh.tmsl # Emit TMSL only
+```
+
+### incremental-refresh
+
+Gestiona las políticas de actualización para la actualización incremental de las tablas.
+
+```bash
+te incremental-refresh show
+```
+
+Los subcomandos adicionales (`set`, `remove`, `apply`) están documentados en `te incremental-refresh --help`.
+
+## Pruebas
+
+### test run
+
+Ejecuta un conjunto de pruebas de aserción de DAX contra un modelo desplegado.
+
+`te test run` admite:
+
+- `--suite ` - directorio de la suite de pruebas (predeterminado: `.te-tests/`).
+- `--tag ` - solo las pruebas con esta etiqueta.
+- `--fail-on ` - `error` (predeterminado) o `warning`.
+- `--ci `, `--trx ` - anotaciones de CI y salida TRX.
+
+```bash
+te test run --ci github --trx results.trx
+te test run --tag revenue
+```
+
+### test init / spec / use / list / snapshot / compare
+
+Los subcomandos adicionales permiten crear la estructura de las pruebas, imprimir el formato de la especificación de aserciones, cambiar la suite activa, listar las suites, capturar instantáneas y comparar modelos. Consulta `te test --help` para más detalles.
+
+```bash
+te test init --example # Scaffold an example suite
+te test spec # Print the full assertion format reference
+te test init --from-model --model ./my-model # Generate stubs from your measures
+```
+
+## Conexión y autenticación
+
+### connect
+
+Establece (o muestra) la conexión activa para la sesión actual del terminal. Consulta @te-cli-auth.
+
+```bash
+te connect # Show current active connection
+te connect my-workspace my-model # Remote
+te connect ./model # Local
+te connect --local # Power BI Desktop (Windows)
+te connect --profile prod # Activate a saved profile
+te connect --clear # Clear the active connection (and any workspace mirror)
+```
+
+#### Modo del área de trabajo (`-w` / `--workspace`)
+
+Empareja un origen principal con un destino secundario para que cada `--save` posterior sincronice el modelo entre ambos. Útil para mantener una copia de trabajo local de un Workspace remoto o para enviar los cambios locales a un Workspace al guardar.
+
+- `te connect -w ./src` - el origen principal es remoto; `./src` recibe una exportación inicial de TMDL y refleja cada guardado.
+- `te connect ./src -w ` - el origen principal es local; un despliegue inicial envía el modelo al Workspace, y los guardados posteriores lo vuelven a desplegar automáticamente.
+- `--workspace-format ` - elige el formato en disco al sincronizarlo con una carpeta o archivo (por ejemplo, `-w ./model.bim` deduce BIM).
+- `--force`: obligatorio cuando el destino ya existe (carpeta no vacía o base de datos existente). Sin él, `te connect` muestra un prompt interactivo `y/n`, con `n` como opción segura predeterminada.
+
+Una vez activado, `te set --save`, `te rm --save`, `te script --save`, etc. guardan de forma transparente en ambos destinos. El orden de guardado siempre es **primero local y después remoto**, para que la copia en disco refleje el último cambio del usuario aunque falle el envío al servidor. Borra la réplica con `te connect --clear`.
+
+```bash
+te connect Finance "Revenue Model" -w ./revenue-model # Mirror remote → local TMDL
+te connect ./revenue-model -w Finance "Revenue Model" # Mirror local → remote
+```
+
+### auth login / status / logout
+
+Administra la autenticación almacenada en caché. Consulta @te-cli-auth.
+
+### profile list / show / set / remove
+
+Administra perfiles de conexión con nombre. Consulta @te-cli-auth.
+
+## Configuración
+
+### config show / paths / init / set
+
+Consulta y administra la configuración de la CLI y las sobrescrituras de PATH de TE3. Consulta @te-cli-config.
+
+```bash
+te config show # Display all settings
+te config paths # Resolved TE3 file paths
+te config init # Create default config
+te config set autoFormat true
+```
+
+### license
+
+`te license` está reservado para la versión GA y no está disponible en esta versión preliminar. El comando sigue integrado con el analizador, por lo que los scripts existentes que lo invocan no darán error durante el análisis, pero todos los subcomandos finalizan con el código de salida `1` y mensajes de "no está disponible en esta versión preliminar". Consulta el [aviso de versión preliminar](xref:te-cli#preview-notice) en la página de información general para conocer el panorama más amplio de licencias.
+
+### migrate
+
+Guía de referencia que muestra cómo las opciones heredadas de la CLI de Tabular Editor 2 se corresponden con la nueva CLI. Útil como referencia rápida mientras migras una canalización basada en TE2. Consulta @te-cli-migrate para ver la guía de migración completa.
+
+```bash
+te migrate # Full flag mapping table
+te migrate -A # Look up a single TE2 flag
+te migrate --output-format json # Machine-readable mapping
+```
+
+## Shell
+
+### interactive
+
+Inicia una sesión REPL guiada con un prompt adaptado al modelo. Consulta @te-cli-interactive.
+
+```bash
+te interactive # Connect later
+te interactive ./model # Start with a local model
+te interactive -s MyWorkspace -d MyModel # Start with a remote model
+```
+
+Las comillas y las referencias de estilo DAX funcionan igual que fuera de la sesión - consulta la sección [Rutas de objetos](#object-paths) de arriba y @te-cli-interactive para más detalles sobre la división de argv con reconocimiento de corchetes dentro del REPL.
+
+### completion
+
+Genera un script de autocompletado para el shell. Consulta @te-cli-install.
+
+```bash
+te completion bash
+te completion zsh
+te completion pwsh
+```
+
+## Códigos de salida
+
+| Código de salida | Significado |
+| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `0` | Éxito. |
+| `1` | Fallo genérico (argumentos no válidos, fallo del comando, errores de validación, fallo de autenticación, el BPA gate falló con una gravedad ≥ error). |
+| `2` | Diff distinto de cero (`te diff`): los modelos difieren. |
+
+Para un control detallado en las canalizaciones de CI, combina los códigos de salida con las anotaciones `--ci ` y los archivos de resultados `--trx`; consulta @te-cli-cicd.
+
+## Páginas relacionadas
+
+- @te-cli - información general y contexto.
+- @te-cli-install - instalación y configuración de la CLI.
+- @te-cli-auth - autenticación y administración de conexiones.
+- @te-cli-config - archivo de configuración, BPA gate y comportamiento tras la mutación.
+- @te-cli-migrate - mapeo de opciones TE2 → TE3.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-config.md b/localizedContent/es/content/features/te-cli/te-cli-config.md
new file mode 100644
index 000000000..226405a52
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-config.md
@@ -0,0 +1,258 @@
+---
+uid: te-cli-config
+title: Configuración personalizada
+author: Peer Grønnerup
+updated: 2026-04-20
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# Configuración personalizada
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+La CLI de Tabular Editor lee una configuración opcional desde un archivo JSON. La configuración controla tres cosas:
+
+- **PATH de archivos** — donde la CLI lee las macros, las reglas de BPA y (opcionalmente) el ejecutable de TE3 Desktop, y donde escribe el registro de consultas.
+- **Valores predeterminados de comportamiento** — umbrales de BPA, formato automático y validación.
+- **Perfiles de conexión guardados** — la lista de perfiles con nombre entre los que puedes alternar.
+
+La CLI es independiente: no lee ni escribe en ningún PATH de instalación de la versión de escritorio de Tabular Editor 3. Los archivos de reglas de BPA y de macros deben definirse explícitamente en esta configuración (o inicializarse cuando haga falta con `te bpa rules init` / `te macro init`).
+
+La mayoría de los usuarios no necesitan editar el archivo de configuración directamente: `te config show`, `te config set ` y `te profile set` cubren las operaciones habituales.
+
+## Ubicación del archivo de configuración
+
+Se comprueban las siguientes ubicaciones en este orden:
+
+1. La variable de entorno `$TE_CONFIG` (si está definida y el archivo existe).
+2. `~/.config/te/config.json` (en Windows, `%USERPROFILE%\.config\te\config.json`).
+3. Si no hay archivo de configuración, la CLI usa los valores predeterminados integrados.
+
+`TE_CONFIG` se tiene en cuenta de forma coherente en todas las operaciones del archivo de configuración: `te config show`, `te config set`, `te config init` y `te config paths` leen y escriben en el PATH resuelto. Está pensado principalmente para pruebas, instalaciones mediante scripts y configuración por entorno.
+
+Para crear una configuración predeterminada:
+
+```bash
+te config init # Create config at TE_CONFIG (or ~/.config/te/config.json)
+te config init --force # Overwrite existing config
+```
+
+## Ver la configuración
+
+```bash
+te config show # Display all settings
+te config show --output-format json # Machine-readable
+te config paths # Show resolved macros and BPA rule paths
+```
+
+Usa `te config paths` para ver qué archivos usará realmente la CLI para las macros y las reglas de BPA. Es útil para depurar por qué faltan archivos de datos. La salida muestra dos filas: `macros` (la ruta del archivo de macros resuelta o `[not set]`) y `bpa.rules` (el primer archivo de reglas de BPA existente resuelto por el resolvedor de rutas, o `[not set]`).
+
+> [!NOTE]
+> `te config paths` emite campos `null` explícitamente en el modo `--output-format json` (por ejemplo, `{"macros": null, "bpa": {"rules": null}}`). Informar de los resultados de la resolución es precisamente el propósito del comando, así que `null` es una respuesta significativa: «se intentó, pero no se resolvió nada». `te config show --output-format json` elimina los campos `null` de forma predeterminada, así que quienes lo consuman deberían parsearlo de forma tolerante.
+
+## Configurar valores
+
+```bash
+te config set autoFormat true
+te config set bpa.onDeploy false
+te config set hidePreviewNotice true
+te config set macros null # Clear a path override
+```
+
+Las claves desconocidas provocan que el comando finalice con el código de salida `1` y un error que enumera las claves válidas.
+
+Si no existe ningún archivo de configuración, `te config set` crea uno automáticamente en la ruta resuelta (`$TE_CONFIG` si está establecido; de lo contrario, `~/.config/te/config.json`) antes de aplicar el cambio.
+
+> [!NOTE]
+> Puedes establecer cualquier clave del esquema mediante `te config set`, incluidas las claves anidadas mediante rutas con puntos (`bpa.onDeploy`, `formatOptions.useSqlBiDaxFormatter`, etc.). La única excepción es `formatVersion`, que la CLI administra automáticamente. Ejecuta `te config paths` para encontrar el archivo de configuración si prefieres editar el JSON directamente.
+
+## Esquema completo
+
+El esquema completo de configuración JSON con todas las claves en sus valores predeterminados. Úsalo como referencia al editar directamente el archivo de configuración o al buscar la ruta con puntos para una llamada a `te config set`.
+
+```json
+{
+ "formatVersion": 1,
+ "macros": null,
+ "autoFormat": false,
+ "validateOnMutation": true,
+ "vertipaqOnRefresh": false,
+
+ "bpa": {
+ "rules": null,
+ "onDeploy": true,
+ "onSave": true,
+ "onMutation": false,
+ "builtInRules": true,
+ "disabledBuiltInRuleIds": null
+ },
+
+ "interactiveEditMode": "stage",
+
+ "formatOptions": {
+ "useSemicolons": false,
+ "shortFormat": false,
+ "skipSpaceAfterFunction": false,
+ "useSqlBiDaxFormatter": false
+ },
+
+ "hidePreviewNotice": false,
+ "spinner": true,
+ "debug": false,
+ "disableTelemetry": false,
+
+ "queryLog": null,
+ "te3ExePath": null,
+
+ "profiles": {}
+}
+```
+
+### Rutas de archivo
+
+Configúralas en tu configuración para evitar pasar las mismas rutas en cada comando. Las opciones específicas de cada comando y las variables de entorno prevalecen sobre los valores de configuración; consulta [Prioridad de resolución de rutas](#path-resolution-priority) más abajo.
+
+| Clave | Significado |
+| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `macros` | Ruta explícita a un archivo JSON de macros (normalmente `MacroActions.json`). La resuelve cualquier comando `te macro`. Apunta a un archivo compartido (un recurso compartido de red, un archivo local del repositorio o incluso el archivo de escritorio de TE3) para reutilizar el mismo conjunto de macros en distintos equipos y entre la CLI y TE3 Desktop. |
+| `bpa.rules` | Lista ordenada de rutas o URL a archivos de reglas de BPA. `te bpa run` y la compuerta de implementación/guardado cargan **todas** las entradas existentes; `te bpa rules list` y `te config paths` usan la primera entrada existente. Los valores separados por comas en `te config set bpa.rules ...` se separan en el arreglo. |
+| `te3ExePath` | Ruta explícita al ejecutable de Tabular Editor 3 Desktop (`TabularEditor.exe`). `te open` lo usa **solo** para iniciar la aplicación de escritorio; puedes dejarlo sin configurar en Linux/macOS o cuando no uses `te open`. Si no está configurado, `te open` recurre a una búsqueda en `PATH`. |
+| `queryLog` | Ruta a un archivo de registro en el que cada invocación de `te query` añade el texto de la consulta y los metadatos de ejecución. Útil para mantener registros de auditoría o analizar patrones de consulta a lo largo del tiempo. Admite `~` para el directorio personal (p. ej., `~/.config/te/queries.log`). |
+
+### Prioridad de resolución de rutas
+
+Para cada archivo proporcionado por el usuario (macros, reglas de BPA), la CLI resuelve la ruta en este orden:
+
+1. **Opción de línea de comandos** - `--macros ` para comandos de macros; `--bpa-rules ` para la compuerta de implementación/guardado; `--rules-file ` para los subcomandos de `te bpa rules`.
+2. **Variable de entorno** - `TE_MACROS_PATH` para macros, `TE_BPA_RULES` para reglas de BPA.
+3. **Configuración de la CLI** - `macros` para macros, la primera entrada existente de `bpa.rules[]` para reglas de BPA.
+
+La CLI no detecta automáticamente ninguna ubicación de instalación de TE3; configúralas explícitamente. Para empezar con un archivo predeterminado en el directorio de trabajo actual, ejecuta `te macro init` (crea `./MacroActions.json`) o `te bpa rules init` (crea `./BPARules.json`).
+
+Ejecuta `te config paths` para ver qué archivo resolvió realmente la CLI.
+
+### Valores predeterminados de comportamiento
+
+Toda la configuración relacionada con BPA está en el objeto `bpa` y se referencia mediante claves con puntos en `te config set`.
+
+| Clave | Predeterminado | Descripción |
+| ---------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `autoFormat` | `false` | Ejecuta DAX Formatter sobre las expresiones modificadas después de `te add` / `te set` / `te mv` / `te macro run`. Usa el formateador interno de forma predeterminada; puedes optar por el servicio web de SQL BI mediante `formatOptions.useSqlBiDaxFormatter`. |
+| `validateOnMutation` | `true` | Después de un comando de modificación (`add`, `set`, `mv`, `replace --save`, `macro run`), comprueba que todas las referencias `Table[Column]` del modelo se sigan resolviendo. Detecta referencias huérfanas introducidas por cambios de nombre o eliminaciones antes de llegar al despliegue. |
+| `bpa.onMutation` | `false` | Ejecuta un análisis de BPA acotado después de cada comando de modificación (`set`, `add`, `mv`, `rm`, `macro run`). Solo se comprueban los objetos de la tabla afectada, no los de todo el modelo; útil para obtener retroalimentación rápida durante ediciones iterativas. |
+| `bpa.onDeploy` | `true` | Ejecuta el control de BPA antes de que se ejecute `te deploy`. El despliegue se cancela si alguna regla se activa con una severidad ≥ error. Omítelo en una invocación concreta con `--skip-bpa`, o corrígelo automáticamente con `--fix-bpa`. |
+| `bpa.onSave` | `true` | Ejecuta el control de BPA antes de que `te save -o` escriba en disco. Omítelo en una invocación concreta con `--skip-bpa` o `--force`. |
+| `bpa.builtInRules` | `true` | Incluye el conjunto depurado de reglas integradas de BPA cada vez que se ejecute el control. Configúralo en `false` para ignorar por completo las reglas integradas; entonces el control ejecutará solo las reglas configuradas mediante `bpa.rules` y cualquier regla incrustada en el modelo. |
+| `bpa.disabledBuiltInRuleIds` | `null` | ID de reglas integradas individuales que se excluirán de la puerta de calidad. Este valor se modifica mediante `te bpa rules disable ` / `te bpa rules enable `; es preferible usar esos comandos en lugar de editar el arreglo directamente. |
+| `vertipaqOnRefresh` | `false` | Tras una actualización correcta (`full`, `dataonly`, `automatic` o `add`), ejecuta automáticamente el análisis de VertiPaq para mostrar estadísticas de almacenamiento de las tablas actualizadas. Útil para detectar de inmediato regresiones inesperadas de cardinalidad o memoria. |
+| `interactiveEditMode` | `stage` | Comportamiento predeterminado para las mutaciones en memoria dentro de `te interactive`. `stage` mantiene las mutaciones en memoria hasta que se invoca `save` (la opción más segura); `save` escribe en el origen después de cada comando que modifica el estado (úsese con cuidado en orígenes remotos: cada `set` desencadena una escritura XMLA); `revert` descarta las mutaciones después de cada comando, a menos que se haya pasado `--save` o `--stage`. Las marcas `--save` / `--revert` / `--stage` por comando siempre prevalecen. |
+| `disableTelemetry` | `false` | Desactiva la telemetría de uso anónima. La CLI recopila datos básicos de uso de comandos (nombre del comando, código de salida y duración) para orientar la priorización de funciones. La CLI nunca recopila el contenido del modelo, PATH ni el texto de las consultas. |
+
+```bash
+te config set bpa.rules "/etc/te/team.json,/etc/te/strict.json"
+te config set bpa.onDeploy true
+te config set bpa.builtInRules false
+te config set bpa.disabledBuiltInRuleIds "TE3_BUILT_IN_DATE_TABLE_EXISTS,TE3_BUILT_IN_HIDE_FOREIGN_KEYS"
+```
+
+### Opciones de formato
+
+Se aplica siempre que la CLI invoque un formateador de DAX (para `te format` y, cuando está habilitado, para `autoFormat` en las mutaciones). La CLI incluye un formateador propio que funciona completamente sin conexión; activa el servicio web de SQL BI [daxformatter.com](https://www.daxformatter.com) mediante `formatOptions.useSqlBiDaxFormatter` si necesitas ese estilo o quieres igualar el comportamiento de TE2 o TE3 con "Use daxformatter.com..." activado.
+
+| Clave | Predeterminado | Descripción |
+| -------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `formatOptions.useSemicolons` | `false` | Usa `;` como separador de listas (según la configuración regional europea/de la UE). El valor predeterminado `,` coincide con la configuración regional en-US. |
+| `formatOptions.shortFormat` | `false` | Prefiere un formato corto, de una sola línea, cuando sea posible, en lugar del diseño predeterminado de varias líneas. |
+| `formatOptions.skipSpaceAfterFunction` | `false` | Omite el espacio entre el nombre de una función y su paréntesis de apertura (por ejemplo, `SUM(x)` en lugar de `SUM (x)`). |
+| `formatOptions.useSqlBiDaxFormatter` | `false` | Formatea DAX con el servicio web [SQL BI daxformatter.com](https://www.daxformatter.com) en lugar del formateador interno. Requiere acceso a Internet. El formateador interno (predeterminado) funciona sin conexión y coincide con la configuración predeterminada de Tabular Editor 3 Desktop. |
+
+### Visualización
+
+Ajustes que controlan la salida del terminal de la CLI y el nivel de detalle de los diagnósticos.
+
+| Clave | Predeterminado | Descripción |
+| ------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `hidePreviewNotice` | `false` | Suprime el banner amarillo de vista previa. **Se ignora cuando faltan menos de 14 días para el vencimiento.** |
+| `spinner` | `true` | Muestra indicadores de progreso animados en el terminal. Desactivar para CI. |
+| `debug` | `false` | Activa siempre el registro de depuración (equivale a pasar `--debug`). |
+
+### Perfiles
+
+Los perfiles de conexión guardados se almacenan bajo la clave `profiles`. No los edites a mano; usa `te profile set / remove / list`. Consulta @te-cli-auth para la gestión de perfiles.
+
+Los perfiles pueden incluir **anulaciones** que sustituyen los valores predeterminados de comportamiento anteriores siempre que el perfil esté activo. Así, un perfil de desarrollo puede relajar la validación y el BPA, mientras que uno de producción los mantiene estrictos:
+
+```bash
+te profile set dev --validate-on-mutation false --bpa-on-deploy false
+te profile set prod --auto-format true
+```
+
+## Control BPA
+
+El control BPA es la red de seguridad que impide que se guarde o se despliegue un modelo con infracciones de reglas. Se ejecuta automáticamente con los siguientes comandos:
+
+- `te deploy` ejecuta el control, a menos que se pase `--skip-bpa` o que `bpa.onDeploy` sea `false`.
+- `te save` ejecuta el control, a menos que se pase `--skip-bpa` (o `--force`) o que `bpa.onSave` sea `false`.
+- `te add`, `te set`, `te mv`, `te macro run` ejecutan el control solo cuando `bpa.onMutation` es `true`.
+
+El control carga las reglas de BPA desde `bpa.rules` y, de forma predeterminada, el conjunto de reglas integrado (controlado por `bpa.builtInRules`). Las reglas integradas pueden excluirse individualmente mediante `bpa.disabledBuiltInRuleIds`; se administran con `te bpa rules disable ` / `te bpa rules enable `.
+
+Cuando el control se activa y encuentra infracciones con gravedad ≥ `error`, el comando falla con el código de salida `1` y un resumen de las infracciones. Opciones para resolverlo:
+
+- `--fix-bpa` - aplica en memoria la `fixExpression` de la regla al artefacto que se va a desplegar o guardar; los archivos fuente no se modifican.
+- `--skip-bpa` - desactiva el control solo para este comando.
+- `--bpa-rules ` - repetible; sobrescribe `bpa.rules` para esta única invocación de `te deploy` o `te save`. Las reglas integradas siguen aplicándose salvo que `bpa.builtInRules` sea `false`.
+
+Ejecuta `te bpa run` de forma independiente para previsualizar el comportamiento del control sin desplegar:
+
+```bash
+te bpa run ./model --fail-on error
+te bpa run ./model --fix --save # Apply fixes to the source
+```
+
+### Reglas de BPA integradas
+
+La CLI incluye un único conjunto canónico de reglas de BPA integradas, incrustado como recurso JSON. Las reglas integradas son de solo lectura: `te bpa rules set` y `te bpa rules rm` se niegan a modificar los ID integrados y remiten a los usuarios a `te bpa rules disable` en su lugar. Para personalizar el comportamiento de una regla integrada, cópiala en tu archivo local de reglas como una regla nueva con un ID distinto y deshabilita la regla integrada.
+
+Tanto `bpa.builtInRules` como `bpa.disabledBuiltInRuleIds` se aplican de forma coherente a la validación de implementación/guardado/mutación **y** al comando manual `te bpa run`: si deshabilitas una regla una vez con `te bpa rules disable`, queda excluida en todas partes.
+
+## Comportamiento tras la mutación
+
+Cuando ejecutas un comando que modifica (`te add`, `te set`, `te mv`, `te replace --save`, `te macro run`), la CLI realiza estas comprobaciones automáticamente:
+
+1. **Los errores de TOM** siempre se muestran. Un DAX o M no válidos en medidas, columnas, particiones o elementos de cálculo siempre hacen que el comando falle.
+2. **La validación del esquema** (`validateOnMutation`, valor predeterminado `true`) comprueba que las referencias `Table[Column]` en DAX sigan resolviéndose y verifica la consistencia de los metadatos.
+3. **Formato automático de DAX** (`autoFormat`, valor predeterminado `false`) da formato a cualquier expresión afectada por la mutación mediante el DAX Formatter integrado cuando está habilitado.
+4. **BPA tras la mutación** (`bpa.onMutation`, valor predeterminado `false`) ejecuta BPA después de la mutación cuando está habilitado, y muestra una advertencia o hace que el comando falle según `--fail-on`.
+
+Deshabilita una comprobación con `te config set false`, o limita esa relajación a un entorno concreto mediante un perfil.
+
+## Variables de entorno
+
+Usa las siguientes variables de entorno específicas de la CLI para PATH, comportamiento y diagnósticos. Para las variables de autenticación de Azure (`AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_CERTIFICATE_PATH`, etc.), consulta @te-cli-auth.
+
+| Variable | Propósito |
+| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `TE_CONFIG` | Ruta de acceso a un archivo de configuración alternativo. Se respeta en todas las operaciones de `te config` (`show`, `set`, `init`, `paths`). |
+| `TE_MACROS_PATH` | Anula la ruta del archivo de macros (segundo en el orden de resolución; ver arriba). La leen los comandos `te macro`. |
+| `TE_BPA_RULES` | Anula la lista de archivos/URL de reglas de BPA utilizada por los subcomandos `te bpa run` y `te bpa rules`. |
+| `TE_BPA_CONFIG` | Anula la ruta de acceso a la configuración del gate de BPA (`.te-bpa.json`) que lee el gate de despliegue/guardado. |
+| `TE3_EXE_PATH` | Ruta al binario de escritorio de Tabular Editor 3. Se usa **solo** con `te open`; puedes dejarla sin definir en Linux/macOS o si no usas `te open`. Si no se especifica, se usa la búsqueda en `PATH`. |
+| `TE_DEBUG` | Establece el valor en `1` para habilitar el registro de depuración globalmente (igual que `--debug` o `debug: true` en la configuración). |
+| `NO_SPINNER` | Establece el valor en `1` o `true` para desactivar los indicadores de progreso animados (alternativa a `spinner: false` en la configuración). |
+| `CI` | Se detecta automáticamente. Cuando vale `1` o `true`, la CLI desactiva el spinner y cambia a una salida de texto sin formato. La mayoría de los runners de CI lo configuran automáticamente. |
+| `TE_SESSION` | Sobrescribe el identificador de sesión por terminal que se usa para el estado de la conexión activa. Útil para ejecutar varias sesiones aisladas de la CLI dentro del mismo shell, por ejemplo, en trabajos de matriz de CI en paralelo. |
+| `TE_COMPAT` | Establécela en `te2` para forzar el modo de compatibilidad con TE2; consulta @te-cli-migrate. |
+
+## Páginas relacionadas
+
+- @te-cli-auth - perfiles, autenticación y almacenamiento de credenciales.
+- @te-cli-commands - subcomandos de `te config`.
+- @te-cli-cicd - configuración del gate de BPA para pipelines.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-install.md b/localizedContent/es/content/features/te-cli/te-cli-install.md
new file mode 100644
index 000000000..11c270639
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-install.md
@@ -0,0 +1,201 @@
+---
+uid: te-cli-install
+title: Installation and Setup
+author: Peer Grønnerup
+updated: 2026-05-06
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# Installation and Setup
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+The Tabular Editor CLI ships as a single self-contained executable named `te` (`te.exe` on Windows). It has no external runtime dependencies.
+
+## Descargar
+
+1. Sign in at [tabulareditor.com](https://tabulareditor.com/download-tabular-editor-cli) with a Tabular Editor account.
+2. Download the archive for your platform and architecture:
+
+ | Platform | 64-bit (Intel/AMD) | ARM64 | Archive |
+ | -------- | ---------------------------------------------- | -------------------------------------------------------- | --------- |
+ | Windows | `te-win-x64.zip` | `te-win-arm64.zip` | `.zip` |
+ | macOS | `te-osx-x64.tar.gz` (Intel) | `te-osx-arm64.tar.gz` (Apple Silicon) | `.tar.gz` |
+ | Linux | `te-linux-x64.tar.gz` | `te-linux-arm64.tar.gz` | `.tar.gz` |
+
+ Pick the ARM64 build on Apple Silicon Macs (M1 and newer), Windows on ARM devices, and ARM-based Linux servers (including AWS Graviton, Azure Ampere, and Raspberry Pi 64-bit). Pick the `x64` build on everything else.
+
+## Install
+
+Unzip the archive into a folder of your choice and add that folder to `PATH` so you can invoke `te` from any working directory.
+
+### Windows (PowerShell)
+
+#### x64
+
+```powershell
+Expand-Archive te-win-x64.zip -DestinationPath "$env:LOCALAPPDATA\Programs\te"
+[Environment]::SetEnvironmentVariable(
+ "PATH",
+ [Environment]::GetEnvironmentVariable("PATH", "User") + ";$env:LOCALAPPDATA\Programs\te",
+ "User")
+```
+
+#### ARM64
+
+```powershell
+Expand-Archive te-win-arm64.zip -DestinationPath "$env:LOCALAPPDATA\Programs\te"
+[Environment]::SetEnvironmentVariable(
+ "PATH",
+ [Environment]::GetEnvironmentVariable("PATH", "User") + ";$env:LOCALAPPDATA\Programs\te",
+ "User")
+```
+
+### macOS
+
+#### Apple Silicon (ARM64)
+
+```bash
+mkdir -p ~/.local/bin
+tar -xzf te-osx-arm64.tar.gz -C ~/.local/bin
+chmod +x ~/.local/bin/te
+echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc # or ~/.bashrc
+```
+
+#### Intel (x64)
+
+```bash
+mkdir -p ~/.local/bin
+tar -xzf te-osx-x64.tar.gz -C ~/.local/bin
+chmod +x ~/.local/bin/te
+echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc # or ~/.bashrc
+```
+
+On macOS, the binary is signed with our Apple Developer ID and notarized by Apple, so the first run completes without a "cannot verify developer" Gatekeeper warning. Network access on first run is recommended so Gatekeeper can fetch the notarization ticket; offline first-runs may briefly prompt before being unblocked once network returns.
+
+### Linux
+
+#### x64
+
+```bash
+mkdir -p ~/.local/bin
+tar -xzf te-linux-x64.tar.gz -C ~/.local/bin
+chmod +x ~/.local/bin/te
+echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # or ~/.zshrc
+```
+
+#### ARM64
+
+```bash
+mkdir -p ~/.local/bin
+tar -xzf te-linux-arm64.tar.gz -C ~/.local/bin
+chmod +x ~/.local/bin/te
+echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # or ~/.zshrc
+```
+
+> [!NOTE]
+> The PATH change takes effect in **new** shell sessions. To run `te` in the shell where you ran the install, open a new terminal, or reload your profile: `source ~/.bashrc` / `source ~/.zshrc` on macOS/Linux, or close and reopen PowerShell on Windows.
+
+## Verify
+
+Check the installed version and list available commands:
+
+```bash
+te --version
+te --help
+```
+
+`te --help` prints a colorized help index grouping commands by family. Every subcommand accepts `--help` for detailed usage:
+
+```bash
+te deploy --help
+te bpa run --help
+```
+
+## Hide the preview banner
+
+The CLI prints a yellow preview banner on stderr by default. To suppress it run:
+
+```bash
+te config set hidePreviewNotice true
+```
+
+> [!WARNING]
+> The banner reappears on every command within **14 days of the preview end date** (2026-09-30), regardless of `hidePreviewNotice`. This ensures you have visible warning before the CLI stops functioning.
+
+## Shell completion
+
+The CLI provides tab-completion scripts for **Bash**, **Zsh**, and **PowerShell**. Pick the block that matches your shell — each one installs the completion persistently for new shell sessions.
+
+### Bash (macOS/Linux)
+
+```bash
+mkdir -p ~/.local/share/bash-completion/completions
+te completion bash > ~/.local/share/bash-completion/completions/te
+```
+
+### Zsh (macOS/Linux)
+
+```zsh
+mkdir -p ~/.zfunc
+te completion zsh > ~/.zfunc/_te
+echo 'fpath=(~/.zfunc $fpath); autoload -U compinit; compinit' >> ~/.zshrc
+```
+
+### PowerShell (Windows/macOS/Linux)
+
+```powershell
+Add-Content $PROFILE 'te completion pwsh | Out-String | Invoke-Expression'
+```
+
+Open a new shell session for completion to take effect.
+
+Completion covers subcommands, global flags, and model paths (where tab-completion against the filesystem is meaningful).
+
+## Cross-platform feature matrix
+
+Most features are identical across platforms. A handful depend on Windows-only transports:
+
+| Feature | Windows | macOS / Linux |
+| ---------------------------------------------------------------------------------------------- | ------- | ------------- |
+| Load/save BIM and TMDL | Yes | Yes |
+| Deploy to Power BI / Fabric / Azure Analysis Services | Yes | Yes |
+| Best Practice Analyzer and VertiPaq Analyzer | Yes | Yes |
+| C# scripting | Yes | Yes |
+| DAX queries against cloud models | Yes | Yes |
+| Authentication: browser, device-code, service principal, env, managed identity | Yes | Yes |
+| Connect to local SSAS instance (TCP transport) | Yes | **No** |
+| Connect to Power BI Desktop (named-pipe transport) | Yes | **No** |
+
+> [!IMPORTANT]
+> Local SSAS and Power BI Desktop connections rely on Windows-only transport protocols. All cloud-based workflows (Power BI Service, Fabric, Azure Analysis Services) work on every platform.
+
+## Updating
+
+To update to a newer preview build, download the latest archive and overwrite the previous installation. Configuration and cached credentials are stored outside the install folder (see and ) and are preserved across updates.
+
+## Uninstalling
+
+1. Delete the install folder.
+2. Remove the PATH entry.
+3. (Optional) Clear cached credentials and config:
+ - Run `te auth logout` first - it removes all cached tokens and SPN records from the active backend (OS keystore or file fallback).
+ - Delete `~/.config/te/` (config and saved profiles).
+ - Delete `~/.te-cli/` (residual cache files; only present when the file fallback was in use, or as legacy from older CLI builds).
+ - To also purge the OS-native keystore entries - usually unnecessary, since `te auth logout` already clears them - see:
+ - **Windows:** Credential Manager → Windows Credentials → entries named `com.tabulareditor.cli...` or `te-cli`.
+ - **Linux:** `secret-tool search Component te-cli` and `secret-tool clear ...`, or use seahorse.
+ - **macOS:** Keychain Access → search for `com.tabulareditor.cli`.
+
+## Next steps
+
+- @te-cli-auth - authenticate to Power BI, Fabric, or Azure Analysis Services.
+- @te-cli-commands - full command reference.
+- @te-cli-interactive - guided REPL mode.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-interactive.md b/localizedContent/es/content/features/te-cli/te-cli-interactive.md
new file mode 100644
index 000000000..c264d93f0
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-interactive.md
@@ -0,0 +1,98 @@
+---
+uid: te-cli-interactive
+title: Interactive Mode
+author: Peer Grønnerup
+updated: 2026-05-12
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# Interactive Mode
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+Interactive mode is a guided read-eval-print loop (REPL) for exploring a model from the terminal. It's the gentlest on-ramp for users who are new to command lines, and a convenient workspace for ad-hoc sessions against a single model.
+
+## Starting a session
+
+To Start a session run any of these commands:
+
+```bash
+te interactive # Start and connect to a model later
+te interactive ./model # Start with a local model
+te interactive -s MyWorkspace -d MyModel # Start with a remote model
+```
+
+The session prints a welcome banner, shows the active model, and opens you at a model-aware prompt:
+
+
+
+If no model is set, the prompt is just `te>` - simply use `connect` for connection picker, `connect ` or `connect ` to connect to one.
+
+## Commands inside the session
+
+Once a REPL has started, every `te` subcommand is available **without the `te` prefix**:
+
+```
+ls tables
+get "Sales/Revenue" -q expression
+query -q "EVALUATE TOPN(5, 'Sales')"
+bpa run --fail-on error
+```
+
+Each command accepts `--help` the same way it does outside the session:
+
+```
+deploy --help
+```
+
+## Quoting and DAX-style paths
+
+The REPL line splitter recognises the same quoting forms as [object paths](xref:te-cli-commands#object-paths) so DAX-shaped references are interpreted as a single argument:
+
+- `'...'` and `"..."` - single- and double-quoted segments. The quote characters are stripped, doubled quotes escape a literal occurrence.
+- `[...]` - bracketed segment. **Brackets are preserved** in the resulting argument so a path like `'Internet Sales'[Sales Amount]` reaches the command as one token that the path parser can re-interpret as a DAX reference. Doubled closing brackets (`]]`) stay verbatim for the same reason.
+
+```
+get 'Internet Sales'[Sales Amount] # One argument, DAX form
+get [Total Sales] # Lone-bracket model-wide lookup
+ls 'Net Sales'/'Sales Amount' # Quoted segments with a slash separator
+```
+
+Unterminated groups absorb to end of line, so a stray opening quote or bracket fails with an explicit error rather than splitting silently.
+
+## Built-in REPL commands
+
+These are handled by the REPL itself, not the regular command tree:
+
+| Command | Purpose |
+| ---------------------- | ------------------------------------------------- |
+| `help` or `?` | List available commands. |
+| `status` or `pwd` | Show the active model/connection. |
+| `clear` or `cls` | Clear the screen. |
+| `exit`, `quit`, or `q` | Exit interactive mode. |
+
+## Guided prompts
+
+When interactive mode is active, commands that need missing input prompt for it instead of failing. Running `auth` without a subcommand opens a picker for Login / Status / Logout; running `deploy` without `--force` shows a summary and asks for confirmation (`n` is the safe default).
+
+To disable prompts for a single command inside the session, pass `--non-interactive`.
+
+## When to use interactive vs. non-interactive
+
+- **Interactive mode** is best for exploration, learning the CLI, one-off bulk edits against a single model, and demos.
+- **Non-interactive mode** (the default outside `te interactive`) is what you reach for when scripting, automating, or running in CI. See @te-cli-automation and @te-cli-cicd.
+
+The two share the same command tree - anything you run inside `te interactive` can be pasted into a shell script by prefixing it with `te`.
+
+## Related pages
+
+- @te-cli-commands - full command reference.
+- @te-cli-auth - connect to workspaces and manage profiles.
+- @te-cli-automation - when to leave interactive mode.
diff --git a/localizedContent/es/content/features/te-cli/te-cli-limitations.md b/localizedContent/es/content/features/te-cli/te-cli-limitations.md
new file mode 100644
index 000000000..0feb35178
--- /dev/null
+++ b/localizedContent/es/content/features/te-cli/te-cli-limitations.md
@@ -0,0 +1,90 @@
+---
+uid: te-cli-limitations
+title: Limitaciones conocidas
+author: Peer Grønnerup
+updated: 2026-05-20
+applies_to:
+ products:
+ - product: Tabular Editor 2
+ none: true
+ - product: Tabular Editor 3
+ none: true
+ - product: Tabular Editor CLI
+ full: true
+---
+
+# Limitaciones conocidas
+
+[!INCLUDE [te-cli-preview-notice](includes/te-cli-preview-notice.md)]
+
+En esta página se enumeran las limitaciones conocidas de la CLI de Tabular Editor (`te`) para que puedas planificar en consecuencia y evitar errores habituales. Se actualiza con cada versión; si encuentras un problema que no figura aquí, abre una incidencia en el repositorio público [TabularEditor/CLI](https://github.com/TabularEditor/CLI).
+
+> [!NOTE]
+> Las limitaciones se agrupan por área. Cada entrada describe la restricción y, cuando existe, una solución alternativa o la alternativa recomendada compatible con la CLI.
+
+## Scripts
+
+La CLI ejecuta C# Scripts (`te script`) sobre el mismo objeto `Model` que usas en Tabular Editor 2 y 3, pero funciona como un host de consola sin interfaz gráfica. Todo lo que dependa de una interfaz de usuario de Windows Forms, de la selección del Explorador TOM o de un servicio en ejecución del lado de la interfaz (registro de macros, DAX Formatter en línea, Analizador VertiPaq en tiempo real) se comporta de forma diferente; por lo general, queda vacío, no hace nada o devuelve un error.
+
+| Limitación | Notas / Solución alternativa |
+| -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **`System.Windows.Forms` no se ha cargado** | La CLI usa una compilación multiplataforma de `TOMWrapper` que elimina todo el código acoplado a WinForms; el ensamblado de WinForms nunca se carga en el AppDomain. Los scripts que hacen referencia a tipos de `System.Windows.Forms` (`MessageBox`, `Form`, selectores de archivos, cuadros de diálogo personalizados, …) no se pueden compilar. Reestructura cualquier interacción con la interfaz de usuario en argumentos del script, variables de entorno o stdin. |
+| **`Selected.` devuelve un enumerable vacío** | `Selected.Tables`, `Selected.Measures`, `Selected.Columns`, `Selected.Hierarchies`, etc. no devuelven nada en la CLI: no hay error de compilación ni de ejecución; simplemente no hay filas. Sustituye por búsquedas explícitas: `Model.AllMeasures.Where(...)`, `Model.Tables["Sales"].Measures`, o pasa rutas de objetos mediante `te script --args`. |
+| **`Selected.` genera un error en tiempo de ejecución** | `Selected.Table`, `Selected.Measure`, `Selected.Column`, `Selected.Hierarchy`, etc. devuelven un error porque requieren exactamente un objeto seleccionado de ese tipo y la selección de la CLI siempre está vacía. Haz referencia al objeto directamente, por ejemplo, `Model.Tables["Sales"]`. |
+| **`Selected.ActivePerspectives` y `Selected.ActiveCulture`** | Siempre devuelven una colección vacía y `null`, respectivamente. Establece la perspectiva o la configuración regional explícitamente en el script si es necesario. |
+| **Los cuadros de diálogo `Select