Skip to content

[Feature] Add JSONL output to theme dev - #8996

Open
isaacroldan wants to merge 1 commit into
codex/theme-dev-instancefrom
codex/theme-dev-json
Open

isaacroldan wants to merge 1 commit into
codex/theme-dev-instancefrom
codex/theme-dev-json

Conversation

@isaacroldan

Copy link
Copy Markdown
Contributor

WHY are these changes introduced?

Agents need structured live output from theme dev while the session runs.

WHAT is this pull request doing?

Add --json (-j) to stream the same JSONL bytes to stdout and the Dev Instance log. Reuse the shared log schema and writer; records contain timestamp and message, without type, stream, or source. Setup diagnostics use stderr, and fatal CLI errors use the standard JSON error envelope on stdout. There is no final success result.

Disable terminal progress UI and hotkeys in JSON mode. Keep a named theme environment on the single-session path instead of collecting a finite batch result. Expose the record schema through --json-schema, update generated help/docs, and remove the app dev and theme dev lint exceptions now that both support typed JSON.

Stacked on #8976.

How to manually test your changes?

  1. Run pnpm shopify theme dev --path /path/to/theme --store your-store.myshopify.com --theme THEME_ID --json --no-input > /tmp/theme-dev.jsonl with existing authentication.
  2. Change an asset and open the local preview. Check the JSONL stream for synchronization and HTTP request messages.
  3. Press Ctrl+C once. Read the session's .shopify/dev/*.jsonl file and compare it with /tmp/theme-dev.jsonl; the bytes should match.
  4. Run pnpm shopify theme dev --json-schema to inspect the record and fatal-error schemas.

Validation

  • 1,271 tests pass across the theme suite, app-dev command contract, and JSON lint rule. Type checking, changed-file lint, the CLI build/bundle, and the command snapshot pass.
  • Real subprocess tests preserve all 1,000 queued messages plus shutdown output for SIGINT and SIGTERM, compare stdout and file bytes, and check ownership cleanup. Output tests cover warnings, build errors, task progress, and later HTTP callbacks.
  • Command tests cover --json, -j, the environment variable, named/configured environments, --no-input, schemas, and fatal errors. Restoring finite environment batching makes the regression test fail.
  • No live-store synchronization or manual Windows console test was performed.

Checklist

  • I've considered possible cross-platform impacts (Mac, Linux, Windows)
  • I've considered possible documentation changes
  • I've considered analytics changes to measure impact
  • Added a minor changeset for the new flag.

@isaacroldan
isaacroldan requested review from a team as code owners October 23, 2026 10:15
@github-actions github-actions Bot added the Area: @shopify/theme @shopify/theme package issues label Oct 23, 2026
@isaacroldan
isaacroldan added this pull request to stack #8953 October 23, 2026 10:16
@github-actions

Copy link
Copy Markdown
Contributor

Differences in type declarations

We detected differences in the type declarations generated by Typescript for this branch compared to the baseline ('main' branch). Please, review them to ensure they are backward-compatible. Here are some important things to keep in mind:

  • Some seemingly private modules might be re-exported through public modules.
  • If the branch is behind main you might see odd diffs, rebase main into this branch.

New type declarations

We found no new type declarations in this PR

Existing type declarations

packages/cli-kit/dist/private/node/dev-instance-output.d.ts
@@ -2,18 +2,18 @@ import { zod } from '../../public/node/schema.js';
 import { Writable, type WritableOptions } from 'stream';
 export declare const devInstanceLogOutputSchema: import("../../public/node/json-output-schema.js").JsonOutputSchema<zod.ZodObject<{
     timestamp: zod.ZodString;
-    source: zod.ZodString;
+    source: zod.ZodOptional<zod.ZodString>;
     level: zod.ZodOptional<zod.ZodEnum<["debug", "info", "warning", "error"]>>;
     message: zod.ZodString;
 }, "strict", zod.ZodTypeAny, {
-    source: string;
     message: string;
     timestamp: string;
+    source?: string | undefined;
     level?: "info" | "error" | "debug" | "warning" | undefined;
 }, {
-    source: string;
     message: string;
     timestamp: string;
+    source?: string | undefined;
     level?: "info" | "error" | "debug" | "warning" | undefined;
 }>>;
 /** One line of a dev instance's JSON Lines log. */
@@ -30,7 +30,7 @@ export declare function createDevInstanceOutput({ logFile, logOutput, isActive,
         timestamp?: string;
     }) => Promise<void>;
     tee: (target: Writable, { source, stringWritesAreMessages }: {
-        source: string;
+        source?: string;
         stringWritesAreMessages?: boolean;
     }) => DevInstanceOutput;
     flush: () => Promise<PromiseSettledResult<void>[]>;
packages/cli-kit/dist/public/node/dev-instance.d.ts
@@ -80,7 +80,8 @@ export interface DevInstance {
      * The returned stream forwards the original bytes to `target` unchanged.
      */
     tee: (target: Writable, options: {
-        source: string;
+        /** Omit the source field when the stream does not need to distinguish producers. */
+        source?: string;
         /** Treat each string write as a complete message. Byte writes remain buffered into lines. */
         stringWritesAreMessages?: boolean;
     }) => Writable;

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: @shopify/theme @shopify/theme package issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant