Skip to content

OPSX 工作流程 ​

歡迎在 Discord 上提供回饋。

什麼是 OPSX? ​

OPSX 現在是 OpenSpec 的標準工作流程。

它是一個流暢、迭代的 OpenSpec 變更工作流程。不再有僵硬的階段劃分——隨時都可以採取行動。

為何存在 ​

傳統的 OpenSpec 工作流程可以運作,但它是鎖死的:

  • 指令是寫死的 — 埋藏在 TypeScript 中,你無法修改它們
  • 全有或全無 — 一個大指令會建立所有東西,無法單獨測試個別部分
  • 固定結構 — 對所有人都是相同的工作流程,無法自訂
  • 黑箱 — 當 AI 輸出不佳時,你無法調整提示詞

OPSX 開啟了它。 現在任何人都可以:

  1. 試驗指令 — 編輯範本,看看 AI 是否表現更好
  2. 精細測試 — 獨立驗證每個產物的指令
  3. 自訂工作流程 — 定義你自己的產物與依賴關係
  4. 快速迭代 — 修改範本,立即測試,無需重新建置
傳統工作流程:                      OPSX:
┌────────────────────────┐           ┌────────────────────────┐
│  寫死在套件中           │           │  schema.yaml           │◄── 你編輯這裡
│  (無法修改)           │           │  templates/*.md        │◄── 或這裡
│        ↓               │           │        ↓               │
│  等待新版本釋出         │           │  立即生效              │
│        ↓               │           │        ↓               │
│  希望更好               │           │  自行測試              │
└────────────────────────┘           └────────────────────────┘

這對所有人都有益:

  • 團隊 — 建立符合實際工作方式的工作流程
  • 進階使用者 — 調整提示詞,讓 AI 在你們的程式碼庫上輸出更好
  • OpenSpec 貢獻者 — 無需發佈即可試驗新方法

我們都還在學習什麼方法最有效。OPSX 讓我們一起學習。

使用者體驗 ​

線性工作流程的問題: 你處於「規劃階段」,然後「實作階段」,然後「完成」。但實際工作並非如此。你實作某些東西,發現設計錯誤,需要更新規格,繼續實作。線性階段與實際工作的進行方式背道而馳。

OPSX 方法:

  • 行動,而非階段 — 建立、實作、更新、封存 — 隨時都可以執行任何一個
  • 依賴關係是促成者 — 它們顯示什麼是可能的,而不是下一步必須做什麼
  proposal ──→ specs ──→ design ──→ tasks ──→ implement

設定 ​

bash
# 確保你已安裝 openspec — 技能會自動產生
openspec init

這會在 .claude/skills/(或等效目錄)中建立技能,AI 編碼助理會自動偵測這些技能。

預設情況下,OpenSpec 使用 core 工作流程設定檔(propose、explore、apply、update、sync、archive)。如果你想要擴充的工作流程指令(new、continue、ff、verify、bulk-archive、onboard),請使用 openspec config profile 進行設定,並使用 openspec update 套用。

在設定期間,系統會提示你建立一個專案設定(openspec/config.yaml)。這是可選的,但建議執行。

專案設定 ​

專案設定可讓你設定預設值,並將專案特定情境注入到所有產物中。

建立設定 ​

設定會在 openspec init 期間建立,或手動建立:

yaml
# openspec/config.yaml
schema: spec-driven

context: |
  技術堆疊:TypeScript、React、Node.js
  API 慣例:RESTful、JSON 回應
  測試:Vitest 用於單元測試,Playwright 用於端對端測試
  風格:ESLint 搭配 Prettier,嚴格的 TypeScript

rules:
  proposal:
    - 包含回滾方案
    - 識別受影響的團隊
  specs:
    - 對情境使用 Given/When/Then 格式
  design:
    - 為複雜流程包含時序圖

設定欄位 ​

欄位類型說明
schemastring新變更的預設 schema(例如 spec-driven)
contextstring注入所有產物指示的專案情境
rulesobject每個產物的規則,以 artifact ID 為鍵

運作方式 ​

Schema 優先順序(從最高到最低):

  1. CLI 旗標(--schema <name>)
  2. 變更中繼資料(變更目錄中的 .openspec.yaml)
  3. 專案設定(openspec/config.yaml)
  4. 預設(spec-driven)

情境注入:

  • 情境會被前置到每個產物的指示中
  • 包裹在 <context>...</context> 標籤中
  • 幫助 AI 理解你專案的慣例

規則注入:

  • 規則只會注入到相符的產物中
  • 包裹在 <rules>...</rules> 標籤中
  • 出現在情境之後、範本之前

依 Schema 的產物 ID ​

spec-driven(預設):

  • proposal — 變更提案
  • specs — 規格
  • design — 技術設計
  • tasks — 實作任務

設定驗證 ​

  • rules 中的未知產物 ID 會產生警告
  • Schema 名稱會針對可用的 schema 進行驗證
  • 情境有 50KB 的大小限制
  • 無效的 YAML 會回報行號

疑難排解 ​

「rules 中的未知產物 ID:X」

  • 檢查產物 ID 是否符合你的 schema(參見上方清單)
  • 執行 openspec schemas --json 以查看每個 schema 的產物 ID

設定未套用:

  • 確保檔案位於 openspec/config.yaml(而非 .yml)
  • 使用驗證器檢查 YAML 語法
  • 設定變更會立即生效(無需重新啟動)

情境過大:

  • 情境限制為 50KB
  • 改為摘要或連結到外部文件

指令 ​

指令功用
/opsx:propose一步建立變更並產生規劃產物(預設快速路徑)
/opsx:explore思考想法、調查問題、釐清需求
/opsx:new開始新的變更骨架(擴充工作流程)
/opsx:continue建立下一個產物(擴充工作流程)
/opsx:ff快速推進規劃產物(擴充工作流程)
/opsx:apply實作任務,視需要更新產物
/opsx:update修訂變更的規劃產物並保持一致性
/opsx:verify驗證實作是否符合產物(擴充工作流程)
/opsx:sync將 delta 規格合併到主要規格(可選)
/opsx:archive完成時封存
/opsx:bulk-archive封存多個已完成的變更(擴充工作流程)
/opsx:onboard引導式的端到端變更教學(擴充工作流程)

使用方式 ​

探索想法 ​

/opsx:explore

思考想法、調查問題、比較選項。不需要結構 - 就像一位思考夥伴。當見解成形時,轉換到 /opsx:propose(預設)或 /opsx:new//opsx:ff(擴充)。

開始新的變更 ​

/opsx:propose

建立變更並產生實作前所需的規劃產物。

如果你已啟用擴充工作流程,你可以改用:

text
/opsx:new        # 僅建立骨架
/opsx:continue   # 一次建立一個產物
/opsx:ff         # 一次建立所有規劃產物

建立產物 ​

/opsx:continue

根據依賴關係顯示可建立的內容,然後建立一個產物。重複使用以逐步建立你的變更。

/opsx:ff add-dark-mode

一次建立所有規劃產物。當你對要建立的東西有清楚構想時使用。

實作(彈性部分) ​

/opsx:apply

逐步執行任務,並在進行時勾選完成。如果你同時處理多個變更,可以執行 /opsx:apply <name>;否則它會從對話中推斷,如果無法判斷則提示你選擇。

更新變更 ​

/opsx:update add-dark-mode - 我們現在將主題儲存在 cookie 中

修訂變更既有的規劃產物並保持一致性 - 任何方向都可以(設計編輯可能會回饋到提案)。只處理規劃產物:它不編輯程式碼,也不會建立缺失的產物(那是 /opsx:continue 的工作)。每個編輯都會先跟你確認。如果變更已經實作,它會建議 /opsx:apply,讓程式碼跟上修訂後的計畫。如果你的修訂改變了變更的意圖,請改為重新開始 - 參見 何時更新 vs. 重新開始。

同步 delta 規格 ​

text
/opsx:sync

將目前變更的 delta 規格合併到你的主要 openspec/specs/ 中,而不進行封存 — 變更仍然保持啟用。它套用整個 delta:在 ## REMOVED 下的需求會從主要規格中刪除,重新命名的需求會就地重新標題,而 delta 未提及的內容則保持不變。同步是可選的 — 封存會提示你先同步(如果你尚未同步)。當你想在封存前更新主要規格、當平行的變更需要建立在此變更剛新增的規格之上、或當你想在封存前檢閱合併後的主要規格時,可以使用它。

完成收尾 ​

/opsx:archive   # 完成後移到封存(如有需要會提示同步規格)

何時更新 vs. 重新開始 ​

你總可以在實作前編輯你的提案或規格。但何時修改會變成「這是不同的工作」?

提案所捕捉的內容 ​

一個提案定義了三件事:

  1. 意圖 — 你正在解決什麼問題?
  2. 範圍 — 什麼是允許/不允許的?
  3. 方法 — 你將如何解決它?

問題是:哪些改變了,改變了多少?

在以下情況更新現有變更: ​

相同的意圖,精煉的執行

  • 你發現了你未考慮的邊界情況
  • 方法需要調整,但目標不變
  • 實作顯示設計略有偏差

範圍縮小

  • 你意識到完整範圍太大,想先發佈 MVP
  • 「加入深色模式」→「加入深色模式切換(系統偏好設定在 v2)」

學習驅動的修正

  • 程式碼庫的結構與你原本想的不同
  • 某個依賴未如預期運作
  • 「使用 CSS 變數」→「改用 Tailwind 的 dark: 前綴」

在以下情況開始新的變更: ​

意圖根本改變

  • 問題本身已經不同
  • 「加入深色模式」→「加入包含自訂顏色、字型、間距的全面主題系統」

範圍爆炸

  • 變更成長到本質上成為不同的工作
  • 原始提案在更新後會變得無法辨識
  • 「修正登入錯誤」→「重寫認證系統」

原始的可以完成

  • 原始的變更可以標記為「完成」
  • 新工作是獨立的,不是修改
  • 完成「加入深色模式 MVP」→ 封存 → 新變更「增強深色模式」

啟發式判斷 ​

                        ┌─────────────────────────────────────┐
                        │     這是相同的工作嗎?               │
                        └──────────────┬──────────────────────┘
                                       │
                    ┌──────────────────┼──────────────────┐
                    │                  │                  │
                    ▼                  ▼                  ▼
             相同的意圖?       >50% 重疊?        原始工作能否在
             相同的問題?       相同的範圍?        不包含這些變更的
                    │                  │         情況下「完成」?
                    │                  │                  │
          ┌────────┴────────┐  ┌──────┴──────┐   ┌───────┴───────┐
          │                 │  │             │   │               │
         是                否  是           否  否              是
          │                 │  │             │   │               │
          ▼                 ▼  ▼             ▼   ▼               ▼
       更新              新的  更新          新的  更新            新的
測試更新新變更
身份「相同的事物,經精煉」「不同的工作」
範圍重疊>50% 重疊<50% 重疊
完成無法在不包含變更的情況下「完成」可以完成原始工作,新工作獨立存在
故事更新的鏈條講述連貫的故事修補會造成混淆,而非釐清

原則 ​

更新保留情境。新的變更提供清晰度。

當你的思考歷史有價值時,選擇更新。 當重新開始比修補更清楚時,選擇新的變更。

把它想像成 git 分支:

  • 在處理相同功能時持續提交
  • 當確實是新的工作時,建立新分支
  • 有時合併部分功能,並為第二階段重新開始

有何不同? ​

舊版 (/openspec:proposal)OPSX (/opsx:*)
結構單一大型提案文件具有依賴關係的獨立工件
工作流程線性階段:規劃 → 實作 → 封存靈活的動作 — 隨時執行任何操作
迭代回溯相當不便隨著學習進度更新工件
自訂能力固定結構基於架構(定義您自己的工件)

關鍵洞察: 工作並非線性。OPSX 不再假裝它是線性的。

架構深入解析 ​

本節說明 OPSX 的內部運作方式,以及它與傳統工作流程的比較。 本節的範例使用擴展命令集(new、continue 等);預設 core 使用者可將相同的流程對應到 propose → apply → sync → archive。

設計理念:階段 vs 動作 ​

┌─────────────────────────────────────────────────────────────────────────────┐
│                         傳統工作流程                                          │
│                    (階段鎖定、全有或全無)                                    │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ┌──────────────┐      ┌──────────────┐      ┌──────────────┐             │
│   │   規劃階段    │ ───► │   實作階段    │ ───► │   歸檔階段    │             │
│   │              │      │              │      │              │             │
│   └──────────────┘      └──────────────┘      └──────────────┘             │
│         │                     │                     │                       │
│         ▼                     ▼                     ▼                       │
│   /openspec:proposal   /openspec:apply      /openspec:archive              │
│                                                                             │
│   • 一次性建立所有產出物                                                    │
│   • 實作期間無法返回更新規格                                                │
│   • 階段閘門強制線性推進                                                    │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────────────────┐
│                            OPSX 工作流程                                      │
│                      (流暢動作、迭代式)                                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│              ┌────────────────────────────────────────────┐                 │
│              │           動作(非階段)                     │                 │
│              │                                            │                 │
│              │   new ◄──► continue ◄──► apply ◄──► archive │                 │
│              │    │          │           │           │    │                 │
│              │    └──────────┴───────────┴───────────┘    │                 │
│              │              任意順序                       │                 │
│              └────────────────────────────────────────────┘                 │
│                                                                             │
│   • 逐一建立產出物或快轉                                                    │
│   • 實作期間可更新規格/設計/任務                                            │
│   • 依賴關係推動進度,不存在階段概念                                         │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

元件架構 ​

傳統工作流程 使用 TypeScript 中的硬編碼範本:

┌─────────────────────────────────────────────────────────────────────────────┐
│                      傳統工作流程元件                                         │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   硬編碼範本(TypeScript 字串)                                              │
│                    │                                                        │
│                    ▼                                                        │
│   工具專屬的設定器/適配器                                                    │
│                    │                                                        │
│                    ▼                                                        │
│   產生的命令檔案(.claude/commands/openspec/*.md)                           │
│                                                                             │
│   • 固定結構,無產出物感知能力                                               │
│   • 修改需要改動程式碼並重新建置                                             │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

OPSX 使用外部模式定義和依賴圖引擎:

┌─────────────────────────────────────────────────────────────────────────────┐
│                         OPSX 元件                                            │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   模式定義(YAML)                                                           │
│   ┌─────────────────────────────────────────────────────────────────────┐   │
│   │  name: spec-driven                                                  │   │
│   │  artifacts:                                                         │   │
│   │    - id: proposal                                                   │   │
│   │      generates: proposal.md                                         │   │
│   │      requires: []              ◄── 依賴關係                         │   │
│   │    - id: specs                                                      │   │
│   │      generates: specs/**/*.md  ◄── Glob 模式                        │   │
│   │      requires: [proposal]      ◄── proposal 完成後啟用              │   │
│   └─────────────────────────────────────────────────────────────────────┘   │
│                    │                                                        │
│                    ▼                                                        │
│   產出物圖引擎                                                              │
│   ┌─────────────────────────────────────────────────────────────────────┐   │
│   │  • 拓撲排序(依賴順序)                                               │   │
│   │  • 狀態偵測(檔案系統存在性)                                         │   │
│   │  • 豐富指令產生(範本 + 上下文)                                      │   │
│   └─────────────────────────────────────────────────────────────────────┘   │
│                    │                                                        │
│                    ▼                                                        │
│   技能檔案(.claude/skills/openspec-*/SKILL.md)                             │
│                                                                             │
│   • 跨編輯器相容(Claude Code、Cursor、Devin)                               │
│   • 技能透過 CLI 查詢結構化資料                                              │
│   • 可透過模式檔案完全自訂                                                   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

依賴圖模型 ​

產出物形成有向無環圖(DAG)。依賴關係是啟用條件,而非閘門:

                              proposal
                             (根節點)
                                  │
                    ┌─────────────┴─────────────┐
                    │                           │
                    ▼                           ▼
                 specs                       design
              (requires:                  (requires:
               proposal)                   proposal)
                    │                           │
                    └─────────────┬─────────────┘
                                  │
                                  ▼
                               tasks
                           (requires:
                           specs, design)
                                  │
                                  ▼
                          ┌──────────────┐
                          │  實作階段     │
                          │ (requires:  │
                          │  tasks)     │
                          └──────────────┘

狀態轉換:

   BLOCKED ────────────────► READY ────────────────► DONE
      │                        │                       │
   缺少依賴                   所有依賴                 檔案存在於
   關係                       均為 DONE                檔案系統上

資訊流 ​

傳統工作流程 — 代理接收靜態指令:

  使用者:"/openspec:proposal"
           │
           ▼
  ┌─────────────────────────────────────────┐
  │  靜態指令:                               │
  │  • 建立 proposal.md                      │
  │  • 建立 tasks.md                         │
  │  • 建立 design.md                        │
  │  • 建立 delta 規格檔案                    │
  │                                         │
  │  無法感知已存在什麼或                     │
  │  產出物之間的依賴關係                     │
  └─────────────────────────────────────────┘
           │
           ▼
  代理一次性建立所有產出物

OPSX — 代理查詢豐富上下文:

  使用者:"/opsx:continue"
           │
           ▼
  ┌──────────────────────────────────────────────────────────────────────────┐
  │  步驟 1:查詢目前狀態                                                     │
  │  ┌────────────────────────────────────────────────────────────────────┐  │
  │  │  $ openspec status --change "add-auth" --json                      │  │
  │  │                                                                    │  │
  │  │  {                                                                 │  │
  │  │    "artifacts": [                                                  │  │
  │  │      {"id": "proposal", "status": "done"},                         │  │
  │  │      {"id": "specs", "status": "ready"},      ◄── 第一個就緒       │  │
  │  │      {"id": "design", "status": "ready"},                          │  │
  │  │      {"id": "tasks", "status": "blocked",                          │  │
  │  │       "missingDeps": ["specs", "design"]}                          │  │
  │  │    ]                                                               │  │
  │  │  }                                                                 │  │
  │  └────────────────────────────────────────────────────────────────────┘  │
  │                                                                          │
  │  步驟 2:取得就緒產出物的豐富指令                                         │
  │  ┌────────────────────────────────────────────────────────────────────┐  │
  │  │  $ openspec instructions specs --change "add-auth" --json          │  │
  │  │                                                                    │  │
  │  │  {                                                                 │  │
  │  │    "template": "# Specification\n\n## ADDED Requirements...",      │  │
  │  │    "dependencies": [{"id": "proposal", "path": "...", "done": true}│  │
  │  │    "unlocks": ["tasks"]                                            │  │
  │  │  }                                                                 │  │
  │  └────────────────────────────────────────────────────────────────────┘  │
  │                                                                          │
  │  步驟 3:讀取依賴 → 建立一個產出物 → 顯示解鎖了什麼                      │
  └──────────────────────────────────────────────────────────────────────────┘

迭代模型 ​

傳統工作流程 — 迭代困難:

  ┌─────────┐     ┌─────────┐     ┌─────────┐
  │/proposal│ ──► │ /apply  │ ──► │/archive │
  └─────────┘     └─────────┘     └─────────┘
       │               │
       │               ├── 「等等,設計有問題」
       │               │
       │               ├── 選項:
       │               │   • 手動編輯檔案(破壞上下文)
       │               │   • 放棄並重新開始
       │               │   • 硬撐過去,之後再修
       │               │
       │               └── 沒有正式的「返回」機制
       │
       └── 一次性建立所有產出物

OPSX — 自然迭代:

  /opsx:new ───► /opsx:continue ───► /opsx:apply ───► /opsx:archive
      │                │                  │
      │                │                  ├── 「設計有問題」
      │                │                  │
      │                │                  ▼
      │                │            直接編輯 design.md
      │                │            然後繼續!
      │                │                  │
      │                │                  ▼
      │                │         /opsx:apply 會從
      │                │         你停下的地方繼續
      │                │
      │                └── 建立一個產出物,顯示解鎖了什麼
      │
      └── 搭建變更骨架,等待方向指示

自訂模式 ​

使用模式管理命令建立自訂工作流程:

bash
# 從零開始建立新模式(互動式)
openspec schema init my-workflow

# 或分叉現有模式作為起點
openspec schema fork spec-driven my-workflow

# 驗證模式結構
openspec schema validate my-workflow

# 查看模式的解析來源(有助於除錯)
openspec schema which my-workflow

模式儲存在 openspec/schemas/(專案本地、版本控制)或 ~/.local/share/openspec/schemas/(使用者全域)。

模式結構:

openspec/schemas/research-first/
├── schema.yaml
└── templates/
    ├── research.md
    ├── proposal.md
    └── tasks.md

範例 schema.yaml:

yaml
name: research-first
artifacts:
  - id: research        # 在 proposal 之前新增
    generates: research.md
    requires: []

  - id: proposal
    generates: proposal.md
    requires: [research]  # 現在依賴 research

  - id: tasks
    generates: tasks.md
    requires: [proposal]

依賴圖:

   research ──► proposal ──► tasks

總結 ​

面向傳統OPSX
範本硬編碼 TypeScript外部 YAML + Markdown
依賴關係無(一次性建立)具拓撲排序的 DAG
狀態基於階段的心理模型檔案系統存在性
自訂編輯原始碼、重新建置建立 schema.yaml
迭代階段鎖定流暢,可編輯任何內容
編輯器支援工具專屬設定器/適配器單一技能目錄

Schema ​

Schema 定義了存在哪些工件及其依賴關係。目前可用:

  • spec-driven(預設):proposal → specs → design → tasks
bash
# 列出可用的 schema
openspec schemas

# 查看所有 schema 及其解析來源
openspec schema which --all

# 以互動方式建立新的 schema
openspec schema init my-workflow

# 複製現有 schema 以進行自訂
openspec schema fork spec-driven my-workflow

# 在使用前驗證 schema 結構
openspec schema validate my-workflow

提示 ​

  • 使用 /opsx:explore 在決定變更前先思考一個想法
  • 當你知道你想要什麼時使用 /opsx:ff,探索時使用 /opsx:continue
  • 在 /opsx:apply 期間,如果出現問題——修正工件,然後繼續
  • 任務透過 tasks.md 中的核取方塊追蹤進度
  • 隨時檢查狀態:openspec status --change "name"

意見回饋 ​

這還很粗糙。這是故意的——我們正在學習什麼有效。

發現錯誤?有想法?加入我們的 Discord 或在 GitHub 上開啟 issue。