Skip to content
Development
Skill

/output-dev-create-skeleton

Generate workflow skeleton files using the Output SDK CLI. Use when starting a new workflow, scaffolding project structure, or understanding the generated file layout.

From plugin
output
43052 skills11 agents1 command
Install
$ npx -y skills add growthxai/output --skill output-dev-create-skeleton --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/output-dev-create-skeleton

Context preview

The summary Claude sees to decide when to auto-load this skill.

Generate workflow skeleton files using the Output SDK CLI. Use when starting a new workflow, scaffolding project structure, or understanding the generated file layout.

SKILL.md

output-dev-create-skeleton.SKILL.md
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]

Generate Workflow Skeleton with Output SDK CLI

Overview

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.

When to Use This Skill

  • Starting a new workflow from scratch
  • Understanding what files are needed for a workflow
  • Scaffolding the basic structure before implementation
  • Learning the Output SDK workflow patterns

CLI Command

npx output workflow generate --skeleton

This command creates the basic file structure for a new workflow.

Generated File Structure

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 scenarios

Project Structure Overview

The 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/

Post-Generation Steps

Step 1: Review Generated Files

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>;

Step 2: Customize the Workflow Name

1. Update the folder name to match your workflow 2. Update the `name` property in `workflow.ts` 3. Follow naming conventions:

  • Folder: `snake_case` (e.g., `image_processor`)
  • Workflow name: `camelCase` (e.g., `imageProcessor`)

Step 3: Define Your Schemas

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`

Step 4: Implement Your Steps

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`

Step 5: Update the Workflow

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`

Step 6: Add Prompts (If Needed)

If your workflow uses LLM operations, create prompt files:

prompts/
└── analyzeContent@v1.prompt

**Related Skill**: `output-dev-prompt-file`

Step 7: Create Test Scenarios

Add test input files to the scenarios folder:

scenarios/
├── basic_input.json
└── complex_input.json

**Related Skill**: `output-dev-scenario-file`

Step 8: Set Up Shared Resources (If Needed)

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/ut
Read more
Ships withoutput

The 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.

Get the whole plugin