Steps
条件、変換、スクリプト、1 つの最終出力を直線的に並べます。各ステップをインスペクタで設定し、テスト前後の値を比較できます。
視覚的なステップまたはコードでワークフローを作り、対応するクリップボード形式を選び、Pasteon の標準アクションの横から実行できます。
Workflow は保存された処理レシピです。選択中のクリップボード項目が指定した入力に合うときだけ、その Action が Pasteon に表示されます。
条件、変換、スクリプト、1 つの最終出力を直線的に並べます。各ステップをインスペクタで設定し、テスト前後の値を比較できます。
インタープリタ、引数、作業フォルダ、タイムアウトを指定して、インラインコードまたは外部スクリプトを実行します。単一結果には Simple、動的候補には Script Filter を使います。
この例では、コピーした文字列の空白を整え、命名形式を統一し、作業中の App に結果を返します。
設定 → Workflows を開き、Workflow を追加して名前とアイコンを設定し、表示対象のクリップボード形式を選びます。
テキスト整理、ケース変換などを追加し、ドラッグで並べ替えます。Output は最後に固定されるため、処理順が明確です。
テストでは実際のコピー、ペースト、URL オープンは行いません。各ステップの前後値、時間、検証状態を確認できます。
Workflow は標準 Primary Actions の直後に表示されます。クリックまたは Enter でペーストし、Command を押すとコピーのみ行います。
ステップは上から順に実行されます。条件は Action の適用を判断し、変換は現在値を更新し、1 つの出力が Pasteon の動作を決めます。
Pasteon は stdin にバージョン付き JSON を送り、stdout からプロトコル JSON を読みます。ログは stderr に出力し、タイムアウト、キャンセル、出力制限で安全に管理します。
1 つの Action がテキスト、ファイル、URL のいずれか 1 結果を生成する場合に使います。
{
"version": 1,
"result": {
"type": "text",
"value": "Ready to paste"
}
}Filter フェーズは軽量な候補情報だけを返します。ユーザーが選んだ後に Pasteon が execute を実行します。
{
"version": 1,
"actions": [
{
"id": "swift",
"title": "Generate Swift Model",
"argument": { "language": "swift" }
}
]
}スクリプトは phase「filter」を受け取り、最大 20 件の候補 Action を返します。
Pasteon は結果を事前計算せず、タイトル、説明、アイコン、JSON 引数を表示します。
選択した actionId と argument をスクリプトへ返し、その結果だけを計算します。
stdout はプロトコル JSON 専用です。診断は stderr に出力してください。インラインと外部スクリプトは同じ契約を使います。
Code Workflow の作成や .pasteon-workflow ファイルの生成時に参照できます。
Workflow の表示条件と Pasteon がスクリプトを起動する方法を指定します。
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
id | UUID | Yes | Stable Workflow identifier used for updates, Filter sessions, import conflict detection, and workflowID input. |
defaultIntroducedVersion | Integer | null | Bundled only | Catalog version that introduced a bundled default. It lets upgrades install only newly added defaults without restoring ones a user deleted. |
name | String | Yes | The Workflow and Action name shown in Settings and the Pasteon action list. |
nameLocalizationKey | String | null | Bundled only | Optional String Catalog key used to localize the name of a bundled Workflow. User edits clear this key. |
summary | String | No | A short explanation displayed beside the Action. It does not affect execution. |
summaryLocalizationKey | String | null | Bundled only | Optional localization key for the bundled Workflow summary. |
symbolName | SF Symbol name | Yes | The icon used by the Workflow Action. Invalid candidate icons fall back to this symbol. |
isEnabled | Boolean | Yes | Disabled Workflows remain saved but do not generate Actions. |
requiresTrustConfirmation | Boolean | null | Imported | Marks imported code as untrusted. Pasteon sets this to true and disables the Workflow until the user confirms it. |
sortOrder | Number | Yes | Controls the order of Custom Workflow Actions after built-in Primary Actions. |
mode | simple | scriptFilter | Yes | Simple executes immediately. Script Filter runs filter first, then execute after a candidate is chosen. |
supportedTypes | PasteType[] | Yes | Clipboard types where the Action may appear: text, markdown, html, json, url, color, date, timestamp, fileURL, imageURL, videoURL, image, or appObject. |
editorMode | steps | code | No | Selects the visual linear editor or script editor. Older Workflow files without this field use Code. |
script.source | inline | external | Code | Inline stores code inside the Workflow. External references a script on disk. |
script.code | String | Inline | The inline script body. Pasteon writes it to a temporary file for each run. |
script.codeResource | Resource name | null | Bundled only | Bundle resource containing code for a default Workflow. Exported user Workflows carry resolved inline code instead. |
script.scriptPath | File path | External | Path to the external script. Tilde paths are expanded. Missing files keep the configuration but prevent an Action from appearing. |
script.interpreterPath | Executable path | Inline | Executable used to run the script, such as /bin/zsh or the result of which node. External executable scripts may leave it empty. |
script.arguments | String[] | No | Arguments passed as an array before the generated or external script path. Pasteon does not join them into a shell command. |
script.workingDirectory | Directory path | No | Current directory for the process. When empty, external scripts use their folder and inline scripts use the temporary input folder. |
script.filterTimeout | Seconds | Filter | Maximum Filter duration. Values are clamped to 1–120 seconds; the default is 5. |
script.executeTimeout | Seconds | Yes | Maximum Execute duration. Values are clamped to 1–120 seconds; the default is 15. |
steps | WorkflowStep[] | null | Steps | Ordered linear step definitions. Steps mode requires Simple mode and exactly one final output. OCR enables image input; PNG File and Open in Finder apply stricter input-type rules. |
variables | WorkflowVariableDefinition[] | null | No | Reusable Text or Secret values available to Steps templates and Code Workflow stdin. Names must be unique within the Workflow. |
ユーザーが実行した後に生成され、バイナリデータは一時ファイルとして渡されます。
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
version | Integer | Yes | Workflow protocol version. The current and only supported value is 1. |
workflowID | UUID String | Yes | Stable identifier of the Workflow being run. |
phase | filter | execute | Yes | Tells a shared script which stage to run. Simple Workflows receive execute only. |
paste.id | UUID String | Yes | Identifier of the selected Pasteon history item. |
paste.type | PasteType | Yes | The derived clipboard content type used for Workflow visibility and script logic. |
paste.text | String | null | No | Text form of the selected content when available. Files and binary images may not have text. |
paste.sourceAppBundleIdentifier | String | null | No | Bundle identifier of the app where the clipboard item was originally copied. |
paste.representations | Representation[] | Yes | All available pasteboard representations. Text may be inline; binary data is exposed by file path. |
targetApp.bundleIdentifier | String | null | No | Bundle identifier of the frontmost app that will receive the result. |
targetApp.name | String | null | No | Localized display name of the frontmost target app. |
directories.input | Directory path | Yes | Temporary run directory containing the inline script and materialized binary inputs. Removed after the run. |
directories.output | Directory path | Yes | Directory where the script should create returned files. Unused output directories are cleaned after 24 hours. |
variables | Record<String, String> | Yes | Resolved variables keyed by name. Text and Secret values are available during both Filter and Execute. |
actionID | String | null | Execute after Filter | ID of the candidate chosen from Filter output. Null during filter and for Simple Workflows. |
argument | JSON value | null | Execute after Filter | The selected candidate’s argument, returned unchanged so execute can compute only that choice. |
{
"version": 1,
"workflowID": "5F604A89-7AC2-45D9-B48C-BB540B60CA67",
"phase": "execute",
"paste": {
"id": "D0A4E45A-61F6-4DAF-BC1E-4E17A23AA5C0",
"type": "json",
"text": "{\"name\":\"Pasteon\"}",
"sourceAppBundleIdentifier": "com.apple.Safari",
"representations": [
{
"type": "public.utf8-plain-text",
"value": "{\"name\":\"Pasteon\"}",
"path": null,
"fileName": null,
"fileSize": 18,
"temporary": false
}
]
},
"targetApp": {
"bundleIdentifier": "com.apple.dt.Xcode",
"name": "Xcode"
},
"directories": {
"input": "/tmp/Pasteon/WorkflowInputs/RUN_ID",
"output": "~/Library/Application Support/Pasteon/WorkflowOutputs/RUN_ID"
},
"variables": {
"API_BASE_URL": "https://api.example.com",
"API_TOKEN": "••••••••"
},
"actionID": "swift",
"argument": { "language": "swift" }
}Each example reads the complete stdin payload, accesses paste.text and a PREFIX Workflow variable, then writes one valid Simple Workflow result to stdout.
Use file descriptor 0 with the Node.js standard library.
/opt/homebrew/bin/nodeconst fs = require("node:fs");
const payload = JSON.parse(fs.readFileSync(0, "utf8"));
const text = payload.paste?.text ?? "";
const prefix = payload.variables?.PREFIX ?? "";
process.stdout.write(JSON.stringify({
version: 1,
result: { type: "text", value: prefix + text }
}));Use json.load with sys.stdin and json.dump with sys.stdout.
/opt/homebrew/bin/python3import json
import sys
payload = json.load(sys.stdin)
text = payload.get("paste", {}).get("text") or ""
prefix = payload.get("variables", {}).get("PREFIX", "")
json.dump({
"version": 1,
"result": {"type": "text", "value": prefix + text}
}, sys.stdout)Read $stdin, parse with JSON, and write only protocol JSON.
/opt/homebrew/bin/rubyrequire "json"
payload = JSON.parse($stdin.read)
text = payload.dig("paste", "text") || ""
prefix = payload.dig("variables", "PREFIX") || ""
$stdout.write(JSON.generate({
version: 1,
result: { type: "text", value: prefix + text }
}))Read the STDIN stream and use PHP’s built-in JSON functions.
/opt/homebrew/bin/php<?php
$payload = json_decode(stream_get_contents(STDIN), true);
$text = $payload["paste"]["text"] ?? "";
$prefix = $payload["variables"]["PREFIX"] ?? "";
echo json_encode([
"version" => 1,
"result" => ["type" => "text", "value" => $prefix . $text]
]);Read FileHandle.standardInput and decode with Foundation.
/usr/bin/swiftimport Foundation
let data = FileHandle.standardInput.readDataToEndOfFile()
let payload = try JSONSerialization.jsonObject(with: data) as? [String: Any]
let paste = payload?["paste"] as? [String: Any]
let variables = payload?["variables"] as? [String: String]
let text = paste?["text"] as? String ?? ""
let prefix = variables?["PREFIX"] ?? ""
let response: [String: Any] = [
"version": 1,
"result": ["type": "text", "value": prefix + text]
]
let output = try JSONSerialization.data(withJSONObject: response)
FileHandle.standardOutput.write(output)Zsh reads the raw payload; jq performs JSON parsing and encoding.
/bin/zsh#!/bin/zsh
set -euo pipefail
payload="$(cat)"
text="$(printf '%s' "$payload" | jq -r '.paste.text // ""')"
prefix="$(printf '%s' "$payload" | jq -r '.variables.PREFIX // ""')"
jq -n --arg value "$prefix$text" '{
version: 1,
result: {type: "text", value: $value}
}'Pasteon does not bundle language runtimes or jq. Set interpreterPath to an executable that exists on the current Mac. Homebrew paths differ between Apple silicon and Intel Macs; use “which node”, “which python3”, or the equivalent to find the correct path.
Every step has identity, behavior, enabled state, and one shared configuration object. Only fields used by the selected kind affect execution.
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
steps[].id | UUID | Yes | Stable identity used by selection, drag ordering, validation, and per-step test results. |
steps[].kind | WorkflowStepKind | Yes | Selects the condition, transform, script, or output operation. |
steps[].isEnabled | Boolean | Yes | Disabled non-output steps are skipped. The final Output cannot be disabled. |
configuration.pattern | String | Match / Replace | Text, app identifier fragment, or regular expression to test or replace. |
configuration.replacement | String | Replace | Replacement text. In Regex mode it follows NSRegularExpression replacement template rules. |
configuration.matchMode | contains | equals | startsWith | endsWith | regularExpression | Match / Replace | Controls how pattern is compared. Replace uses plain replacement unless regularExpression is selected. |
configuration.isCaseSensitive | Boolean | Match / Replace | When false, text comparison and Regex replacement are case-insensitive. |
configuration.trimMode | whitespaceAndNewlines | whitespace | newlines | Trim | Selects which characters are removed from both ends. |
configuration.caseStyle | camel | pascal | snake | screamingSnake | kebab | train | dot | Change Case | Target naming convention for the current text. |
configuration.template | String | Template | Text template containing supported placeholders such as {{input}} and {{date}}. |
configuration.fileName | String | Output File | Output file name, with template variables allowed. Directory components are discarded for safety. |
configuration.script | ScriptConfiguration | Run Script | Script settings for this step. A Run Script step must return a text result for the next visual step. |
textConditionShow and run only when the current text matches pattern.
sourceAppConditionMatch the bundle identifier of the app that created the clip.
targetAppConditionMatch the bundle identifier of the frontmost destination app.
trimTextRemove selected whitespace characters from both ends.
replaceTextPerform plain or regular-expression replacement.
changeCaseConvert the current text to the configured naming style.
urlEncode / urlDecodePercent-encode or decode the current text.
jsonPretty / jsonMinifyParse JSON, sort keys, then pretty-print or compact it.
templateReplace supported placeholders in a text template.
runScriptRun a Simple Code Workflow step that must return text.
recognizeTextUse macOS Vision OCR on Clipboard Image or ImageURL input and pass the recognized text to the following steps.
outputText / outputFile / outputOpenURLReturn text, create a text file, or open a supported URL. Exactly one output is kept at the end of a valid Steps Workflow.
outputPNGFileConvert Clipboard Image or ImageURL input to a PNG file. Other input types make the Workflow invalid.
outputRevealInFinderReveal a local FileURL, ImageURL, or VideoURL in Finder. Workflow testing reports the path without opening Finder.
各クリップボード形式を表し、テキストは value、ファイルは path を使います。
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
type | UTI String | Yes | Pasteboard type identifier, such as public.utf8-plain-text, public.file-url, public.png, or public.html. |
value | String | null | No | Inline UTF-8 value for text-like representations or the original file URL string. |
path | File path | null | No | Original local file path or temporary path created for binary representation data. |
fileName | String | null | No | Original or generated safe file name associated with the representation. |
fileSize | Int64 | Yes | Representation size in bytes, using stored metadata when available. |
temporary | Boolean | Yes | True when Pasteon wrote binary data into directories.input for this run. Do not retain that path. |
Filter は候補のみを返し、すべての最終結果を事前計算しません。
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
version | Integer | Yes | Must equal the supported protocol version: 1. |
actions | Action[] | Yes | Non-empty candidate list. Pasteon validates and displays at most the first 20 items. |
actions[].id | String | Yes | Candidate identifier returned as actionID during execute. After trimming, length must be 1–120 characters. |
actions[].title | String | Yes | Visible candidate title. After trimming, length must be 1–120 characters. |
actions[].subtitle | String | null | No | Secondary explanation shown beside the candidate. Pasteon keeps the first 240 characters. |
actions[].icon | SF Symbol | null | No | SF Symbol name for the candidate. Invalid symbols fall back to the parent Workflow icon. |
actions[].argument | JSON value | null | No | Opaque JSON value sent back unchanged during execute. It may be an object, array, string, number, boolean, or null. |
Execute は 1 つの result と、その type に必要なフィールドだけを返します。
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
version | Integer | Yes | Must equal the supported protocol version: 1. |
result | Object | Yes | The one final result Pasteon should apply. |
result.type | text | files | openURL | revealFile | Yes | Selects validation and the normal versus Command-mode behavior. |
result.value | String | text | Non-empty text to paste normally or copy when Command mode is active. |
result.paths | String[] | files | revealFile | For files, a non-empty list whose relative paths resolve inside directories.output and must exist. For revealFile, the first path is the local item to reveal. |
result.url | String | openURL | Valid http, https, or mailto URL. Normal mode opens it; Command mode copies it. |
revealFile behavior | Local file action | revealFile | Normal Action execution reveals the first path in Finder and hides Pasteon. Command mode does not change this result into copy-only behavior. |
{
"version": 1,
"result": {
"type": "files",
"paths": ["GeneratedModel.swift"]
}
}Runner は引数を個別に渡し、stdout と stderr を読み、不要になった処理を中止します。
stdout must contain one protocol JSON document and no log lines. Exceeding the limit terminates the process.
Write logs and diagnostics to stderr. It is captured for testing and errors.
Filter and Execute have separate configurable timeouts. Pasteon terminates an overdue process.
A non-zero process exit is treated as failure, with captured stderr included in the error.
Switching Paste items, returning from Filter results, editing or deleting the Workflow, or closing the window cancels the run.
Arguments are passed as an array. Pasteon does not expand pipes, wildcards, variables, or other shell syntax.
Workflow output directories older than 24 hours are removed during application cleanup.
Scripts execute locally with the current macOS user’s access. Review imported code before enabling it.
Define values once in Settings and reuse them in visual Steps or Code Workflows. Text values are stored with the Workflow. Secret values are stored in the macOS Keychain and removed from exported files.
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
variables[].id | UUID | Yes | Stable identity used to associate a Secret with its Keychain value. Copying a Workflow creates new variable IDs. |
variables[].name | String | Yes | Case-sensitive lookup name. It must match [A-Za-z_][A-Za-z0-9_]* and be unique within the Workflow. |
variables[].kind | text | secret | Yes | Text stores its value in the Workflow. Secret stores its value in the macOS Keychain. |
variables[].value | String | Text only | Text value saved and exported with the Workflow. Secret definitions always export this field as an empty string. |
{
"variables": [
{
"id": "C3EEAF0E-0AD8-4A26-924C-CB867088D955",
"name": "API_BASE_URL",
"kind": "text",
"value": "https://api.example.com"
},
{
"id": "7E05B2EE-E745-4558-A267-E63B7D1E2235",
"name": "API_TOKEN",
"kind": "secret",
"value": ""
}
]
}Template とファイル名ステップは、これらの完全なプレースホルダーを置換します。
{{input}}Current text from the previous step.{{sourceApp}}Source app bundle identifier, or an empty string.{{targetApp}}Frontmost target app bundle identifier, or an empty string.{{clipboardType}}Current PasteType raw value.{{date}}Current date and time in ISO 8601 format.{{variables.NAME}}Value of the user-defined Text or Secret variable with the matching case-sensitive name.Code Workflow は stdin JSON に加えてこれらを参照できます。
PASTEON_WORKFLOW_IDUUID of the current Workflow.PASTEON_WORKFLOW_PHASEfilter or execute.PASTEON_INPUT_DIRPath matching directories.input.PASTEON_OUTPUT_DIRPath matching directories.output.Exports are readable versioned JSON. A file may contain one Workflow or the full Workflow list.
| フィールド | 型 | 必須 | 役割 |
|---|---|---|---|
version | Integer | Yes | Envelope protocol version. Import currently accepts version 1. |
installedDefaultsVersion | Integer | null | No | Internal default-catalog state. User exports write null and imports do not use it to enable defaults. |
workflows | WorkflowDefinition[] | Yes | One or more complete Workflow definitions. A bare single WorkflowDefinition is also accepted for compatibility. |
1 つのスクリプトで Filter と Execute を処理し、選択結果だけを計算します。
インタープリタ: /opt/homebrew/bin/nodeasync function main() {
let input = "";
process.stdin.setEncoding("utf8");
for await (const chunk of process.stdin) input += chunk;
const payload = JSON.parse(input);
const text = payload.paste?.text ?? "";
let response;
if (payload.phase === "filter") {
response = {
version: 1,
actions: [
{
id: "uppercase",
title: "Convert to Uppercase",
subtitle: "Uppercase the copied text",
icon: "textformat",
argument: null
},
{
id: "wrap",
title: "Wrap in Brackets",
subtitle: "Add [ and ]",
icon: "curlybraces",
argument: { prefix: "[", suffix: "]" }
}
]
};
} else {
const argument = payload.argument ?? {};
const value =
payload.actionID === "uppercase"
? text.toUpperCase()
: (argument.prefix ?? "") + text + (argument.suffix ?? "");
response = {
version: 1,
result: { type: "text", value }
};
}
process.stdout.write(JSON.stringify(response));
}
main().catch((error) => {
process.stderr.write(`${error.stack ?? error.message}\n`);
process.exit(1);
});“which node” の結果を使ってください。診断は console.log ではなく console.error に出力します。
通常実行はすぐ結果を適用します。Command クリックまたは Command + Enter では、テキスト、ファイル、URL をコピーのみに切り替えます。
text生成テキスト、整形済み内容、テンプレート、コードなど任意の文字列を返します。
files指定の出力フォルダにファイルを作成し、そのパスを Pasteon に返します。
openURLWeb やメールリンクを開き、Command モードでは URL をコピーします。
revealFileローカルファイルを Finder に表示します。テスト時はパスのみ表示します。
Pasteon は以下を標準で有効にします。他の Workflow と同様に確認、編集、無効化、複製、エクスポート、削除できます。
Script Filter.json.txt.mdopenURLScript FilterSimpleScript FilterOCR → テキスト画像 → .pngrevealFileWorkflow ファイルは読み取り可能で移植できます。インポートした Workflow は、コードを確認して信頼するまで無効です。
必要ありません。Steps モードは一般的な条件、テキスト変換、テンプレート、スクリプト、出力を直線的なエディタで扱えます。必要な場合だけ Code を使えます。
Simple は 1 回実行して 1 結果を返します。Script Filter は軽量な候補を先に返し、選択したものだけを execute します。
有効な Workflow は、選択項目が入力形式と条件に一致すると、標準 Primary Actions の後に表示されます。
設定したインタープリタと作業フォルダを使い、Mac 上でローカル実行されます。インポートした Workflow は有効化するまで実行されません。
はい。Pasteon Pro ではカスタム Workflow の作成、テスト、インポート、エクスポート、実行ができます。
Pasteon for Mac をダウンロードし、視覚的な Workflow から始め、必要なときだけスクリプトへ進めます。