output-build-workflow
Implement an Output SDK workflow from a plan document. Use when the user asks to build, implement, or code a workflow from an…
Generate workflow skeleton files using the Output SDK CLI. Use when starting a new workflow, scaffolding project structure, or understanding the generated file layout.
Claude Code
$ npx -y skills add growthxai/output --skill output-dev-create-skeleton --agent claude-code
Codex
$ npx skills add growthxai/output --skill output-dev-create-skeleton -a codex -y
Cursor
$ npx skills add growthxai/output --skill output-dev-create-skeleton -a cursor -y
Gemini CLI
$ npx skills add growthxai/output --skill output-dev-create-skeleton -a gemini-cli -y
GitHub Copilot
$ npx skills add growthxai/output --skill output-dev-create-skeleton -a github-copilot -y
OpenCode
$ npx skills add growthxai/output --skill output-dev-create-skeleton -a opencode -y
Windsurf
$ npx skills add growthxai/output --skill output-dev-create-skeleton -a windsurf -y
name: output-dev-create-skeleton description: Generate workflow skeleton files using the Output SDK CLI. Use when starting a new workflow, scaffolding project structure, or understanding the generated file layout. allowed-tools: [Bash, Read]
This skill documents how to use the Output SDK CLI to generate a workflow skeleton. The skeleton provides a starting point with all required files and proper structure.
npx output workflow generate --skeleton
This command creates the basic file structure for a new workflow.
After running the skeleton generator, you will have:
src/workflows/{workflow-name}/
├── workflow.ts # Main workflow definition
├── steps.ts # Step function definitions
├── types.ts # Zod schemas and types
├── prompts/ # Empty folder for prompt files
└── scenarios/ # Empty folder for test scenariosThe skeleton is created within the standard Output SDK project structure:
src/
├── shared/ # Shared code (create if needed)
│ ├── clients/ # API clients
│ ├── utils/ # Utility functions
│ ├── services/ # Business logic services
│ ├── steps/ # Shared steps (optional)
│ └── evaluators/ # Shared evaluators (optional)
└── workflows/
└── {workflow-name}/ # Your new workflow
├── workflow.ts
├── steps.ts
├── types.ts
├── prompts/
└── scenarios/After generation, review each file to understand the template structure:
**workflow.ts** - Contains a basic workflow template:
import { workflow, z } from '@outputai/core';
import { exampleStep } from './steps.js';
import { WorkflowInputSchema } from './types.js';
export default workflow( {
name: 'workflowName',
description: 'Workflow description',
inputSchema: WorkflowInputSchema,
outputSchema: z.object( { result: z.string() } ),
fn: async input => {
const result = await exampleStep( input );
return { result };
}
} );**steps.ts** - Contains example step template:
import { step, z } from '@outputai/core';
import { ExampleStepInputSchema } from './types.js';
export const exampleStep = step( {
name: 'exampleStep',
description: 'Example step description',
inputSchema: ExampleStepInputSchema,
outputSchema: z.object( { result: z.string() } ),
fn: async input => {
// Implement step logic here
return { result: 'example' };
}
} );**types.ts** - Contains schema definitions:
import { z } from '@outputai/core';
export const WorkflowInputSchema = z.object( {
// Define input fields
} );
export type WorkflowInput = z.infer<typeof WorkflowInputSchema>;1. Update the folder name to match your workflow 2. Update the `name` property in `workflow.ts` 3. Follow naming conventions:
In `types.ts`, define your actual input/output schemas:
import { z } from '@outputai/core';
export const WorkflowInputSchema = z.object( {
content: z.string().describe( 'Content to process' ),
options: z.object( {
format: z.enum( [ 'json', 'text' ] ).default( 'json' )
} ).optional()
} );
export type WorkflowInput = z.infer<typeof WorkflowInputSchema>;
export type WorkflowOutput = { processed: string };**Related Skill**: `output-dev-types-file`
Replace the example step with your actual step implementations:
import { step, z, FatalError, ValidationError } from '@outputai/core';
import { ProcessContentInputSchema } from './types.js';
export const processContent = step( {
name: 'processContent',
description: 'Process the input content',
inputSchema: ProcessContentInputSchema,
outputSchema: z.object( { processed: z.string() } ),
fn: async ( { content } ) => {
// Implement your logic
return { processed: content.toUpperCase() };
}
} );**Related Skill**: `output-dev-step-function`
Wire up your steps in the workflow:
import { workflow, z } from '@outputai/core';
import { processContent } from './steps.js';
import { WorkflowInputSchema } from './types.js';
export default workflow( {
name: 'contentProcessor',
description: 'Process content with custom logic',
inputSchema: WorkflowInputSchema,
outputSchema: z.object( { processed: z.string() } ),
fn: async input => {
const result = await processContent( { content: input.content } );
return result;
}
} );**Related Skill**: `output-dev-workflow-function`
If your workflow uses LLM operations, create prompt files:
prompts/ └── analyzeContent@v1.prompt
**Related Skill**: `output-dev-prompt-file`
Add test input files to the scenarios folder:
scenarios/ ├── basic_input.json └── complex_input.json
**Related Skill**: `output-dev-scenario-file`
If your workflow needs shared clients, utilities, or services:
# Create shared directories if they don't exist mkdir -p src/shared/clients mkdir -p src/shared/utils mkdir -p src/shared/services
Import shared resources in your steps:
import { GeminiService } from '../../shared/clients/gemini_client.js';
import { formatDate } from '../../shared/utThe open-source TypeScript framework for building AI workflows and agents. Designed for Claude Code — describe what you want, Claude builds it, with all the best practices already in place. One framework.
Implement an Output SDK workflow from a plan document. Use when the user asks to build, implement, or code a workflow from an…
View, edit, and set encrypted credentials in an Output.ai project. Use when adding secrets, updating API keys, verifying…
Wire encrypted credentials to environment variables using the credential: convention. Use when setting up LLM provider keys…
Initialize encrypted credentials for an Output.ai project. Use when setting up credentials for the first time, adding…
Debug Output SDK workflow issues. Use when user reports a workflow failing, erroring, hanging, producing wrong results, or asks…
Use the Agent class for multi-step tool loops, conversation history, streaming progress, and reusable LLM agents. Use when…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.