Skip to main content
Parse one JSON document per command instead of scraping log lines. Under --output json, every terminating command answers with exactly one schema-1 envelope on stdout. Long-running commands stream the same shape as lifecycle frames.

Envelope shape

The error object:

Success and failure examples

Compile diagnostics

A failed build frame and the dev stream’s compile-failed frame carry error.details, one entry per compiler diagnostic, errors first. Each entry has this shape: The list is capped at 20 entries. When the cap cuts it, the frame sets truncated: true. The codes that can appear in details are the diagnostic rows of the error code table: E_MODULE_NOT_FOUND, E_CONTENT_SCRIPT_SYNTAX, E_CSS_PARSE, E_ENTRY_NOT_FOUND, E_ASSET_MISSING, E_SCRIPT_DEP_MISSING, E_RESERVED_FOLDER, E_CSS_PREPROCESSOR_MISSING, E_CSS_DEAD_REF, E_LOCALES_LAYOUT, E_WAR_INVALID, E_BACKGROUND_REQUIRED, E_REMOTE_RESOURCE_BLOCKED, E_PERF_BUDGET, and E_ENV_NO_MATCH. This is golden.build.compile.json with its two messages shortened to their first line:
A successful build keeps its warnings in the top-level warnings array. Each string there opens with E_CODE: when a code resolves, for example E_CSS_DEAD_REF: ..., the same convention logs and uninstall already use.

Where human copy goes

The EXTENSION_OUTPUT environment variable is the machine-mode switch. When it is json or ndjson, frames own stdout and human copy moves aside:
  • Informational lines and warnings go quiet, or move to stderr where a stream needs them.
  • Error copy is never suppressed. It always writes to stderr, so a launch failure stays visible while stdout stays parseable.
Pipe stdout to your parser and keep stderr for humans. The two never mix.

Published contract artifacts

The extension-develop package ships the contract as importable files under the ./contract/* export: Validate your consumer against the schema, and pin your tests to the golden fixtures. Codes may be added, never renamed or removed.

Next steps