基礎觀念
OpenSpec 核心觀念
深入了解 OpenSpec 的核心概念:Change、Capability、Scenario、Spec Delta 等關鍵名詞
核心名詞大解析
在開始使用 OpenSpec 與執行 opsx 指令之前,我們必須先理解它所定義的核心名詞。這些名詞構成了整個規格驅動開發的語彙。
1. 變更計畫 (Change)
變更計畫 (Change) 是 OpenSpec 中最基本的生命週期單元。每次當你想要在專案中「新增功能」、「修復錯誤 (Bug Fix)」或「重構程式碼」時,都應該建立一個獨立的變更計畫。
一個變更計畫在專案中的實體表現,是位於 openspec/changes/<change-id>/ 目錄下的一個子資料夾,其中 <change-id> 是該次變更的唯一代號(例如 add-openspec-tutorial-site)。在變更進行期間,所有與本次需求、設計和任務相關的檔案都會集中在此資料夾中:
proposal.md(提案):說明這次修改的緣由(Why)、改動內容(What Changes)、受影響的能力(Capabilities)與系統衝擊(Impact)。design.md(設計方案):選填,記錄實作的技術細節、架構設計或資料庫結構等。specs/(暫存規格):放置本次改動專屬的「規格增量」。tasks.md(任務清單):列出為了完成此變更而必須按順序實作的具體任務。
一次只專注於一個變更計畫,能幫助開發者(與 AI 助手)隔離無關的程式碼,確保每一次的提交 (Commit) 都是乾淨且具備原子性。
2. 能力 (Capability)
能力 (Capability) 描述的是系統所具備的某項軟體特性或功能區塊。它是對系統行為的高階抽象描述,而不是具體的程式碼類別。
在 OpenSpec 中,系統的「現況規格 (Specs)」會被拆分成多個 Capability,並在 openspec/specs/ 下以獨立的目錄或檔案進行管理。
例如,在本教學網站專案中,我們拆分了以下幾個能力:
site-foundation(網站基礎與外觀)content-collections(內容集合與格式)code-experience(程式碼閱讀體驗)static-search(Pagefind 靜態搜尋)
當你需要修改某個功能時,你必須明確指出你是在新增(Added)或修改(Modified)哪一個 Capability 的行為。這種結構化的方式能強迫我們將複雜的系統模組化,避免多個功能之間產生不必要的耦合。
3. 場景 (Scenario)
每個能力底下,都會包含數個具體且可測試的場景 (Scenario)。
場景使用類似 BDD (行為驅動開發) 的自然語言,定義了系統在特定操作下的預期行為。常用的格式為:
- GIVEN (在某種狀態下)
- WHEN (當某個操作觸發時)
- THEN (系統應該做出什麼反應)
有時候也可以簡化為 WHEN / THEN 的二元結構。例如在 site-foundation 能力下的「響應式行動裝置導覽」中,就定義了如下的 Scenario:
#### Scenario: Mobile menu toggle
- **WHEN** a visitor on a viewport narrower than 768px taps the hamburger button
- **THEN** the sidebar navigation SHALL appear as an overlay drawer
SHALL / SHOULD / MAY 需求關鍵字: 在 Scenario 的描述中,我們使用這些關鍵字來界定規格的強制性:
- SHALL (必須):最高強制性,若未通過則視為建置或驗收失敗。
- SHOULD (應當):建議事項,在可行範圍內應當達成。
- MAY (可以):選填或選擇性行為。
這些場景是 AI 進行實作和進行驗收測試的根本依據。AI 能精確地讀懂這些情境,並產生能百分之百符合 Scenario 描述的程式碼。
4. 規格增量 (Spec Delta)
在變更計畫進行的過程中,我們並不會直接去修改位於 openspec/specs/ 的主規格檔案,而是會在 openspec/changes/<change-id>/specs/ 下建立或修改檔案。這些存在於變更計畫內部的規格變動,就被稱為規格增量 (Spec Delta)。
當一個 Change 完成,並且通過驗收後,我們會執行歸檔。在此時,OpenSpec 工具會將變更計畫底下的「規格增量」與 openspec/specs/ 裡面的現況規格進行合併(將新增的場景加入、修改舊的場景)。
這種做法類似 Git 的分支 (Branch) 與合併 (Merge) 機制,確保了在多人協作時,主規格不會在實作尚未完成前就先被污染。
5. 任務清單 (Tasks)
任務清單 (Tasks) 存放在變更計畫目錄下的 tasks.md 檔案中,是由 AI 在提案階段自動規劃出來的具體實作步驟。
每個任務都是一個檢核點:
- [ ]代表未開始或進行中。- [x]代表已完成並已更新對應的代碼或規格。
在實作時,我們會遇到「🔴 人工檢查點」。這意味著這是一個關鍵的查核階段(例如專案初始化完成、基礎 layout 完成、或所有核心文章撰寫完成)。此時 AI 必須主動暫停,並通知人類開發者進行檢查,這能有效防止 AI 朝著錯誤的方向實作太深,節省修正成本。
核心名詞關係圖
這些核心概念在 OpenSpec 工作流中是如何相互搭配的呢?我們可以透過下圖來一窺究竟:
graph TD
subgraph Repo Root
config["openspec/config.yaml"]
subgraph Specs Dir [openspec/specs/]
capA["Capability A (site-foundation)"]
capB["Capability B (code-experience)"]
end
subgraph Changes Dir [openspec/changes/]
change["Change (add-openspec-tutorial-site)"]
prop["proposal.md (說明 Why & What)"]
tasks["tasks.md (實作步驟)"]
delta["specs/ (規格增量 Spec Delta)"]
end
end
change --> prop
change --> tasks
change --> delta
delta -.->|歸檔時合併| Specs Dir
capA -->|"包含多個"| scA["Scenarios (GIVEN/WHEN/THEN)"]
總結
- Change 是每一次改動的「生命週期」。
- Capability 是描述系統特性的「功能模組」。
- Scenario 是功能模組下具體可驗收的「使用者情境」。
- Spec Delta 是在 Change 中進行的「規格增減」。
- Tasks 是引導人類與 AI 逐步實作的「地圖」。
理解了這些核心觀念後,我們就可以更清楚地看到 OpenSpec 指令是如何在這些產物之間遊走。在下一章,我們將介紹 [安裝與初始化],說明如何在一個現有的專案中引入 OpenSpec。