Files
Arcrun/.agents/specs/arcrun/sdk-and-website/requirements.md
T
uncle6me-web 922a57fe34 arcrun — AI workflow execution engine (clean history)
Self-hosted 開源:WASM 零件 + recipe + cypher-executor,跑在你自己的 Cloudflare。

此為重建的乾淨歷史起點(移除曾誤 commit 的 GCP SA 金鑰,舊歷史保留在
richblack/arcrun 與本地 backup 分支)。含:
- acr init --self-hosted installer(建 KV/R2 + codeload 拉預編譯 wasm + wrangler deploy + seed recipe)
- recipe push 把關(資料外流提醒 + 打通檢查)
- 19 個正當零件預編譯 wasm(claude_api/km_writer/kbdb_upsert_block 排除:違反 DECISIONS §1)
- CLI / cypher-executor / registry / 完整 SDD

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 15:52:38 +08:00

7.4 KiB
Raw Blame History

Requirements: arcrun SDK Libraries + Website

Introduction

arcrun 目前有三個使用介面:

  1. CLIacr 指令)— 已完成,用 YAML 定義 workflow 並推送執行
  2. Python / JS SDK lib(本次新增)— pip install arcrun / npm install arcrun,讓開發者在寫程式時直接用 arcrun 功能
  3. arcrun.dev 網站(本次完成)— 登入取得 API Key、管理 Key、瀏覽零件 / recipe 列表

核心原則SDK lib 是 cypher.arcrun.dev HTTP API 的 thin wrapper。所有業務邏輯(加解密、credential 注入、workflow 執行)都在 server 端完成。Client 端不重做 server 已有的邏輯。

現有基礎設施(不重建,直接使用):

  • cypher.arcrun.devcypher-executor Workerworkflow 執行、credential 管理、auth recipe、webhook
  • u6u-core/credentialscredential WorkerAES-GCM 加解密)— arcrun/credentials 是其 cherry-pick
  • arcrun/cliCLI 工具(已發布 npm arcrun@1.1.0
  • arcrun/landingNext.js 前端(已部署 Cloudflare Pages,有 hero/login/dashboard/integrations 骨架)

Glossary

  • SDK libPython / JS 套件,wrapping cypher.arcrun.dev HTTP API,安裝後可在程式碼中直接使用
  • auth.setup():上傳一個服務的 credential(如 Notion token、OpenAI API Key)到 arcrun
  • auth.bind():取回已設定服務的 pre-authenticated HTTP client
  • auth.get_token():取回某服務的 raw tokenescape hatch,給官方 SDK 用)
  • workflows.run():觸發已部署的 workflow
  • workflows.push():上傳 workflow 定義
  • Recipe:描述「如何對某服務認證」的 YAML 設定,存在 RECIPES KV

Requirements

Requirement 1Python SDKpip install arcrun

User Story: As a Python 開發者, I want pip install arcrun 後在程式碼中使用 arcrun, so that 不用離開寫程式環境就能串接 20+ 服務。

Acceptance Criteria

  1. THE Python SDK SHALL 以 arcrun 套件名發布到 PyPI,支援 Python 3.10+。
  2. THE SDK SHALL 提供以下 API
    • Arcrun(api_key=, base_url=) — 建構 clientapi_key 支援從環境變數 ARCRUN_API_KEY~/.arcrun/config.yaml 自動讀取
    • client.health() — 健康檢查
    • client.auth.list_services() — 列出可用 auth recipe 服務
    • client.auth.setup(service, **kwargs) — 上傳 credential
    • client.auth.bind(service) — 取得 pre-authenticated HTTP client
    • client.auth.get_token(service) — 取得 raw token
    • client.creds.push(name, value) — 上傳加密 credential
    • client.creds.list() — 列出 credential 名稱
    • client.creds.delete(name) — 刪除 credential
    • client.workflows.run(name, input) — 觸發 workflow
    • client.workflows.push(name, graph) — 上傳 workflow
    • client.workflows.list() — 列出已部署 workflow
  3. THE SDK 的 credential 加密 SHALL 在 client 端完成(使用 cryptography 套件 AES-GCM),然後以 POST /credentials 上傳加密後的 { name, encrypted, iv } 到 server。
  4. THE auth.bind() SHALL 從 server 取得 auth recipe 的 inject template,在 client 端用 cache 的 plaintext 值填入,回傳 pre-configured httpx.Client
  5. THE SDK SHALL 使用 httpx 做 HTTP clientasync 版使用 httpx.AsyncClient)。
  6. THE SDK 位置 SHALL 為 arcrun/python-sdk/build 系統用 hatchlingpyproject.toml)。

Requirement 2JavaScript/TypeScript SDKnpm install arcrun

User Story: As a JS/TS 開發者, I want npm install arcrun 後在程式碼中使用 arcrun, so that 可以嵌入現有 Node.js / Deno / Cloudflare Workers 專案。

Acceptance Criteria

  1. THE JS SDK SHALL 以 arcrun 套件名發布到 npm,提供 ESM + CJS 雙格式 + TypeScript 型別定義。
  2. THE SDK SHALL 提供與 Python SDK 對等的 APIcamelCase 版):
    • new Arcrun({ apiKey?, baseUrl? }) — 讀 process.env.ARCRUN_API_KEY
    • client.health() — 回傳 Promise<unknown>
    • client.auth.listServices() / setup() / bind() / getToken()
    • client.creds.push() / list() / delete()
    • client.workflows.run() / push() / list() / delete()
  3. THE SDK 的 credential 加密 SHALL 使用 Web Crypto APIcrypto.subtle AES-GCM),相容 Node 18+、browsers、Cloudflare Workers、Deno。
  4. THE auth.bind() SHALL 回傳一個有 get/post/put/delete/patch 方法的 AuthenticatedClientbase URL + auth headers 已配置。
  5. THE SDK SHALL 使用原生 fetch() API,不依賴外部 HTTP client 套件。
  6. THE SDK 位置 SHALL 為 arcrun/js-sdk/build 用 tsupESM + CJS + DTS),tsconfig.json target ES2020 + NodeNext module。
  7. THE JS SDK 套件名與 CLI 套件名衝突(都叫 arcrun),SHALL 使用 @arcrun/sdk 或由 richblack 決定套件名。

Requirement 3arcrun.dev 網站完成

User Story: As a 潛在用戶, I want 在 arcrun.dev 上登入取得 API Key、瀏覽零件和 recipe 列表, so that 我可以評估 arcrun 是否符合需求並立即開始使用。

Acceptance Criteria

  1. THE 網站 SHALL 在 arcrun.dev 提供以下頁面:
    • / — 首頁 Hero + 三種使用方式(CLI / Python / JS
    • /login — Google + GitHub OAuth 登入
    • /dashboard — 登入後顯示 API Key(查看/Copy/Rotate/Revoke
    • /integrations — 列出 20 個 auth recipe 服務,可按分類篩選
    • /components — 列出所有零件(21 個 WASM 零件),顯示 input/output schema、config_example
    • /api-docs — Swagger UI,可直接試打 API
  2. THE 登入 SHALL 使用 Google + GitHub OAuth,流程走 cypher.arcrun.dev/auth/* 端點。
  3. THE 登入後 SHALL 自動對該 email 呼叫 /register 取得 API Key(若已有則取回現有 key)。
  4. THE /dashboard SHALL 允許 Rotate(生成新 key)、Revoke(標記失效)、Copy to clipboard。
  5. THE 網站 SHALL 部署在 Cloudflare Pages(現有 arcrun/landing),使用 Next.js App Router。
  6. THE 首頁 code demo 區 SHALL 包含三個 tabPython、JavaScript、HTTP/curl,展示三種使用方式。

Requirement 4GitHub README 更新

User Story: As a GitHub 訪客, I want README 清楚說明三種使用方式, so that 我能選擇最適合的方式開始用 arcrun。

Acceptance Criteria

  1. THE arcrun/README.md SHALL 包含三種 Quick Start
    • CLInpm i -g arcrun && acr init && acr push workflow.yaml && acr run
    • Pythonpip install arcrun && from arcrun import Arcrun && ...
    • JavaScriptnpm install arcrun && import { Arcrun } from 'arcrun' && ...
  2. THE README SHALL 包含完整零件列表(21 個)和 auth recipe 列表(20 個服務)。
  3. THE README SHALL 連結到 arcrun.dev(取得 API Key)和 Swagger UIAPI 文件)。

Requirement 5SDK 發布

User Story: As a SDK 使用者, I want 公開安裝並直接使用, so that 不需要從原始碼 build。

Acceptance Criteria

  1. THE Python SDK SHALL 發布到 PyPIpip install arcrun 可安裝。
  2. THE JS SDK SHALL 發布到 npmnpm install arcrun(或 @arcrun/sdk)可安裝。
  3. THE 發布前 SHALL 完成以下測試(對 cypher.arcrun.dev live API):
    • health()
    • auth.list_services()
    • auth.setup() + auth.bind() (至少一個 static_key 服務如 openai
    • creds.push() + creds.list()
    • workflows.list()