aem-cli

v2026.09.24

Use this when installing, running, or configuring the Adobe AEM CLI (@adobe/aem-cli, formerly the helix-cli npm package; commands `aem up`, `aem import`, `aem content`), when `aem up` fails (port conflicts, cert errors, proxy 404s, pipeline vs. local-file confusion), or when migrating from the old helix-cli package. Covers installation, the local Edge Delivery dev server, .env / AEM_* configuration, HTTPS/TLS, proxy and certificate trust, content sync with da.live, and troubleshooting. For da.live content-format rules or the DA Source API contract use da-content; for writing EDS block code use content-driven-development.

GitHub
安装命令
npx skhub add adobe/aem-cli
Markdown
SKILL.md

AEM CLI

Local development tool for AEM Edge Delivery Services. Three commands: aem up (local dev server), aem import (import server + UI), aem content (da.live content sync).

Binary: aem (primary), hlx (alias from the former helix-cli package, renamed to @adobe/aem-cli at v15.0.0).


1. Install

Prerequisite: Node.js 12.11 or newer (Node 22 LTS recommended). [verified]

# Global install
npm install -g @adobe/aem-cli

# One-off via npx (no global install needed)
npx -y @adobe/aem-cli up

Verify:

aem --version   # or: hlx --version

Migrating from the old helix-cli package

If npm install -g @adobe/aem-cli fails with File exists: …/hlx, the old package is still installed and owns the binary. Uninstall it first (npm package scoped under @adobe, named helix-cli): [verified]

npm uninstall -g @adobe/helix-cli
npm install -g @adobe/aem-cli

The binary name changes from hlx to aem; both work after installation because aem-cli ships hlx as an alias.


2. aem up — Local Dev Server

Agent-standard invocation:

aem up --no-open --forward-browser-logs

Check the server is running:

curl -s -o /dev/null -w "%{http_code}" http://localhost:3000
# Expected: 200

Key flags

FlagWhat it does
--no-openDo not open a browser window on startup
--forward-browser-logsForward browser console messages (log, error, warn, info) to the terminal
--port <n>Listen on a different port (default: 3000)
--addr <addr>Bind address; use * to allow external connections (default: 127.0.0.1)
--url <url>Origin URL to proxy content from (overrides the project's default pages URL)
--html-folder <dir>Serve local HTML files from <dir> without extensions
--html-mount <path>URL path where --html-folder files are served (default: /<dir>)
--no-livereloadDisable automatic browser reload on file changes
--stop-otherStop another AEM CLI instance on the same port before starting (default: true)
--tls-cert <file>Path to .pem file for TLS (see §4)
--tls-key <file>Path to .key file for TLS (see §4)
--allow-insecureAllow insecure (self-signed cert) requests to the upstream server
--print-indexPrint indexed records for the current page (debugging)
--site-token <token>Site token for CLI access to the website
--cookiesProxy all cookies (default: only hlx-auth-token is proxied)

--html-folder: without it, local HTML files are never served — all requests proxy to the remote pipeline, returning 404 for local-only paths. [verified]

Serving import HTML locally (preview-import pattern)

aem up --html-folder drafts --no-open --forward-browser-logs
# Files in ./drafts/ are served at /drafts/<name> (no extension needed)

3. .env Configuration

All options can be persisted in .env at the project root; loaded automatically. [verified]

# .env example
AEM_PORT=8080
AEM_PAGES_URL=https://stage.myproject.com
AEM_FORWARD_BROWSER_LOGS=true
AEM_HTML_FOLDER=drafts
AEM_TLS_CERT=server.crt
AEM_TLS_KEY=server.key
AEM_OPEN=/products

See references/command-reference.md for the complete AEM_* environment variable reference with defaults.


4. HTTPS / TLS

Trusted local certificate (recommended — avoids browser warnings)

Install mkcert (brew install mkcert on macOS, choco install mkcert on Windows, go install filippo.io/mkcert@latest elsewhere), then:

mkcert -install                                          # one-time CA install
mkcert -cert-file server.crt -key-file server.key localhost 127.0.0.1
aem up --tls-cert server.crt --tls-key server.key

Self-signed certificate (no mkcert)

openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes \
  -out server.crt -keyout server.key -subj "/CN=localhost"
aem up --tls-cert server.crt --tls-key server.key

Persisting TLS in .env

AEM_TLS_CERT=server.crt
AEM_TLS_KEY=server.key

5. Corporate Proxy and Certificate Trust

aem up fails with unable to get local issuer certificate behind HTTPS-intercepting proxies. Export the corporate CA cert from your browser or ask IT, then set:

# macOS / Linux
export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.crt
aem up

# Windows
set NODE_EXTRA_CA_CERTS=./certs/corporate-ca.pem
aem up

NODE_EXTRA_CA_CERTS is a Node built-in — set it in the shell profile or CI, not .env.

Proxy env vars:

VariablePurpose
HTTP_PROXYProxy for HTTP requests
HTTPS_PROXYProxy for HTTPS requests
ALL_PROXYFallback for either protocol
NO_PROXYComma-separated hosts to bypass; * disables all proxies

6. aem import — Import Server

Local import server (default port 3001) serving the helix-importer-ui.

aem import                   # opens Importer UI in browser at port 3001
aem import --no-open         # headless / background start
aem import --port 3002       # different port

Key flags:

FlagDefaultWhat it does
--port3001Import server port
--no-open—Do not open the browser window
--allow-insecuretrueAllow self-signed certs on the proxied site
--ui-repo <url>helix-importer-ui repo on GitHubCustom Importer UI repo
--skip-uifalseSkip downloading/installing the UI
--headers-file <file>—JSON file of custom headers for proxy requests
--cache <dir>—Cache proxied responses to a local folder
--dump-headersfalsePrint request headers to console for debugging
--tls-cert / --tls-key—TLS for the import server itself (see §4)

Workflow: For writing the import.js transformation script or running the full import pipeline, use the page-import or generate-import-html skills. This skill covers only starting and configuring the server.


7. aem content — da.live Content Sync

aem content clone [--path /]   # auth via browser popup; clones into ./content/
aem content status             # show added / modified / deleted files
aem content diff [path]        # diff local vs remote
aem content merge [path]       # sync remote changes into local files
aem content add <files..>      # stage changes (like git add)
aem content commit -m "..."    # commit staged changes (like git commit)
aem content push               # upload committed changes to da.live
aem content push --force       # overwrite remote on conflict

Auth token cached at .hlx/.da-token.json (gitignored); browser OAuth on first use.

Read the token directly to authenticate curl calls:

TOKEN=$(jq -r .access_token .hlx/.da-token.json)

Known behaviour: binary files

aem content push silently no-ops on binary files (images, PDFs, fonts). [verified]

Verify a binary upload landed:

curl -sI https://content.da.live/<org>/<repo>/path/to/image.png | grep -i "content-type"

If it 404s, upload the binary directly via the DA Source API:

TOKEN=$(jq -r .access_token .hlx/.da-token.json)
curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: image/png" \
  --data-binary @./image.png \
  "https://admin.da.live/source/<org>/<repo>/path/to/image.png"

Known behaviour: pre-upload HTML normalization

Pre-upload normalization strips EDS icon decorations (<span class="icon icon-X"> etc.). [verified] For byte-faithful EDS HTML, POST directly to the DA Source API:

curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: text/html" \
  --data-binary @./page.html \
  "https://admin.da.live/source/<org>/<repo>/path/to/page.html"

See the da-content skill (platform reference §7) for the DA Source API contract and rate limits.


Troubleshooting

SymptomCauseFix
npm install -g @adobe/aem-cli → File exists: …/hlxold helix-cli package still owns the binaryuninstall the old package (see §1) then reinstall
aem up → EADDRINUSE: address already in use :::3000Port 3000 is takenPass --port <other> or kill the process on 3000
aem up → unable to get local issuer certificateCorporate proxy intercepts TLSExport corp CA cert → export NODE_EXTRA_CA_CERTS=/path/to/ca.crt
localhost:3000/mypath returns 404Local HTML file in mypath/ not mountedAdd --html-folder mypath (or AEM_HTML_FOLDER=mypath in .env)
aem up → pipeline 404 for pages that exist liveWrong origin URL proxiedPass --url https://your-pages-url.aem.page
aem content push reports success but binary is missingCLI silently no-ops on binariesUpload binary via DA Source API (see §7)
aem content push strips icon spans from HTMLPre-upload normalization removes EDS decorationsPOST directly to DA Source API for byte-faithful upload
aem import UI doesn't loadPort 3001 in use, or UI download failedTry --port 3002; or --skip-ui and open the UI separately

Reference

发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

Sep 24, 2026

分类

未分类

许可证

Apache-2.0

源路径

plugins/aem/edge-delivery-services/skills/aem-cli

默认分支

main

最新提交

e26e61d

Tree SHA

b0267ec