본문으로 건너뛰기

Workflow 매니페스트 작성하기

workflow.json은 Workflow의 매니페스트 파일로, 모든 메타데이터와 동작을 정의합니다. Workflow Manager는 이 파일을 통해 Workflow를 발견하고 로드합니다.

기본 구조

{
"id": "my-workflow",
"label": "My Workflow",
"version": "1.0.0",
"provider": "pass-through",
"display": {
"core": false,
"emoji": "🔧"
},
"inputs": { "unit": "parent" },
"parameters": {},
"execution": {},
"request": { "kind": "pass-through.run.v1" },
"hooks": {
"preflight": "hooks/preflight.mjs",
"applyResult": "hooks/applyResult.mjs"
}
}

필드 레퍼런스

기본 식별

필드필수타입설명
idstring고유 식별자; 중복될 수 없습니다. kebab-case 권장
labelstring사용자에게 표시되는 이름
versionstring시맨틱 버전 번호, 예: "1.0.0"
providerstring백엔드 타입. 사용 가능한 값은 아래 참조

Provider 값

설명
"pass-through"순수 로컬 실행, 백엔드 불필요. 파일 작업, 내보내기 등에 적합
"skillrunner"Skill-Runner 백엔드를 통해 Skill 실행
"acp"ACP 백엔드를 통해 Skill 실행
"generic-http"Generic HTTP 백엔드를 통해 API 호출

provider는 Workflow가 호환되는 백엔드 타입을 결정하며, Dashboard에서 실행 가능하게 표시되는 백엔드도 결정합니다.

표시 제어

{
"display": {
"core": true,
"emoji": "📊"
},
"taskNameTemplate": "처리 중: {query}",
"debug_only": false
}
필드타입설명
display.coreboolean핵심 Workflow로 표시할지 여부 (Dashboard에서 우선 표시, core 배지 포함)
display.emojistring표시 이름 접두사 아이콘, 예: "📖"
taskNameTemplatestring{파라미터 이름} 자리표시자를 사용하는 작업 이름 템플릿, 실행 시 실제 값으로 대체
debug_onlybooleantrue이면 디버그 모드에서만 표시

입력 정의

{
"inputs": {
"unit": "attachment",
"accepts": {
"mime": ["text/markdown", "text/x-markdown", "application/pdf"]
},
"per_parent": {
"min": 1,
"max": 1
}
}
}
필드설명
unit입력 유닛 타입. "attachment" (첨부파일), "parent" (부모 항목), "note" (노트), "workflow" (항목 선택 불필요, Dashboard에서 직접 트리거)
accepts.mime허용되는 MIME 타입 (unit: "attachment"일 때만 적용). 지정되지 않으면 모든 타입 허용
per_parent.min부모 항목당 최소 첨부파일 수
per_parent.max부모 항목당 최대 첨부파일 수

unit: "workflow"일 때, 트리거에 사용자 선택 항목이 필요하지 않습니다 (예: "주제 종합 생성").

validateSelection — 선택 검증

validateSelection은 선언적 선택 검증입니다. "이미 결과가 있는 항목 건너뛰기" 또는 "특정 타입의 선택만 허용"과 같은 일반적인 시나리오를 다룹니다 — JavaScript를 작성할 필요 없이.

{
"validateSelection": {
"select": {
"policy": "literature-source"
},
"require": {
"counts": {
"parents": 1
},
"allowMixed": false
},
"exclude": [
{
"kind": "generated-notes-all",
"noteKinds": ["digest", "references", "citation-analysis"]
}
]
}
}

select — 선택 정책

필드타입설명
select.policystring선택 정책. 지원 값은 아래 참조
select.unitstring선택 검증을 위한 입력 유닛 재정의. "attachment" / "parent" / "note" / "workflow"

지원되는 select.policy 값:

정책설명
input-unit입력 유닛에 일치하는 항목 허용
literature-source문헌 출처 허용 (첨부파일 또는 확장 가능한 첨부파일이 있는 부모 항목)
pdf-attachmentPDF 첨부파일만 허용
selected-parent선택 항목의 부모 항목 허용
generated-note-candidates생성된 노트의 후보 항목 허용
digest-representative-image대표 이미지 추출 대상 항목

require — 선택 요구사항

필드타입설명
require.counts.parentsnumber최소 필요 부모 항목 수
require.counts.attachmentsnumber최소 필요 첨부파일 항목 수
require.counts.notesnumber최소 필요 노트 항목 수
require.counts.childrennumber최소 필요 자식 항목 수
require.counts.totalnumber최소 필요 전체 항목 수
require.allowMixedboolean선택에서 다양한 항목 타입을 혼합할 수 있는지 여부

exclude — 제외 규칙

필드타입설명
exclude[]array제외 규칙 목록. 어떤 규칙이라도 일치하면 현재 항목이 건너져집니다

지원되는 exclude.kind 값:

kind설명추가 파라미터
generated-notes-all항목에 이미 지정된 타입의 생성된 노트가 있음noteKinds: 노트 타입 목록, 예: ["digest", "references", "citation-analysis"]
artifact-exists항목에 이미 지정된 아티팩트가 있음 (중복 실행 방지)target: "deep-reading-html" / "translator-markdown" / "mineru-markdown"; parameter: 아티팩트 매칭을 위한 선택적 언어 파라미터

derive — 파생 선택

필드타입설명
derive[]array파생 선택 작업. "exportCandidates" — 노트 내보내기를 위한 후보 파생; "digestRepresentativeImageTarget" — digest 노트에서 대표 이미지 대상 파생

예시:

{
"validateSelection": {
"select": { "policy": "literature-source" },
"exclude": [
{ "kind": "artifact-exists", "target": "deep-reading-html" }
]
}
}

이 예시에서는 심층 읽기 HTML 아티팩트가 이미 있는 항목이 자동으로 건너져되며, 사용자가 수동으로 필터링할 필요가 없습니다.

트리거 제어

{
"trigger": {
"requiresSelection": false
}
}
필드설명
requiresSelection트리거에 사용자 선택 항목이 필요한지 여부. 기본값은 true. false로 설정하면 항목을 선택하지 않고도 Dashboard에서 Workflow를 실행할 수 있습니다. 일반적으로 inputs.unit: "workflow"일 때 false로 설정

실행 제어

{
"execution": {
"timeout_ms": 600000,
"poll_interval_ms": 2000,
"mcp": {
"requiredTools": ["search_items", "get_item_detail"]
},
"zoteroHostAccess": {
"required": false,
"allowWriteApprovalBypass": false
},
"feedback": {
"showNotifications": true
}
}
}
필드설명
timeout_ms밀리초 단위 타임아웃 (Generic HTTP 백엔드에 대해서만 유효)
poll_interval_ms밀리초 단위 폴링 간격, 진행 상태 확인 빈도 제어
mcp.requiredTools이 Workflow에 필요한 MCP 도구 (도구 이름 문자열 배열)
zoteroHostAccess.requiredZotero 호스트 접근이 필요한지 여부 (라이브러리 데이터 읽기/쓰기)
zoteroHostAccess.allowWriteApprovalBypass쓰기 작업 승인 우회 허용 여부
feedback.showNotifications실행 알림 표시 여부. 기본값은 true; false로 설정하면 자동으로 실행

실행 모드 (auto / interactive)는 request.create.mode로 이동되었습니다 — 요청 종류 참조.

결과 검색

{
"result": {
"fetch": { "type": "bundle" },
"final_step_id": "finalize",
"expects": {
"result_json": "result/result.json",
"artifacts": [
"result/artifact1",
"result/artifact2"
]
}
}
}
필드설명
fetch.type검색 방법. "bundle" (zip 번들 다운로드), "result" (결과 JSON만 검색)
final_step_id시퀀스 Workflow의 경우, 최종 단계의 id를 지정하여 최종 결과를 판별하는 데 사용
expects.result_json예상 결과 JSON 파일 경로 (런타임 작업 공간 기준 상대 경로)
expects.artifacts예상 아티팩트 파일 경로 목록

요청 정의

선언적 요청 정의로, hooks.buildRequest상호 배타적입니다 (둘 다 존재하면 hooks.buildRequest가 우선).

{
"request": {
"kind": "skillrunner.job.v1",
"create": {
"skill_id": "my-skill",
"skill_source": "local-package"
},
"input": {
"upload": {
"files": [
{ "key": "source", "from": "selected.markdown" }
]
}
},
"poll": {
"interval_ms": 2000,
"timeout_ms": 600000
}
}
}

kind에 대한 자세한 정보는 요청 종류를 참조하세요.

훅 선언

{
"hooks": {
"preflight": "hooks/preflight.mjs",
"buildRequest": "hooks/buildRequest.mjs",
"normalizeSettings": "hooks/normalizeSettings.mjs",
"applyResult": "hooks/applyResult.mjs"
}
}
필드필수설명
applyResult필수. 실행 후 결과 처리를 위한 스크립트 경로
preflight선택. 선택 해석 후, 요청 구축 전에 실행됩니다. 계속 진행, 건너뛰기, applyResult로 단축, 또는 하나의 입력 유닛을 가상 요청 유닛으로 교체할 수 있습니다
buildRequest선택. 백엔드로 전송할 요청을 구축. request 필드와 상호 배타적
normalizeSettings선택. 사용자가 설정한 파라미터를 정규화

입력 필터링은 선언적 validateSelection 메커니즘으로 대체되었습니다 — 아래 선택 검증 참조.

preflight는 메뉴 활성화, debug-probe 선택 분류, 또는 Host Bridge 준비 확인에 관여하지 않습니다. 선택 제약은 validateSelection에, provider 요청 구성은 buildRequest 또는 request에, Zotero 쓰기는 applyResult에 유지하세요.

경로는 workflow.json이 포함된 디렉터리 기준 상대 경로입니다.

지역화

{
"i18n": {
"defaultLocale": "en-US",
"messages": {
"zh-CN": {
"label": "내 Workflow",
"parameters.language.title": "언어"
}
}
}
}

자세한 정보는 지역화 페이지를 참조하세요.

완전한 예시: 파라미터가 포함된 문헌 분석 Workflow

{
"id": "my-literature-analysis",
"label": "내 문헌 분석",
"version": "1.0.0",
"provider": "skillrunner",
"display": { "emoji": "📄" },
"inputs": {
"unit": "attachment",
"accepts": { "mime": ["application/pdf"] },
"per_parent": { "min": 1, "max": 1 }
},
"parameters": {
"language": {
"type": "string",
"title": "출력 언어",
"default": "en-US",
"enum": ["en-US", "zh-CN", "ja-JP"],
"allowCustom": true
}
},
"execution": {
"mode": "auto",
"skillrunner_mode": "auto",
"timeout_ms": 600000
},
"request": {
"kind": "skillrunner.job.v1",
"create": { "skill_id": "literature-analysis" }
},
"result": {
"fetch": { "type": "bundle" },
"expects": {
"result_json": "result/result.json"
}
},
"hooks": {
"applyResult": "hooks/applyResult.mjs"
}
}

다음 단계