การใช้ OpenSpec ในโปรเจกต์ที่มีอยู่แล้ว
คุณไม่จำเป็นต้องจัดทำเอกสารของโค้ดเบสทั้งหมดตั้งแต่ต้น คุณควรเขียน specs เฉพาะสำหรับส่วนที่คุณกำลังจะเปลี่ยนแปลงเท่านั้น นี่คือสิ่งสำคัญที่สุดที่ควรรู้เกี่ยวกับการนำ OpenSpec มาใช้ในโปรเจกต์ที่มีอยู่แล้ว และเป็นเหตุผลว่าทำไม่อาการออกแบบจึงเน้นไปที่ brownfield เป็นอันดับแรก
ความกังวลทั่วไปมักจะเป็นแบบนี้: "แอปของฉันมีอายุ 80,000 บรรทัด ฉันต้องเขียน specs สำหรับทั้งหมดก่อน OpenSpec ถึงจะใช้งานได้หรือไม่?" คำตอบคือ ไม่ คุณคงไม่ชอบสิ่งนั้น และเราก็เช่นกัน OpenSpec จะค่อย ๆ ขยาย specs ของคุณไปทีละการเปลี่ยนแปลง การเปลี่ยนแปลงครั้งแรกของคุณจะจัดทำเอกสารส่วนที่มันสัมผัส การเปลี่ยนแปลงถัดไปก็จะจัดทำเอกสารส่วนของมัน และเมื่อเวลาผ่านไป specs ของคุณก็จะถูกเติมเต็มโดยธรรมชาติรอบงานที่คุณทำจริง
คู่มือนี้แสดงวิธีการเริ่มต้นตั้งแต่ Day One โดยไม่ต้องพยายามแก้ไขทุกอย่างพร้อมกัน
เวอร์ชันสามสิบวินาที
bash
$ cd your-existing-project
$ openspec init # adds openspec/ and your AI tool's commandsจากนั้น ใน AI chat ของคุณ:
text
/opsx:explore # optional: have the AI read the area you'll touch
/opsx:propose <a real, small change you actually need>
/opsx:apply
/opsx:archivespecs ของคุณจะอธิบายถึงส่วนของระบบที่การเปลี่ยนแปลงนั้นสัมผัสอย่างชัดเจน และไม่มีอะไรมากกว่านั้น นั่นคือสิ่งที่ถูกต้อง คุณไม่ต้องกังวลเกี่ยวกับ 80,000 บรรทัดที่เหลืออีกต่อไป
ทำไม่อาการออกแบบแบบ delta-first จึงเป็นเคล็ดลับทั้งหมด
OpenSpec Changes ถูกเขียนขึ้นในรูปแบบของ deltas: ADDED, MODIFIED, REMOVED Delta อธิบายว่าอะไรกำลังเปลี่ยนแปลงเมื่อเทียบกับพฤติกรรมปัจจุบัน ไม่ใช่ระบบทั้งหมด
นี่คือสิ่งที่งาน brownfield ต้องการอย่างแท้จริง คุณไม่ได้สร้างสิ่งต่าง ๆ ขึ้นมาจากศูนย์บ่อยนัก คุณอาจกำลังเพิ่มฟิลด์ แก้ไขการเปลี่ยนเส้นทาง (redirect) หรือจำกัดเวลา (timeout) การใช้ delta ช่วยให้คุณระบุการเปลี่ยนแปลงนั้นได้อย่างแม่นยำโดยไม่ต้องเขียน specs ความยาว 40 หน้าของทุกสิ่งที่เกี่ยวข้องกับมันก่อน
ดังนั้นไดเรกทอรี openspec/specs/ ของคุณจึงไม่ได้เริ่มต้นด้วยข้อมูลที่เต็มและสมบูรณ์ แต่มันจะเกือบว่างเปล่าและค่อย ๆ สะสม การเปลี่ยนแปลงที่ถูกเก็บถาวน์ (archived) แต่ละครั้งจะรวม delta ของมันเข้าไว้ specs สำหรับ auth/ จะมีความละเอียดถี่ถ้วนก็ต่อเมื่อคุณทำการเปลี่ยนแปลง auth หลายครั้ง ซึ่งเป็นช่วงเวลาที่คุณต้องการให้มันละเอียดถี่ถ้วนพอดี
หากคุณต้องการทราบกลไกานี้เพิ่มเติม โปรดดู Concepts: Delta Specs
การเปลี่ยนแปลงแรกของคุณในโค้ดเบสจริง
เลือกสิ่งที่เล็กและเป็นจริง ไม่ใช่ของเล่น ไม่ใช่การเขียนใหม่ เป็นการเปลี่ยนแปลงที่คุณตั้งใจจะทำในสัปดาห์นี้อยู่แล้ว การเริ่มต้นด้วยการเปลี่ยนแปลงเล็ก ๆ จะสอนขั้นตอนการทำงานโดยมีความเสี่ยงต่ำ
Step 1: ให้ AI อ่านส่วนที่เกี่ยวข้อง นี่คือจุดที่ /opsx:explore มีประโยชน์อย่างมากเมื่อต้องเจอกับโค้ดเบสที่ไม่คุ้นเคยหรือมีขนาดใหญ่ ชี้มันไปที่ส่วนที่คุณกำลังจะสัมผัสและปล่อยให้มันทำแผนภาพว่าสิ่งต่าง ๆ ทำงานอย่างไรก่อนที่จะเสนออะไรใด ๆ
text
You: /opsx:explore
AI: What would you like to explore?
You: I need to add rate limiting to our public API, but I'm not sure
how requests currently flow through the middleware.
AI: Let me trace it... [reads the router, middleware stack, and config]
Requests hit Express, pass through auth middleware, then your
controllers. There's no rate-limiting layer today. The cleanest
insertion point is a middleware right after auth. Want me to scope it?สังเกตว่า AI เข้าใจโครงสร้างจริงของคุณแล้ว ดังนั้นข้อเสนอที่มันเขียนขึ้นจะเข้ากับโค้ดของคุณ ไม่ใช่เทมเพลตทั่วไป ในโค้ดเบสขนาดใหญ่ นิสัยเดียวนี้ช่วยลดความเจ็บปวดได้มากที่สุด ดู Explore First
Step 2: เสนอการเปลี่ยนแปลง ข้อเสนอและ delta spec ของมันจะบันทึกเฉพาะการเปลี่ยนแปลงนี้เท่านั้น
text
You: /opsx:propose add-api-rate-limitingStep 3: สร้างและเก็บถาวน์ (Archive) ด้วย /opsx:apply และ /opsx:archive เช่นเดียวกับการเปลี่ยนแปลงใด ๆ หลังจากการเก็บถาวน์ คุณจะมี specs จริงสำหรับพฤติกรรม rate-limiting ของคุณ ซึ่งเกิดขึ้นจากการเปลี่ยนแปลงที่คุณจำเป็นต้องทำอยู่แล้ว
ต้องการการแนะนำแบบมีไกด์นำทางหรือไม่? ใช้ onboard
หากคุณต้องการดูวงจรทั้งหมดที่เกิดขึ้นกับโค้ดของคุณเองพร้อมคำบรรยาย คำสั่ง /opsx:onboard ที่ขยายออกจะทำสิ่งนั้นอย่างแม่นยำ: มันจะสแกนโค้ดเบสของคุณเพื่อหาการปรับปรุงเล็ก ๆ ที่ปลอดภัย จากนั้นจะนำคุณผ่านขั้นตอนการเสนอ การสร้าง และการเก็บถาวน์ โดยอธิบายแต่ละขั้นตอน
เปิดใช้งานคำสั่งที่ขยายออกก่อน:
bash
$ openspec config profile # select the expanded workflows
$ openspec update # apply them to this projectจากนั้นใน chat:
text
/opsx:onboardนี่คือการแนะนำที่อ่อนโยนที่สุดสำหรับโปรเจกต์จริง และมันจะทิ้งให้คุณได้การเปลี่ยนแปลง (เล็ก ๆ) ที่แท้จริงซึ่งคุณสามารถเก็บไว้หรือทิ้งไป ดู Commands: /opsx:onboard
"แต่ฉันมีเอกสารข้อกำหนดอยู่แล้ว"
บางทีคุณอาจมี PRD, SRS, specs อย่างเป็นทางการ หรือแม้กระทั่งโมเดล TLA+ ดีมาก คุณไม่จำเป็นต้องนำเข้าทั้งหมด และก็ไม่ควรทิ้งมันไปเช่นกัน
ให้ถือว่าเอกสารที่มีอยู่คือ วัตถุดิบสำหรับการสำรวจ ไม่ใช่ specs ที่ต้องแปลง เมื่อคุณเริ่มการเปลี่ยนแปลง ให้วางหรือชี้ AI ไปที่ส่วนที่เกี่ยวข้อง และปล่อยให้มันสร้าง delta OpenSpec ที่มุ่งเน้นจากสิ่งนั้น Delta จะบันทึกพฤติกรรมที่คุณกำลังเปลี่ยนอยู่ในรูปแบบข้อกำหนดและสถานการณ์ที่สามารถทดสอบได้ของ OpenSpec เอกสารต้นฉบับของคุณจะยังคงอยู่เป็นพื้นหลัง
เหตุผลที่ตรงไปตรงมา: Specs ของ OpenSpec ถูกออกแบบให้ยึดตามพฤติกรรมก่อน (behavior-first) และจำกัดขอบเขตตามการเปลี่ยนแปลง PRD 40 หน้าคือ artifact ที่แตกต่างกันโดยมีหน้าที่ต่างออกไป การบังคับแปลงแบบเหวี่ยงแหครั้งเดียวมักจะสร้าง specs ขนาดใหญ่ที่ล้าสมัยและไม่มีใครเชื่อถือได้ การปล่อยให้ specs เติบโตขึ้นจากการเปลี่ยนแปลงจริง ๆ จะทำให้มันแม่นยำอยู่เสมอ
text
You: /opsx:explore
You: Here's the section of our PRD about checkout. I'm implementing the
"guest checkout" requirement next.
[paste the relevant requirement]
AI: [reads it, asks clarifying questions, then helps scope a change]
You: /opsx:propose add-guest-checkoutการจัดระเบียบ specs ในโค้ดเบสขนาดใหญ่
Specs จะถูกเก็บไว้ภายใต้ openspec/specs/ โดยแบ่งตาม โดเมน (domain) ซึ่งเป็นพื้นที่เชิงตรรกะที่ตรงกับวิธีที่ทีมของคุณคิดเกี่ยวกับระบบ คุณไม่จำเป็นต้องออกแบบ Taxonomy ทั้งหมดตั้งแต่ต้น สร้างโฟลเดอร์โดเมนเมื่อการเปลี่ยนแปลงแรกในพื้นที่นั้นต้องการมัน
วิธีการทั่วไปในการแบ่งโดเมน:
- ตามขอบเขตคุณสมบัติ (feature area):
auth/,payments/,search/ - ตามคอมโพเนนต์ (component):
api/,frontend/,workers/ - ตามบริบทที่มีขอบเขตจำกัด (bounded context):
ordering/,fulfillment/,inventory/
เลือกสิ่งที่ทำให้ผู้ที่เพิ่งเข้ามาใหม่พยักหน้า คุณสามารถปรับปรุงในภายหลัง ดู Concepts: Specs
Monorepos และงานที่ครอบคลุมหลาย Repositories
สำหรับ monorepo รูปแบบที่ง่ายที่สุดคือมีไดเรกทอรี openspec/ หนึ่งแห่งที่รากของ repo โดยมีโดเมนที่แมปกับ packages หรือ services ของคุณ สิ่งนี้ครอบคลุมทีมส่วนใหญ่แล้ว
หากงานของคุณครอบคลุม หลาย repositories อย่างแท้จริง (หรือหลายแพ็กเกจที่คุณถือว่าเป็นสิ่งที่แยกจากกัน) OpenSpec มีฟีเจอร์ stores แบบ beta: การวางแผนจะอยู่ใน repo ที่เป็นอิสระซึ่งโค้ด repo ใด ๆ ของคุณสามารถอ้างถึงได้ ดังนั้น แผนจึงไม่จำเป็นต้องอยู่ภายใน openspec/ ของ repo เดียว มันยังเป็นเวอร์ชันเบต้า ดังนั้นให้ปฏิบัติต่อคำสั่งและสถานะของมันว่ากำลังพัฒนาอยู่ เริ่มต้นด้วย Stores User Guide สำหรับแบบจำลองทางความคิดและเส้นทางที่มีประโยชน์ที่สุด
ข้อควรระวังที่ต้องซื่อสัตย์สักสองสามข้อ
- ต้านทานแรงกระตุ้นที่จะเติมเต็มทุกอย่าง (back-fill) การเขียน specs สำหรับโค้ดที่คุณไม่ได้เปลี่ยนแปลงนั้นรู้สึกว่ามีประสิทธิภาพแต่โดยปกติแล้วไม่ใช่เช่นนั้น Specs เหล่านั้นจะล้าสมัย เพราะไม่มีอะไรบังคับให้มันติดตามความเป็นจริง ให้การเปลี่ยนแปลงจริงขับเคลื่อน specs ของคุณ
- รักษาการเปลี่ยนแปลงในช่วงต้นให้เล็ก การเปลี่ยนแปลงสองสามครั้งแรกของคุณเป็นเรื่องของการเรียนรู้จังหวะงานมากพอ ๆ กับการส่งมอบ ขอบเขตที่กระชับทำให้วงจรเร็วและบทเรียนมีราคาถูก
- Commit
openspec/ไปยัง git Specs และ archive ของคุณควรอยู่ใน version control ควบคู่ไปกับโค้ดที่มันอธิบาย - ให้บริบทแก่ AI ในโค้ดเบสขนาดใหญ่ที่มีข้อตกลงที่เป็นมาตรฐาน ให้กรอก
context:ในopenspec/config.yamlเพื่อให้ทุกข้อเสนอเคารพต่อ stack และรูปแบบของคุณ ดู Customization
จะไปที่ไหนต่อไป
- Explore First - นิสัยสำคัญสำหรับการทำความเข้าใจโค้ดก่อนที่คุณจะเปลี่ยนแปลงมัน
- Getting Started - การเดินผ่านการเปลี่ยนแปลงครั้งแรกอย่างสมบูรณ์
- Editing & Iterating on a Change - การปรับเปลี่ยนขณะที่กำลังเรียนรู้
- Concepts: Delta Specs - ทำไมเดลต้าจึงทำให้งาน brownfield สะอาด
- Customization - สอน OpenSpec เกี่ยวกับข้อตกลงของโปรเจกต์คุณ