jpskill.com
📦 その他 コミュニティ

create-node

FlowGram demo-free-layout上で、自動フォームの簡単なノードからUIをカスタマイズした複雑なノードまで、新しい独自のノードを柔軟に作成し、業務フローを効率化するSkill。

📜 元の英語説明(参考)

用于在 FlowGram demo-free-layout 中创建新的自定义节点,支持简单节点(自动表单)和复杂节点(自定义 UI)

🇯🇵 日本人クリエイター向け解説

一言でいうと

FlowGram demo-free-layout上で、自動フォームの簡単なノードからUIをカスタマイズした複雑なノードまで、新しい独自のノードを柔軟に作成し、業務フローを効率化するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o create-node.zip https://jpskill.com/download/17660.zip && unzip -o create-node.zip && rm create-node.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/17660.zip -OutFile "$d\create-node.zip"; Expand-Archive "$d\create-node.zip" -DestinationPath $d -Force; ri "$d\create-node.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して create-node.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → create-node フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

FlowGram カスタムノード開発

概述

本 SKILL は、FlowGram プロジェクトの apps/demo-free-layout/src/nodes ディレクトリに新しいカスタムワークフローノードを作成する方法を説明します。

核心概念

节点数据结构

ノードデータは保存時にバックエンドに保存され、基本的な構造は以下のとおりです。

{
  id: 'node_xxxxx',           // ノード ID
  type: 'node_type',          // ノードタイプ
  data: {
    title: 'Node Title',      // ノードタイトル
    inputsValues: { ... },    // ノードフォームフィールドの初期値(実際の値)
    inputs: { ... },          // ノードフォームの JSON Schema(フォーム構造の定義)
    outputs: { ... },         // ノード出力の JSON Schema(ワークフロー実行時の出力)
    // ... その他のカスタムフィールド
  }
}

三个核心字段

1. data.inputsValues - ノードフォームフィールドの初期値

フォームの各フィールドの実際の値を格納します。各フィールド値には typecontent の 2 つの属性が含まれます。

inputsValues: {
  url: {
    type: 'constant',          // 定数タイプ
    content: 'https://...',    // 実際の値
  },
  prompt: {
    type: 'template',          // テンプレートタイプ(変数参照をサポート)
    content: 'Hello {var}',    // 変数を参照できます
  },
}

type の選択可能な値

  • 'constant':定数値、変数参照をサポートしません
  • 'template':テンプレート値、{variableName} 構文による変数参照をサポートします
  • 'variable':変数参照

2. data.inputs - ノードフォームの JSON Schema

JSON Schema を使用してフォームの構造を定義します。システムはこの Schema に基づいてフォームインターフェースを自動的に生成します。

inputs: {
  type: 'object',
  required: ['url'],           // 必須フィールド
  properties: {
    url: {
      type: 'string',
    },
    timeout: {
      type: 'number',
      minimum: 0,
      maximum: 60000,
    },
    prompt: {
      type: 'string',
      extra: {
        formComponent: 'prompt-editor',  // カスタムコンポーネントの指定
      },
    },
  },
}

3. data.outputs - ノード出力の JSON Schema

ワークフロー実行時のノードの出力データ構造を定義し、下流ノードで使用できるようにします。

outputs: {
  type: 'object',
  properties: {
    body: { type: 'string' },
    statusCode: { type: 'number' },
    headers: { type: 'object' },
  },
}

三者の関係

inputs (JSON Schema)     →  フォーム構造の定義
inputsValues (実際の値)    →  フォームデータの格納
[ノード実行]
outputs (JSON Schema)    →  出力構造の定義

字段类型与自动组件映射

単純なノードでは、フィールドタイプは対応するフォームコンポーネントに自動的にマッピングされます。

フィールドタイプ extra.formComponent デフォルトコンポーネント
string - Input
string 'prompt-editor' PromptEditorWithVariables
number - InputNumber
boolean - Switch
object - JsonCodeEditor
array - JsonCodeEditor

节点开发模式

1. 简单节点(自动表单模式)

  • 適用シナリオ:ノードの構成が比較的単純で、複雑なカスタム UI が不要な場合
  • 特徴inputs Schema に基づいてフォームを自動生成します
  • :LLM ノード
  • ファイル構造index.ts ファイルのみが必要です
  • テンプレートの場所./templates/simple-node/index.ts

2. 复杂节点(自定义 UI 模式)

  • 適用シナリオ:カスタムフォームレイアウト、特別なインタラクション、または複雑な UI コンポーネントが必要な場合
  • 特徴:フォームのレンダリングとインタラクションロジックを完全に制御します
  • :HTTP ノード
  • ファイル構造
    {ノード名}/
    ├── index.tsx                # ノード登録構成
    ├── form-meta.tsx            # カスタムフォームレンダリング
    ├── types.tsx                # TypeScript 型定義
    └── components/              # カスタムコンポーネント
        └── *.tsx
  • テンプレートの場所./templates/complex-node/

开发流程

Step 1: 规划节点

ノードのコア情報を決定します。

  • ノードタイプ ID:一意の識別子、例:databasewebhook
  • ノード機能:ノードが何をするかを明確にします
  • 入力パラメータ:ノードに必要な構成項目
  • 出力データ:ノード実行後に返されるデータ
  • UI の複雑さ:カスタム UI が必要かどうか

Step 2: 选择开发模式

カスタム UI が必要ですか?
├─ いいえ → 単純ノードモードを使用します(templates/simple-node/ をコピー)
└─ はい → 複雑ノードモードを使用します(templates/complex-node/ をコピー)

Step 3: 复制模板并修改

简单节点

# テンプレートをコピー
cp .claude/skills/create-node/templates/simple-node/index.ts \
   apps/demo-free-layout/src/nodes/{ノード名}/index.ts

# テンプレート内の TODO マークを修正
# - {NODE_NAME} → ノード名(PascalCase)
# - {NODE_TYPE} → ノードタイプ列挙値
# - {node_name} → ノード名(kebab-case)
# - {node_type} → ノードタイプ(小文字)

复杂节点

# テンプレートディレクトリをコピー
cp -r .claude/skills/create-node/templates/complex-node \
      apps/demo-free-layout/src/nodes/{ノード名}

# すべてのファイル内の TODO マークを修正

Step 4: 添加节点类型常量

apps/demo-free-layout/src/nodes/constants.ts を編集します。

export enum WorkflowNodeType {
  // ... 既存のノード
  {ノードタイプ} = '{ノードタイプ}',
}

Step 5: 注册节点

apps/demo-free-layout/src/nodes/index.ts を編集します。

// ノードをインポート
export { {ノード名}NodeRegistry } from './{ノード名}';

// 登録リストに追加
export const nodeRegistries: FlowNodeRegistry[] = [
  // ... 既存のノード
  {ノード名}NodeRegistry,
];

Step 6: 准备节点图标

apps/demo-free-layout/src/assets/ ディレクトリにノードアイコン(SVG または JPG 形式)を追加します。

apps/demo-free-layout/src/assets/icon-{ノード名}.svg

Step 7: 测试验证

# 開発サーバーを起動
rush dev:demo-free-layout

# ブラウザでノード機能をテスト

常用组件和工具

FlowGram 组件

@flowgram.ai/form-materials からインポートします。

import {
  PromptEditorWithVariables,  // 変数付きプロンプトエディタ
  VariableSelector,            // 変数セレクタ
  JsonCodeEditor,              // JSON コードエディタ
  CodeEditor,                  // コードエディタ
  DisplayOutputs,              // 出力フィールドの表示
  DynamicValueInput,           // 動的な値の入力
  createInferInputsPlugin,     // 入力推論プラグイン
} from '@flowgram.ai/form-materials';

Semi UI 组件

@douyinfe/semi-ui からインポートします。

import {
  Input,
  InputNumber,
  Select,
  Switch,
  Button,
  Divider,
} from '@douyinfe/semi-ui';

表单工具

import { Field } from '@flowgram.ai/free-layout-editor';
import { FormItem, FormHeader, FormContent } from '../../form-components';
import { useNodeRenderContext } from '../../hooks';

最佳实践

1. 节点设计

  • 単一責任:1 つのノードは 1 つのことだけを行います
  • 明確な Schema:inputs と outputs を明確に定義します
  • 適切なデフォルト値:意味のある初期構成を提供します
  • わかりやすい説明:ノードとフィールドにわかりやすい説明を提供します

2. Schema 设计

// ✅ 良い例:明確な Schema
inputs: {
  type: 'object',
  required: ['url', 'method'],
  properties: {
    url: {
      type: 'string',
      description: 'API endpoint URL',
    },
    method: {
      type: 'string',
      enum: ['GET', 'POST', 'PUT', 'DELETE'],
    },
  },
}

// ❌ 悪い例:制約が不足
inputs: {
  type: 'object',
  properties: {
    url: { type: 'string' },
    method: { type: 'string' },
  },
}

3. 表单组件使用

// ✅ 良い例:Field を使用してフォームの状態をバインド
<Field<string> name="api.url">
  {({ field }) => (
    <Input
      value={field.value}
      onChange={(value) => field.onChange(value)}
    />
  )}
</Field>

// ❌ 悪い例:手動で状態を管理
const [url, setUrl] = useState('');
<Input value={url} onChange={setUrl} />

4. 只读状态处理

export function CustomComponent() {
  const { readonly } = useNodeRenderContext();

  return (
    <Input disabled={readonly} {...props} />
  );
}

常见问题

Q1: 如何选择简单节点还是复杂节点?

判断标准

  • フィールドが単純 + デフォルトのレイアウトで要件を満たす → 単純ノード
  • カスタムレイアウト/特別なインタラクションが必要 → 複雑ノード

(原文はここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

FlowGram Custom Node Development

概述

本 SKILL 用于指导在 FlowGram 项目的 apps/demo-free-layout/src/nodes 目录下创建新的自定义工作流节点。

核心概念

节点数据结构

节点数据在保存时会存储到后端,基本结构如下:

{
  id: 'node_xxxxx',           // 节点 ID
  type: 'node_type',          // 节点类型
  data: {
    title: 'Node Title',      // 节点标题
    inputsValues: { ... },    // 节点表单字段的初始值(实际的值)
    inputs: { ... },          // 节点表单的 JSON Schema(定义表单结构)
    outputs: { ... },         // 节点输出的 JSON Schema(工作流执行时的输出)
    // ... 其他自定义字段
  }
}

三个核心字段

1. data.inputsValues - 节点表单字段的初始值

存储表单中各个字段的实际值,每个字段值包含 typecontent 两个属性:

inputsValues: {
  url: {
    type: 'constant',          // 常量类型
    content: 'https://...',    // 实际的值
  },
  prompt: {
    type: 'template',          // 模板类型(支持变量引用)
    content: 'Hello {var}',    // 可以引用变量
  },
}

type 的可选值

  • 'constant':常量值,不支持变量引用
  • 'template':模板值,支持 {variableName} 语法引用变量
  • 'variable':变量引用

2. data.inputs - 节点表单的 JSON Schema

使用 JSON Schema 定义表单的结构,系统会根据这个 Schema 自动生成表单界面:

inputs: {
  type: 'object',
  required: ['url'],           // 必填字段
  properties: {
    url: {
      type: 'string',
    },
    timeout: {
      type: 'number',
      minimum: 0,
      maximum: 60000,
    },
    prompt: {
      type: 'string',
      extra: {
        formComponent: 'prompt-editor',  // 指定自定义组件
      },
    },
  },
}

3. data.outputs - 节点输出的 JSON Schema

定义节点在工作流执行时的输出数据结构,供下游节点使用:

outputs: {
  type: 'object',
  properties: {
    body: { type: 'string' },
    statusCode: { type: 'number' },
    headers: { type: 'object' },
  },
}

三者的关系

inputs (JSON Schema)     →  定义表单结构
inputsValues (实际值)    →  存储表单数据
[节点执行]
outputs (JSON Schema)    →  定义输出结构

字段类型与自动组件映射

在简单节点中,字段类型会自动匹配对应的表单组件:

字段类型 extra.formComponent 默认组件
string - Input
string 'prompt-editor' PromptEditorWithVariables
number - InputNumber
boolean - Switch
object - JsonCodeEditor
array - JsonCodeEditor

节点开发模式

1. 简单节点(自动表单模式)

  • 适用场景:节点配置较为简单,不需要复杂的自定义 UI
  • 特点:根据 inputs Schema 自动生成表单
  • 示例:LLM 节点
  • 文件结构:只需要 index.ts 文件
  • 模板位置./templates/simple-node/index.ts

2. 复杂节点(自定义 UI 模式)

  • 适用场景:需要自定义表单布局、特殊交互或复杂的 UI 组件
  • 特点:完全控制表单渲染和交互逻辑
  • 示例:HTTP 节点
  • 文件结构
    {节点名}/
    ├── index.tsx                # 节点注册配置
    ├── form-meta.tsx            # 自定义表单渲染
    ├── types.tsx                # TypeScript 类型定义
    └── components/              # 自定义组件
        └── *.tsx
  • 模板位置./templates/complex-node/

开发流程

Step 1: 规划节点

确定节点的核心信息:

  • 节点类型 ID:唯一标识,如 databasewebhook
  • 节点功能:明确节点要做什么
  • 输入参数:节点需要哪些配置项
  • 输出数据:节点执行后返回什么数据
  • UI 复杂度:是否需要自定义 UI

Step 2: 选择开发模式

是否需要自定义 UI?
├─ 否 → 使用简单节点模式(复制 templates/simple-node/)
└─ 是 → 使用复杂节点模式(复制 templates/complex-node/)

Step 3: 复制模板并修改

简单节点

# 复制模板
cp .claude/skills/create-node/templates/simple-node/index.ts \
   apps/demo-free-layout/src/nodes/{节点名}/index.ts

# 修改模板中的 TODO 标记
# - {NODE_NAME} → 节点名(PascalCase)
# - {NODE_TYPE} → 节点类型枚举值
# - {node_name} → 节点名(kebab-case)
# - {node_type} → 节点类型(小写)

复杂节点

# 复制模板目录
cp -r .claude/skills/create-node/templates/complex-node \
      apps/demo-free-layout/src/nodes/{节点名}

# 修改所有文件中的 TODO 标记

Step 4: 添加节点类型常量

编辑 apps/demo-free-layout/src/nodes/constants.ts

export enum WorkflowNodeType {
  // ... 现有节点
  {节点类型} = '{节点类型}',
}

Step 5: 注册节点

编辑 apps/demo-free-layout/src/nodes/index.ts

// 导入节点
export { {节点名}NodeRegistry } from './{节点名}';

// 添加到注册列表
export const nodeRegistries: FlowNodeRegistry[] = [
  // ... 现有节点
  {节点名}NodeRegistry,
];

Step 6: 准备节点图标

apps/demo-free-layout/src/assets/ 目录下添加节点图标(SVG 或 JPG 格式):

apps/demo-free-layout/src/assets/icon-{节点名}.svg

Step 7: 测试验证

# 启动开发服务器
rush dev:demo-free-layout

# 在浏览器中测试节点功能

常用组件和工具

FlowGram 组件

@flowgram.ai/form-materials 导入:

import {
  PromptEditorWithVariables,  // 带变量的提示词编辑器
  VariableSelector,            // 变量选择器
  JsonCodeEditor,              // JSON 代码编辑器
  CodeEditor,                  // 代码编辑器
  DisplayOutputs,              // 输出字段展示
  DynamicValueInput,           // 动态值输入
  createInferInputsPlugin,     // 输入推断插件
} from '@flowgram.ai/form-materials';

Semi UI 组件

@douyinfe/semi-ui 导入:

import {
  Input,
  InputNumber,
  Select,
  Switch,
  Button,
  Divider,
} from '@douyinfe/semi-ui';

表单工具

import { Field } from '@flowgram.ai/free-layout-editor';
import { FormItem, FormHeader, FormContent } from '../../form-components';
import { useNodeRenderContext } from '../../hooks';

最佳实践

1. 节点设计

  • 单一职责:一个节点只做一件事
  • 清晰的 Schema:明确定义 inputs 和 outputs
  • 合理的默认值:提供有意义的初始配置
  • 友好的描述:为节点和字段提供清晰的描述

2. Schema 设计

// ✅ 好的做法:清晰的 Schema
inputs: {
  type: 'object',
  required: ['url', 'method'],
  properties: {
    url: {
      type: 'string',
      description: 'API endpoint URL',
    },
    method: {
      type: 'string',
      enum: ['GET', 'POST', 'PUT', 'DELETE'],
    },
  },
}

// ❌ 不好的做法:缺少约束
inputs: {
  type: 'object',
  properties: {
    url: { type: 'string' },
    method: { type: 'string' },
  },
}

3. 表单组件使用

// ✅ 好的做法:使用 Field 绑定表单状态
<Field<string> name="api.url">
  {({ field }) => (
    <Input
      value={field.value}
      onChange={(value) => field.onChange(value)}
    />
  )}
</Field>

// ❌ 不好的做法:手动管理状态
const [url, setUrl] = useState('');
<Input value={url} onChange={setUrl} />

4. 只读状态处理

export function CustomComponent() {
  const { readonly } = useNodeRenderContext();

  return (
    <Input disabled={readonly} {...props} />
  );
}

常见问题

Q1: 如何选择简单节点还是复杂节点?

判断标准

  • 字段简单 + 默认布局满足需求 → 简单节点
  • 需要自定义布局/特殊交互 → 复杂节点

Q2: 如何使用变量功能?

inputs Schema 中使用 formComponent: 'prompt-editor',并在 inputsValues 中使用 type: 'template'

Q3: 如何定义必填字段?

inputs Schema 的 required 数组中列出必填字段名。

Q4: inputsValuesinputs 必须一致吗?

是的。inputsValues 中的字段必须在 inputs.properties 中有对应的定义。

Q5: 节点图标支持什么格式?

支持 SVG、JPG、PNG 格式,推荐使用 SVG。

Q6: 如何调试节点?

  1. 使用浏览器开发者工具查看 console.log
  2. 在 FormRender 组件中添加 console.log(form.getValues())
  3. 使用 React DevTools 查看组件状态

参考资源

代码示例

  • 简单节点: apps/demo-free-layout/src/nodes/llm/
  • 复杂节点: apps/demo-free-layout/src/nodes/http/
  • 表单组件: apps/demo-free-layout/src/form-components/
  • 默认表单: apps/demo-free-layout/src/nodes/default-form-meta.tsx

模板文件

  • 简单节点模板: .claude/skills/create-node/templates/simple-node/
  • 复杂节点模板: .claude/skills/create-node/templates/complex-node/

相关文档

开发命令

# 启动开发服务器
rush dev:demo-free-layout

# 构建项目
rush build

# 类型检查
rush ts-check

# 代码检查
rush lint

快速开始检查清单

创建新节点时,按照此检查清单执行:

  • [ ] 规划节点功能和数据结构
  • [ ] 选择开发模式(简单 vs 复杂)
  • [ ] 复制对应的模板文件
  • [ ] 修改模板中的 TODO 标记
  • [ ] 在 constants.ts 中添加节点类型
  • [ ] 在 index.ts 中注册节点
  • [ ] 准备节点图标文件
  • [ ] 启动开发服务器测试
  • [ ] 验证节点功能正常