test-studio-script-runner

作者: sanity-io

說明 dev/test-studio Script Runner 工具。用於在 dev/test-studio/src/script-runner 中新增、編輯、執行或記錄腳本,或當…

npx skills add https://github.com/sanity-io/plugins --skill test-studio-script-runner

Test Studio Script Runner

Use this skill when working with the Scripts tool in dev/test-studio.

Key Files

  • Tool plugin: dev/test-studio/src/script-runner/index.tsx
  • Runner UI: dev/test-studio/src/script-runner/ScriptRunnerTool.tsx
  • Script registry: dev/test-studio/src/script-runner/registry.ts
  • Script contract: dev/test-studio/src/script-runner/types.ts
  • Script modules: dev/test-studio/src/script-runner/scripts/*/index.ts
  • Agent-facing docs: dev/test-studio/src/script-runner/README.md

Read README.md and types.ts before changing the runner or adding scripts.

What The Tool Does

The runner is a Sanity Studio custom tool registered in the home workspace.

  • Home route: <studio>/home/scripts
  • Script route: <studio>/home/scripts/<script-name>

Scripts are browser-side TypeScript modules discovered at build time with Vite import.meta.glob. They run inside Sanity Studio with the logged-in user's permissions and receive the Studio client.

Adding A Script

Add a folder under dev/test-studio/src/script-runner/scripts/. The folder name should match the script name. Put the registered entrypoint in index.ts; any helper files can live beside it.

scripts/
  my-script-name/
    index.ts
    helpers.ts

Only scripts/*/index.ts files are discovered at build time.

import type {StudioScript} from '../../types'

const script: StudioScript = {
  name: 'my-script-name',
  title: 'My script name',
  description: 'What this script does.',
  apiVersion: '2026-03-01',
  inputs: [
    {
      name: 'documentId',
      title: 'Document ID',
      defaultValue: 'example-id',
      required: true,
    },
  ],
  async run({client, inputs, log}) {
    log.info(`Running for ${inputs.documentId}`)
    await client.fetch('*[_type == "post"][0...1]')
    log.success('Done')
  },
}

export default script

Script names must be unique and use lowercase letters, numbers, and hyphens. Keep the folder name and script name aligned. The script name becomes the URL segment.

Runtime Contract

run() receives:

  • client: Sanity Studio client, configured with the script apiVersion or the runner default.
  • inputs: string values from the run screen, keyed by input name.
  • log: info, success, warning, and error methods that append output in the UI.
  • signal: an AbortSignal reserved for script code that supports cancellation.

String Variables

Use inputs for string variables. Each input renders as a text field on the script run screen. Required inputs disable the run button until non-empty.

Available input fields:

  • name
  • title
  • description
  • defaultValue
  • placeholder
  • required

All values passed to scripts are strings. Validate and trim values inside run() when needed.

Browser-Safe Rules

Script runner modules execute in the browser. Do not use:

  • fs, path, or other Node built-ins
  • process.exit
  • direct environment variable access
  • SANITY_AUTH_TOKEN

Do not create a separate Sanity client from env vars. Use the provided client.

If a task needs Node-only APIs or token-based CLI behavior, keep it in dev/test-studio/scripts/ instead of the Studio script runner.

Verification

After changing the runner or adding scripts, run:

pnpm lint
pnpm --filter test-studio build

If pnpm --filter test-studio build fails because workspace package dist output is missing, build with dependencies first:

pnpm --filter test-studio... build

來自 sanity-io 的更多技能

tdd
sanity-io
以紅-綠-重構循環進行測試驅動開發。當使用者想透過TDD建立功能或修復錯誤、提及「紅-綠-重構」、想要…時使用。
performance-optimization
sanity-io
優化應用程式效能。當存在效能需求、懷疑效能回歸,或核心網頁指標與載入時間…時使用。
content-experimentation-best-practices
sanity-io
結構化指引,涵蓋設計、執行與分析內容實驗以提升轉換率與參與度。內容包括假設框架、指標選擇、樣本數計算,以及A/B測試與多變量實驗中的統計顯著性檢定。提供關於p值、信賴區間、統計檢定力分析及貝氏方法的詳細資源,用於解讀實驗結果。同時包含CMS整合模式,以便在欄位層級管理變體,並連接外部系統。
content-modeling-best-practices
sanity-io
結構化內容建模指南,涵蓋綱要設計、可重用性與多渠道發布。核心原則包括:將內容視為數據而非頁面、維護單一事實來源、為未來渠道設計,以及優化編輯工作流程。提供關於引用與嵌入物件、關注點分離及內容重用模式的決策框架。包含針對扁平、階層與分面分類法的分類學指引。適用於...
portable-text-conversion
sanity-io
將 HTML 和 Markdown 內容轉換為適用於 Sanity 的可攜式文字區塊。用於從舊版 CMS 遷移內容、將 HTML 或 Markdown 匯入 Sanity 等情境。
portable-text-serialization
sanity-io
將 Portable Text 渲染並序列化為 React、Svelte、Vue、Astro、HTML、Markdown 及純文字。適用於在任何前端實作 Portable Text 渲染時使用…
sanity-best-practices
sanity-io
我們要將提供的英文描述翻譯成繁體中文。注意事項:保留產品名稱、協定名稱、URL、數字和技術術語。不要添加聲明、解釋、Markdown、項目符號、鏈接、標籤、前綴或額外評論。只翻譯<text>內的文字,不要包含名稱除非它在源文本中出現。不要包含標籤如「description」、「server name」或「skill name」。 源文本: "Comprehensive best practices and integration guides for Sanity CMS development across frameworks and topics. Covers 10+ framework integrations including Next.js, Nuxt, Astro, Remix, SvelteKit, and Angular with framework-specific patterns and setup guidance Includes topic guides for schema design, GROQ query optimization, Visual Editing, Portable Text, images, TypeGen, localization, and content migrations Provides quick-reference structure for loading only relevant guides based on task type,..." 注意:Sanity CMS 是產品名稱,保留。Next.js, Nuxt, Astro, Remix, SvelteKit
sanity-migration
sanity-io
規劃、執行並審查從其他內容管理系統及內容平台遷移至 Sanity 的作業。適用於從 AEM、Adobe Experience Manager、Contentful、Strapi、Webflow、WordPress、Payload、Drupal、Markdown/MDX/frontmatter 檔案、WXR/XML 匯出、CMS API、資料庫匯出、靜態 HTML 進行遷移或平台轉換,或設計資料擷取、轉換、Portable Text 轉換、資產遷移、重新導向、驗證及切換流程時使用。
data-analysisdatabasedevelopment