Fix Zod schema import issues during Flow to Output SDK migration. Use when seeing "incompatible schema" errors, type errors at step boundaries, or when migrating files that import from 'zod' directly.
Fixes Zod import source errors during Flow to Output SDK migration. Use when encountering "incompatible schema" errors or type mismatches at step boundaries. Searches for `import { z } from 'zod'` and replaces with `import { z } from '@output.ai/core'`.
/plugin marketplace add growthxai/output-claude-plugins/plugin install growthxai-outputai-flow-migrator-plugins-outputai-flow-migrator@growthxai/output-claude-pluginsThis skill is limited to using the following tools:
This skill helps diagnose and fix a critical issue where Zod schemas are imported from the wrong source during migration. Output SDK requires schemas to be imported from @output.ai/core, not directly from zod.
During Migration:
import { z } from 'zod'Error Symptoms:
The issue occurs when you import z from zod instead of @output.ai/core. While both provide Zod schemas, they create different schema instances that aren't compatible with each other within the Output SDK context.
Why this matters: Output SDK uses a specific version of Zod internally for serialization and validation. When you use a different Zod instance, the schemas are technically different objects even if they define the same shape. This causes runtime validation failures and TypeScript errors.
Error: Incompatible schema types
Error: Schema validation failed: expected compatible Zod instance
TypeError: Cannot read property 'parse' of undefined
// WRONG: Importing from 'zod' directly
import { z } from 'zod';
const inputSchema = z.object({
name: z.string(),
});
export const myStep = step({
name: 'myStep',
inputSchema,
fn: async (input) => {
// ...
}
});
// CORRECT: Import z from @output.ai/core
import { z, step } from '@output.ai/core';
const inputSchema = z.object( {
name: z.string()
} );
export const myStep = step( {
name: 'myStep',
inputSchema,
fn: async ( input ) => {
// ...
}
} );
Search your codebase for incorrect imports:
grep -r "from 'zod'" src/
grep -r 'from "zod"' src/
Change all imports from:
// Wrong
import { z } from 'zod';
To:
// Correct
import { z } from '@output.ai/core';
Tip: Often you can combine with other imports:
import { z, step, workflow } from '@output.ai/core';
Check your imports don't accidentally use zod elsewhere:
grep -r "import.*zod" src/
All matches should show @output.ai/core, not zod.
// src/workflows/my-workflow/types.ts
import { z } from 'zod';
export const UserSchema = z.object({
id: z.string(),
email: z.string().email(),
});
export type User = z.infer<typeof UserSchema>;
// src/workflows/my-workflow/activities.ts
import { z } from 'zod';
import { UserSchema } from './types';
export async function getUser(userId: string): Promise<User> {
// ...
}
// src/workflows/my-workflow/types.ts
import { z } from '@output.ai/core';
export const UserSchema = z.object( {
id: z.string(),
email: z.string().email()
} );
export type User = z.infer<typeof UserSchema>;
// src/workflows/my-workflow/steps.ts
import { z, step } from '@output.ai/core';
import { UserSchema, User } from './types.js';
export const getUser = step( {
name: 'getUser',
inputSchema: z.object( {
userId: z.string()
} ),
outputSchema: UserSchema,
fn: async ( input ) => {
const { userId } = input;
// ...
}
} );
# Should return no results
grep -r "from 'zod'" src/
grep -r 'from "zod"' src/
npm run output:workflow:build
npx output workflow run <workflowName> '<input>'
Add a rule to prevent direct zod imports in your ESLint config:
// .eslintrc.js
module.exports = {
rules: {
'no-restricted-imports': ['error', {
paths: [{
name: 'zod',
message: "Import { z } from '@output.ai/core' instead of 'zod'"
}]
}]
}
};
Configure your editor to auto-import from @output.ai/core:
For VS Code, add to settings.json:
{
"typescript.preferences.autoImportFileExcludePatterns": ["zod"]
}
Even one wrong import can cause issues:
import { z } from '@output.ai/core';
import { z as zod } from 'zod'; // This causes problems!
If a utility file uses the wrong import and is shared:
// utils/schemas.ts
import { z } from 'zod'; // Wrong! This affects all files using these schemas
export const idSchema = z.string().uuid();
If using external Zod schemas, you may need to recreate them:
// Don't use: externalLibrary.schema
// Instead: recreate the schema with @output.ai/core's z
flow-convert-activities-to-steps - Full activity to step conversionflow-error-eslint-compliance - ESLint compliance for migrated codeflow-validation-checklist - Complete migration validationCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.