@warnyin/agents 0.5.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +10 -10
- package/package.json +17 -9
- package/{.claude → src/.claude}/agents/warnyin-infra.md +1 -1
- package/{.claude → src/.claude}/agents/warnyin-qa.md +1 -1
- package/{.claude → src/.claude}/agents/warnyin-sa.md +1 -1
- package/{.claude → src/.claude}/agents/warnyin-security.md +1 -1
- package/{.claude → src/.claude}/agents/warnyin-tech-lead.md +1 -1
- package/{.claude → src/.claude}/commands/warnyin/build.md +9 -9
- package/{.claude → src/.claude}/commands/warnyin/design.md +4 -4
- package/{.claude → src/.claude}/commands/warnyin/discovery.md +3 -3
- package/{.claude → src/.claude}/commands/warnyin/explore.md +1 -1
- package/{.claude → src/.claude}/commands/warnyin/init.md +2 -2
- package/{.claude → src/.claude}/commands/warnyin/install-skill.md +2 -2
- package/{.claude → src/.claude}/commands/warnyin/next.md +3 -3
- package/{.claude → src/.claude}/commands/warnyin/ship.md +5 -5
- package/{.claude → src/.claude}/commands/warnyin/update-codemaps.md +1 -1
- package/{.claude → src/.claude}/commands/warnyin/verify.md +5 -5
- package/{warnyin → src/.warnyin}/installer/templates/CLAUDE.md +15 -15
- package/{warnyin → src/.warnyin}/template/docs/codemap/index.md +1 -1
- package/{warnyin → src/.warnyin}/template/docs/troubleshooting.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/build.md +2 -2
- package/{warnyin → src/.warnyin}/template/stages/[topic]/business.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/design.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/discovery.md +2 -2
- package/{warnyin → src/.warnyin}/template/stages/[topic]/proposal.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/research.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/ship.md +3 -3
- package/{warnyin → src/.warnyin}/template/stages/[topic]/tasks/[task-name]/issue.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/tasks/[task-name]/rule.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/tasks/[task-name]/spec.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/tasks/[task-name]/standard.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/tasks/[task-name]/task.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/test.md +1 -1
- package/{warnyin → src/.warnyin}/template/stages/[topic]/verify.md +2 -2
- package/{warnyin → src/.warnyin}/workflow/README.md +13 -13
- package/{warnyin → src/.warnyin}/workflow/explore.md +2 -2
- package/{warnyin → src/.warnyin}/workflow/init.md +11 -11
- package/{warnyin → src/.warnyin}/workflow/next.md +3 -3
- package/{warnyin → src/.warnyin}/workflow/roles/developer.md +1 -1
- package/{warnyin → src/.warnyin}/workflow/scripts/build-wave.mjs +10 -8
- package/{warnyin → src/.warnyin}/workflow/stages/build.md +10 -10
- package/{warnyin → src/.warnyin}/workflow/stages/design.md +17 -17
- package/{warnyin → src/.warnyin}/workflow/stages/discovery.md +7 -7
- package/{warnyin → src/.warnyin}/workflow/stages/ship.md +8 -8
- package/{warnyin → src/.warnyin}/workflow/stages/verify.md +5 -5
- package/{AGENTS.md → src/AGENTS.md} +15 -15
- package/{bin → src/bin}/cli.mjs +52 -19
- package/CLAUDE.md +0 -40
- package/warnyin/stages/achieved/.gitkeep +0 -0
- package/warnyin/stages/context.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/features/[feature-name]/business.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/features/[feature-name]/feature.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/infra.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/project.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/rule.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/techstack/[component]/about.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/techstack/[component]/rule.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/techstack/[component]/standard.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/techstack/[component]/structure.md +0 -0
- /package/{warnyin → src/.warnyin}/template/docs/techstack/[component]/test.md +0 -0
- /package/{warnyin → src/.warnyin}/template/stages/[topic]/troubleshooting.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/codemap.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/README.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/ba.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/infra.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/po.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/qa.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/sa.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/security.md +0 -0
- /package/{warnyin → src/.warnyin}/workflow/roles/tech-lead.md +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Stage: SHIP
|
|
2
2
|
|
|
3
3
|
> **Playbook กลาง — AI ทุกเจ้าทำตามไฟล์นี้ชุดเดียวกัน** (Claude Code / Codex / Antigravity / อื่นๆ)
|
|
4
|
-
> เป้าหมาย: **ส่งมอบ** — promote ความรู้ระดับ topic ขึ้นเอกสารกลางใน `docs/` + archive topic เข้า `
|
|
4
|
+
> เป้าหมาย: **ส่งมอบ** — promote ความรู้ระดับ topic ขึ้นเอกสารกลางใน `docs/` + archive topic เข้า `docs/stages/achieved/`
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
## 2. Input ที่ต้องอ่านก่อนเริ่ม
|
|
19
19
|
|
|
20
|
-
1. `
|
|
20
|
+
1. `docs/stages/<slug>/` **ทุกไฟล์** — discovery, business, proposal, design, build, test, verify, troubleshooting, tasks/*
|
|
21
21
|
→ เข้าใจว่า topic นี้ **ทำอะไร ทำอย่างไร** และเกิดความรู้อะไรใหม่บ้าง
|
|
22
22
|
2. `tasks/<task>/rule.md` section "เสนอเพิ่ม rule ใหม่ (รอ SHIP)" + `standard.md` — rule/standard ใหม่ที่ note ค้างไว้
|
|
23
23
|
3. เอกสารกลางปลายทางที่จะอัปเดต — `docs/features/`, `docs/techstack/<component>/*`, `docs/rule.md`,
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
|
|
31
31
|
1. **เข้าใจก่อน promote** — อ่าน topic ทั้งหมดให้เข้าใจว่าทำอะไร/ทำอย่างไร แล้วค่อยตัดสินใจว่าความรู้ชิ้นไหนควรขึ้นไฟล์กลางไหน
|
|
32
32
|
2. **ขอ user ยืนยัน "ครั้งเดียวก่อนลงมือ"** — สรุป promotion plan (feature ใหม่หรือปรับปรุง, ไฟล์กลางที่จะอัปเดต + สาระที่จะใส่, ชื่อโฟลเดอร์ archive) ให้ user อนุมัติ แล้วจึง execute ไม่ถามซ้ำระหว่างทาง
|
|
33
|
-
3. **★ Archive ก่อนอัปเดตเอกสาร** — ย้ายทั้งโฟลเดอร์ `
|
|
33
|
+
3. **★ Archive ก่อนอัปเดตเอกสาร** — ย้ายทั้งโฟลเดอร์ `docs/stages/<slug>/` → `docs/stages/achieved/<YYYY-MM-DD>-<slug>/` (วันที่ของวันที่ SHIP) **ก่อน** เริ่มแก้ `docs/` แล้วอ่านเนื้อหาจาก path ใหม่ระหว่าง promote
|
|
34
34
|
4. **กลั่น ไม่ใช่ copy ดิบ** — merge สาระเข้าโครงสร้างของไฟล์กลางเดิม ระวัง duplicate/ขัดแย้งกับเนื้อหาที่มีอยู่; เขียนแบบ "ความรู้ถาวร" ไม่ใช่บันทึกรายงาน
|
|
35
35
|
5. **เอกสารต้องตรงโค้ดจริง** — structure/codemap อัปเดตจากการดูโค้ดจริง ไม่ใช่จากความจำหรือ design เดิม
|
|
36
36
|
6. **อย่าเดา** — เนื้อหาที่ไม่แน่ใจว่าควร promote หรือควรวางไว้ไฟล์ไหน → ถามทีละข้อ + เสนอคำตอบที่แนะนำ
|
|
@@ -40,17 +40,17 @@
|
|
|
40
40
|
|
|
41
41
|
## 4. ลำดับขั้นการทำงาน (process)
|
|
42
42
|
|
|
43
|
-
1. **อ่านทำความเข้าใจ topic:** อ่าน `
|
|
43
|
+
1. **อ่านทำความเข้าใจ topic:** อ่าน `docs/stages/<slug>/` ทุกไฟล์ — topic นี้ทำอะไร ทำอย่างไร เกิดความรู้ใหม่อะไรบ้าง (เช็คก่อนว่า VERIFY ผ่าน Gate แล้ว — มี `verify.md` สรุปผลผ่าน)
|
|
44
44
|
2. **จำแนก feature:** สิ่งที่ทำเป็น **feature ใหม่** หรือ **ปรับปรุง feature เดิม** (เทียบกับ `docs/features/` ที่มีอยู่)
|
|
45
45
|
3. **สรุป promotion plan + ขออนุมัติ (ครั้งเดียว):** feature ใหม่/ปรับปรุง, รายการไฟล์กลางที่จะอัปเดต + สาระ, ชื่อโฟลเดอร์ archive → รอ user ไฟเขียว
|
|
46
|
-
4. **★ Archive:** ย้ายทั้งโฟลเดอร์ → `
|
|
46
|
+
4. **★ Archive:** ย้ายทั้งโฟลเดอร์ → `docs/stages/achieved/<YYYY-MM-DD>-<slug>/` (ใช้ `git mv` ถ้าเป็น git repo)
|
|
47
47
|
5. **อัปเดตเอกสารกลาง** (อ่านเนื้อหาจาก path ใน achieved):
|
|
48
48
|
1. **`docs/features/<feature-name>/`** — feature ใหม่ → สร้างโฟลเดอร์ใหม่ (`feature.md` + `business.md`); ปรับปรุง feature เดิม → อัปเดตโฟลเดอร์เดิม โดยใช้เนื้อหาจาก `business.md` / `proposal.md` / `design.md` ของ topic
|
|
49
49
|
2. **`docs/techstack/<component>/`** — `rule.md` / `standard.md` (จาก note "รอ SHIP" ใน tasks), `structure.md` (โครงสร้างที่เปลี่ยน), `test.md` (merge แผนเทสจาก `test.md` ของ topic)
|
|
50
50
|
3. **`docs/rule.md`** — global rule ใหม่/ที่เปลี่ยน (เฉพาะข้อที่เป็นกฎระดับโปรเจกต์ ไม่ผูกกับ component เดียว)
|
|
51
51
|
4. **`docs/troubleshooting.md`** — merge entry จาก `troubleshooting.md` ของ topic (ปัญหา/อาการ/root cause/วิธีแก้/ป้องกันซ้ำ)
|
|
52
52
|
5. **`docs/infra.md` + `docs/project.md`** — เฉพาะถ้ามีข้อมูลที่เกี่ยวข้อง (env/service ใหม่, scope/เป้าหมายโปรเจกต์ที่ขยับ)
|
|
53
|
-
6. **`docs/codemap/` ทั้งหมด** — อัปเดต code map ให้ตรงกับโค้ดจริงปัจจุบัน ทำตาม playbook
|
|
53
|
+
6. **`docs/codemap/` ทั้งหมด** — อัปเดต code map ให้ตรงกับโค้ดจริงปัจจุบัน ทำตาม playbook `.warnyin/workflow/codemap.md` (Claude Code: `/warnyin:update-codemaps`)
|
|
54
54
|
6. **เขียนสรุปส่งมอบ:** `achieved/<YYYY-MM-DD>-<slug>/ship.md` — feature ใหม่/ปรับปรุง, เอกสารกลางที่อัปเดต (ไฟล์ → สาระ), note ที่ตัดทิ้งพร้อมเหตุผล
|
|
55
55
|
7. **ปิดงาน:** รายงาน user ว่าส่งมอบครบ — topic ปิดสมบูรณ์
|
|
56
56
|
|
|
@@ -66,13 +66,13 @@
|
|
|
66
66
|
| `docs/troubleshooting.md` | KB ปัญหา-วิธีแก้ที่ merge เข้า |
|
|
67
67
|
| `docs/infra.md`, `docs/project.md` | อัปเดตเฉพาะถ้ามีข้อมูลเกี่ยวข้อง |
|
|
68
68
|
| `docs/codemap/` | code map ตรงกับโค้ดจริงปัจจุบัน |
|
|
69
|
-
| `
|
|
69
|
+
| `docs/stages/achieved/<YYYY-MM-DD>-<slug>/` | ทั้ง topic ที่ archive แล้ว + `ship.md` (สรุปการส่งมอบ) |
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
73
73
|
## 6. Gate → topic ปิดสมบูรณ์เมื่อ
|
|
74
74
|
|
|
75
|
-
- [ ] topic ถูกย้ายไป `
|
|
75
|
+
- [ ] topic ถูกย้ายไป `docs/stages/achieved/<YYYY-MM-DD>-<slug>/` แล้ว (ไม่เหลือใน `docs/stages/`)
|
|
76
76
|
- [ ] `docs/features/` สะท้อน feature ใหม่/ที่ปรับปรุงแล้ว
|
|
77
77
|
- [ ] note "รอ SHIP" ทุกข้อใน `tasks/*/rule.md` + `standard.md` ถูกพิจารณาครบ — promote หรือตัดทิ้งพร้อมเหตุผล
|
|
78
78
|
- [ ] `docs/troubleshooting.md` รวม entry จาก topic แล้ว
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
## 2. ก่อนเทส — อ่านให้เข้าใจก่อนเสมอ
|
|
16
16
|
|
|
17
|
-
1. **spec + tasks ทั้งหมด** — `
|
|
17
|
+
1. **spec + tasks ทั้งหมด** — `docs/stages/<slug>/tasks/*/spec.md` + `task.md`, `design.md`, `proposal.md`
|
|
18
18
|
→ เข้าใจ **จุดประสงค์ของ topic** และสิ่งที่ต้องยืนยัน (อย่าเทสผ่านๆ โดยไม่เข้าใจ)
|
|
19
19
|
2. **`docs/techstack/<component>/test.md`** — guideline ว่าเทสยังไง (เช่น frontend: e2e smoke ผ่าน **playwright-cli**)
|
|
20
20
|
→ ถ้า **ไม่มี** guideline → แนะนำว่าควรเทสแบบไหน/วิธีใดได้บ้าง แล้วเขียนแผนลง `test.md`
|
|
@@ -30,16 +30,16 @@
|
|
|
30
30
|
3. **ใช้ guideline จาก `test.md`** ของ techstack; ถ้าไม่มีให้เสนอวิธีเทสที่เหมาะแล้วเขียนแผนเอง
|
|
31
31
|
4. **Frontend → verify UX/UI ด้วย** (ไม่ใช่แค่ functional — ดู layout, state, flow, ความถูกต้องของหน้าจอ)
|
|
32
32
|
5. **ข้อไหน verify ไม่ผ่าน → แก้จนผ่าน (loop)** และ **นับจำนวนการแก้ไข/จำนวนรอบ**
|
|
33
|
-
6. **ปัญหายาก/ซ้ำในขั้นนี้ → บันทึก `
|
|
33
|
+
6. **ปัญหายาก/ซ้ำในขั้นนี้ → บันทึก `docs/stages/<slug>/troubleshooting.md`** (เหมือน BUILD); เจอปัญหา → อ่าน `docs/troubleshooting.md` ก่อน
|
|
34
34
|
7. **นาน/หลายรอบเกินไป → พิจารณาถาม user ทีละข้อ + เสนอคำตอบที่แนะนำ** (อย่าวนแก้เงียบๆ ไม่จบ)
|
|
35
35
|
8. **ห้ามแตะไฟล์กลางใน `docs/`** — แผนเทสเขียนระดับ topic ที่ `test.md` ก่อน รอ SHIP merge เข้า `docs/techstack/<component>/test.md`
|
|
36
|
-
9. **สวม role QA** — ทำตาม role card
|
|
36
|
+
9. **สวม role QA** — ทำตาม role card `.warnyin/workflow/roles/qa.md` (lens: คิดแบบผู้ใช้จริง + คนหาเรื่อง, edge case, regression; checklist ครบทุกข้อ)
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
40
|
## 4. ลำดับขั้นการทำงาน (process)
|
|
41
41
|
|
|
42
|
-
0. **★ เช็ค context window ก่อนเริ่ม:** ประเมินว่า context ของ session ปัจจุบันถูกใช้ไปมากน้อยแค่ไหน — ถ้าใช้ไปเยอะหรือ **เกินครึ่ง** → **เสนอ user ให้ `/compact` หรือ `/clear` ก่อนเสมอ** แล้วค่อยเริ่ม VERIFY ใน context ที่โล่ง (สถานะงานอยู่ในไฟล์ `
|
|
42
|
+
0. **★ เช็ค context window ก่อนเริ่ม:** ประเมินว่า context ของ session ปัจจุบันถูกใช้ไปมากน้อยแค่ไหน — ถ้าใช้ไปเยอะหรือ **เกินครึ่ง** → **เสนอ user ให้ `/compact` หรือ `/clear` ก่อนเสมอ** แล้วค่อยเริ่ม VERIFY ใน context ที่โล่ง (สถานะงานอยู่ในไฟล์ `docs/stages/<slug>/` ครบ ไม่หายไปกับ context) — VERIFY เป็นลูปเทส-แก้ที่อาจยาว ต้องมี context เหลือมากพอ; เครื่องอื่นที่ไม่มีคำสั่งนี้ → แนะนำเริ่ม session ใหม่
|
|
43
43
|
1. **เข้าใจจุดประสงค์:** อ่าน spec/tasks/design → สรุปสิ่งที่ต้อง verify (functional + UX/UI)
|
|
44
44
|
2. **วางแผนเทส → เขียน `test.md`:** ตาม guideline `docs/techstack/<component>/test.md`; ไม่มีก็เสนอวิธี (e2e smoke / integration / manual ฯลฯ) แล้วเขียนแผน
|
|
45
45
|
3. **เตรียม local env:** รัน service ที่เกี่ยวข้องตาม `infra.md`
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
53
|
-
## 5. Output (สร้างที่ `
|
|
53
|
+
## 5. Output (สร้างที่ `docs/stages/<slug>/`)
|
|
54
54
|
|
|
55
55
|
| ไฟล์ | เนื้อหา | ปลายทางตอน SHIP |
|
|
56
56
|
|---|---|---|
|
|
@@ -12,37 +12,37 @@ Discovery (optional) ──▶ DESIGN ──▶ BUILD ──▶ VERIFY ──▶
|
|
|
12
12
|
|
|
13
13
|
## กฎสำคัญ: ทำตาม playbook กลางเสมอ
|
|
14
14
|
|
|
15
|
-
แก่นของแต่ละ stage คือ **single source of truth** อยู่ที่
|
|
15
|
+
แก่นของแต่ละ stage คือ **single source of truth** อยู่ที่ `.warnyin/workflow/stages/`
|
|
16
16
|
ก่อนทำงานใน stage ใด ให้เปิดอ่านไฟล์ playbook ของ stage นั้นแล้วทำตามอย่างเคร่งครัด
|
|
17
17
|
|
|
18
18
|
| Stage | playbook | สถานะ |
|
|
19
19
|
|---|---|---|
|
|
20
|
-
| Discovery |
|
|
21
|
-
| DESIGN |
|
|
22
|
-
| BUILD |
|
|
23
|
-
| VERIFY |
|
|
24
|
-
| SHIP |
|
|
20
|
+
| Discovery | `.warnyin/workflow/stages/discovery.md` | ✅ พร้อมใช้ |
|
|
21
|
+
| DESIGN | `.warnyin/workflow/stages/design.md` | ✅ พร้อมใช้ |
|
|
22
|
+
| BUILD | `.warnyin/workflow/stages/build.md` | ✅ พร้อมใช้ |
|
|
23
|
+
| VERIFY | `.warnyin/workflow/stages/verify.md` | ✅ พร้อมใช้ |
|
|
24
|
+
| SHIP | `.warnyin/workflow/stages/ship.md` | ✅ พร้อมใช้ |
|
|
25
25
|
|
|
26
26
|
## วิธีเริ่ม
|
|
27
27
|
|
|
28
|
-
0. ครั้งแรกในโปรเจกต์ (docs/ ยังว่าง) → ทำตาม
|
|
29
|
-
1. อ่าน
|
|
30
|
-
2. งานใหม่ → copy
|
|
28
|
+
0. ครั้งแรกในโปรเจกต์ (docs/ ยังว่าง) → ทำตาม `.warnyin/workflow/init.md` เพื่อวิเคราะห์โปรเจกต์ + เติม `docs/` ก่อน
|
|
29
|
+
1. อ่าน `.warnyin/workflow/README.md` เพื่อเข้าใจภาพรวมและโครงสร้าง
|
|
30
|
+
2. งานใหม่ → copy `.warnyin/template/stages/[topic]/` เป็น `docs/stages/<slug>/`
|
|
31
31
|
3. รัน stage ตามลำดับ โดยทำตาม playbook ของแต่ละ stage
|
|
32
|
-
4. output ของงานเก็บใน `
|
|
32
|
+
4. output ของงานเก็บใน `docs/stages/<slug>/`, ความรู้ถาวรระดับโปรเจกต์อยู่ใน `docs/`
|
|
33
33
|
|
|
34
34
|
## สำรวจโดยไม่สร้าง artifact (EXPLORE)
|
|
35
35
|
|
|
36
|
-
อยากถาม/สำรวจข้อมูลเฉยๆ โดยไม่เปิด topic → ทำตาม
|
|
36
|
+
อยากถาม/สำรวจข้อมูลเฉยๆ โดยไม่เปิด topic → ทำตาม `.warnyin/workflow/explore.md`
|
|
37
37
|
(read-only เด็ดขาด — ไม่สร้าง/แก้ไฟล์ใดๆ จบที่คำตอบในแชท)
|
|
38
38
|
|
|
39
39
|
## เช็คงานค้าง / หาขั้นตอนถัดไป (NEXT)
|
|
40
40
|
|
|
41
|
-
อยากรู้ว่ามีงานอะไรค้างและควรไปต่อยังไง → ทำตาม
|
|
42
|
-
(สแกน `
|
|
41
|
+
อยากรู้ว่ามีงานอะไรค้างและควรไปต่อยังไง → ทำตาม `.warnyin/workflow/next.md`
|
|
42
|
+
(สแกน `docs/stages/*` ระบุ stage ปัจจุบันจาก artifact จริง + gate ที่ขาด — read-only ไม่แก้ไฟล์)
|
|
43
43
|
|
|
44
44
|
## รัน Discovery
|
|
45
45
|
|
|
46
|
-
ทำตาม
|
|
46
|
+
ทำตาม `.warnyin/workflow/stages/discovery.md` — เริ่มอ่าน `docs/project.md`, ตี scope กว้าง→แคบ,
|
|
47
47
|
ถามทีละข้อพร้อมเสนอคำตอบที่แนะนำ, คำถามที่ตอบได้ด้วยโค้ดให้ไปอ่านโค้ดเอง,
|
|
48
|
-
เขียน output ลง `
|
|
48
|
+
เขียน output ลง `docs/stages/<slug>/discovery.md` และ `research.md`
|
package/{bin → src/bin}/cli.mjs
RENAMED
|
@@ -24,41 +24,57 @@ if (args.has('--help') || args.has('-h')) {
|
|
|
24
24
|
ใช้งาน:
|
|
25
25
|
npx @warnyin/agents ติดตั้ง (ข้ามไฟล์ที่มีอยู่แล้ว ไม่เขียนทับ)
|
|
26
26
|
npx @warnyin/agents --update อัปเดต playbook กลางเป็นเวอร์ชันล่าสุด
|
|
27
|
-
(เขียนทับเฉพาะ warnyin/workflow/, .claude/commands/warnyin/,
|
|
28
|
-
template warnyin/template/stages/[topic] — ไม่แตะ docs/ และงานจริง)
|
|
27
|
+
(เขียนทับเฉพาะ .warnyin/workflow/, .claude/commands/warnyin/,
|
|
28
|
+
template .warnyin/template/stages/[topic] — ไม่แตะ docs/ และงานจริง)
|
|
29
29
|
npx @warnyin/agents --dry-run แสดงรายการไฟล์ที่จะสร้าง/อัปเดต โดยไม่เขียนจริง
|
|
30
30
|
|
|
31
31
|
หลังติดตั้ง: เปิด Claude Code ในโปรเจกต์ แล้วรัน /warnyin:init ให้ agent วิเคราะห์โปรเจกต์ + เติม docs/`)
|
|
32
32
|
process.exit(0)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
// guard กัน self-install — เก็บไว้แบบ defensive (zero-cost)
|
|
36
|
+
// หลังย้าย source เข้า src/ → pkgRoot = src/ (sibling ของ bin/) จึงแทบไม่มีทาง === target (repo root / temp sandbox)
|
|
37
|
+
// → guard นี้เป็น no-op โดยตั้งใจในเคสปกติ/sandbox; ยังคงดักได้เฉพาะ edge case ที่ install ลงโฟลเดอร์ที่เป็น src/ เอง
|
|
35
38
|
if (path.resolve(pkgRoot) === path.resolve(target)) {
|
|
36
39
|
console.error('✖ กำลังรันอยู่ใน repo ของ warnyin-agents เอง — ให้ cd ไปที่โปรเจกต์ปลายทางก่อน')
|
|
37
40
|
process.exit(1)
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
// โครงเก่า (≤0.2.x): workflow/ + warnyin-stages/ ที่ root — เตือนให้ย้ายเอง ไม่แตะงานจริงของ user
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
43
|
-
console.warn(`⚠ พบโครงเลย์เอาต์เก่า (≤0.2.x): ${
|
|
44
|
-
|
|
45
|
-
1. git mv warnyin-stages
|
|
46
|
-
2. git rm -r workflow # playbook เก่า (เวอร์ชันใหม่จะอยู่ที่ warnyin/workflow)
|
|
47
|
-
3. ลบ template เก่าถ้ามี: "warnyin/stages/[topic]", "docs/techstack/[component]", "docs/features/[feature-name]"
|
|
48
|
-
(ย้ายไปรวมที่ warnyin/template/ แล้ว)
|
|
44
|
+
const legacyV2 = ['workflow', 'warnyin-stages'].filter((d) => fs.existsSync(path.join(target, d)))
|
|
45
|
+
if (legacyV2.length) {
|
|
46
|
+
console.warn(`⚠ พบโครงเลย์เอาต์เก่า (≤0.2.x): ${legacyV2.join(', ')}
|
|
47
|
+
เวอร์ชันนี้ย้าย core ไปใต้ .warnyin/ และงานจริงไป docs/stages/ — แนะนำย้ายด้วยตัวเองก่อน:
|
|
48
|
+
1. git mv warnyin-stages docs/stages # งานจริงของคุณ (ปลอดภัย ไม่ถูกแตะโดย installer)
|
|
49
|
+
2. git rm -r workflow # playbook เก่า (เวอร์ชันใหม่จะอยู่ที่ .warnyin/workflow)
|
|
49
50
|
แล้วรันคำสั่งนี้อีกครั้ง\n`)
|
|
50
51
|
}
|
|
51
52
|
|
|
53
|
+
// โครงเก่า (0.3–0.5.x): ทุกอย่างอยู่ใต้ warnyin/ ที่ root — เวอร์ชันนี้แยกเป็น .warnyin/ (core) + docs/stages (งานจริง)
|
|
54
|
+
const legacyV5 = ['workflow', 'template', 'installer', 'stages'].filter((d) =>
|
|
55
|
+
fs.existsSync(path.join(target, 'warnyin', d)),
|
|
56
|
+
)
|
|
57
|
+
if (legacyV5.length) {
|
|
58
|
+
console.warn(`⚠ พบโครงเลย์เอาต์เก่า (0.3–0.5.x): warnyin/{${legacyV5.join(', ')}}
|
|
59
|
+
เวอร์ชันนี้ย้าย core ไป .warnyin/ และงานจริงไป docs/stages/ — แนะนำย้ายด้วยตัวเองก่อน:
|
|
60
|
+
1. git mv warnyin/stages docs/stages # งานจริงของคุณ (active + achieved) — ปลอดภัย ไม่ถูกแตะ
|
|
61
|
+
2. git rm -r warnyin/workflow warnyin/template # core เก่า (เวอร์ชันใหม่ installer จะวางที่ .warnyin/)
|
|
62
|
+
แล้วรันคำสั่งนี้อีกครั้ง — installer จะวาง .warnyin/ ชุดใหม่ให้\n`)
|
|
63
|
+
}
|
|
64
|
+
|
|
52
65
|
// core = playbook กลาง + command + agent + template — เขียนทับได้เมื่อ --update
|
|
53
66
|
const CORE = [
|
|
54
|
-
path.join('warnyin', 'workflow'),
|
|
55
|
-
path.join('warnyin', 'template'),
|
|
67
|
+
path.join('.warnyin', 'workflow'),
|
|
68
|
+
path.join('.warnyin', 'template'),
|
|
56
69
|
path.join('.claude', 'commands', 'warnyin'),
|
|
57
70
|
path.join('.claude', 'agents'),
|
|
58
71
|
]
|
|
59
|
-
// scaffold =
|
|
60
|
-
// (
|
|
61
|
-
const
|
|
72
|
+
// scaffold = พื้นที่ทำงานเปล่าของโปรเจกต์ — installer "สร้างเอง" ไม่ copy tree จาก package
|
|
73
|
+
// (สำคัญ: ถ้า copy docs/stages จาก pkgRoot งานจริงของ repo ต้นทางจะรั่วไป target ทุกครั้ง — ดู verify installer-test-ci)
|
|
74
|
+
const SCAFFOLD_FILES = [
|
|
75
|
+
path.join('docs', 'stages', 'context.md'), // บริบทงานที่จดไว้ (next/discovery/explore อ่าน "ถ้ามี")
|
|
76
|
+
path.join('docs', 'stages', 'achieved', '.gitkeep'), // ให้ git track โฟลเดอร์ archive เปล่า
|
|
77
|
+
]
|
|
62
78
|
|
|
63
79
|
const stats = { created: 0, updated: 0, skipped: 0 }
|
|
64
80
|
|
|
@@ -91,8 +107,25 @@ function copyTree(relDir, { overwrite }) {
|
|
|
91
107
|
}
|
|
92
108
|
}
|
|
93
109
|
|
|
94
|
-
/**
|
|
95
|
-
|
|
110
|
+
/** สร้างโครง scaffold เปล่าของ docs/stages เอง (ไม่ copy จาก package — กันงานจริงของ repo ต้นทางรั่วไป target) — ไม่ทับไฟล์ที่มีอยู่ */
|
|
111
|
+
function ensureScaffold() {
|
|
112
|
+
for (const rel of SCAFFOLD_FILES) {
|
|
113
|
+
const dest = path.join(target, rel)
|
|
114
|
+
if (fs.existsSync(dest)) {
|
|
115
|
+
stats.skipped++
|
|
116
|
+
continue
|
|
117
|
+
}
|
|
118
|
+
if (!DRY) {
|
|
119
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true })
|
|
120
|
+
fs.writeFileSync(dest, '')
|
|
121
|
+
}
|
|
122
|
+
stats.created++
|
|
123
|
+
console.log(` + ${rel}`)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** seed docs/ ของโปรเจกต์จาก .warnyin/template/docs — ข้ามโฟลเดอร์ template `[...]` (ไว้ให้ /warnyin:init copy เป็นชื่อจริง) และไม่ทับไฟล์ที่มีอยู่ */
|
|
128
|
+
const TEMPLATE_DOCS = path.join('.warnyin', 'template', 'docs')
|
|
96
129
|
function seedDocs(relDir = TEMPLATE_DOCS) {
|
|
97
130
|
const srcDir = path.join(pkgRoot, relDir)
|
|
98
131
|
if (!fs.existsSync(srcDir)) return
|
|
@@ -142,9 +175,9 @@ function installRootDoc(name, srcPath) {
|
|
|
142
175
|
console.log(`Warnyin Standard Workflow → ${target}${DRY ? ' (dry-run)' : ''}\n`)
|
|
143
176
|
|
|
144
177
|
for (const dir of CORE) copyTree(dir, { overwrite: UPDATE })
|
|
145
|
-
|
|
178
|
+
ensureScaffold()
|
|
146
179
|
seedDocs()
|
|
147
|
-
installRootDoc('CLAUDE.md', path.join(pkgRoot, 'warnyin', 'installer', 'templates', 'CLAUDE.md'))
|
|
180
|
+
installRootDoc('CLAUDE.md', path.join(pkgRoot, '.warnyin', 'installer', 'templates', 'CLAUDE.md'))
|
|
148
181
|
installRootDoc('AGENTS.md', path.join(pkgRoot, 'AGENTS.md'))
|
|
149
182
|
|
|
150
183
|
console.log(`\nสรุป: สร้างใหม่ ${stats.created} · อัปเดต ${stats.updated} · ข้าม (มีอยู่แล้ว) ${stats.skipped}`)
|
package/CLAUDE.md
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
repo มาตรฐานกลางของ **ways of work** สำหรับทุกโปรเจกต์ เดินงานผ่าน 5 stage:
|
|
4
|
-
`Discovery (optional) ▶ DESIGN ▶ BUILD ▶ VERIFY ▶ SHIP`
|
|
5
|
-
|
|
6
|
-
## กฎหลัก
|
|
7
|
-
- แก่นของแต่ละ stage เป็น single source of truth ที่ `warnyin/workflow/stages/` — **ทำตาม playbook นั้นเสมอ** ก่อนเริ่มงานใน stage
|
|
8
|
-
- อย่า duplicate logic ของ workflow ลงที่อื่น ถ้าต้องแก้พฤติกรรมให้แก้ที่ `warnyin/workflow/stages/`
|
|
9
|
-
- output ของงานจริงเก็บใน `warnyin/stages/<slug>/` (copy จาก template `warnyin/template/stages/[topic]/`)
|
|
10
|
-
- ความรู้ถาวรระดับโปรเจกต์อยู่ใน `docs/` — เริ่มอ่าน `docs/project.md` เสมอใน Discovery
|
|
11
|
-
- role card กลางอยู่ที่ `warnyin/workflow/roles/` (BA/PO/SA/Tech Lead/Developer/QA/Security/Infra) — stage ไหนใช้ role ไหนดูใน playbook; reviewer subagent ของ Claude Code อยู่ที่ `.claude/agents/warnyin-*`
|
|
12
|
-
|
|
13
|
-
## Slash commands (namespace `warnyin:`)
|
|
14
|
-
- `/warnyin:init` → วิเคราะห์โปรเจกต์ + เติม `docs/` ครั้งแรกหลังติดตั้ง (`.claude/commands/warnyin/init.md` → `warnyin/workflow/init.md`)
|
|
15
|
-
- `/warnyin:install-skill [role]` → ติดตั้ง skill เสริมประจำ role (รายการอยู่ที่ตารางใน `warnyin/workflow/roles/README.md`)
|
|
16
|
-
- `/warnyin:update-codemaps` → สแกนโครงสร้าง + สร้าง/อัปเดต codemap แบบ token-lean ใน `docs/codemap/` (`warnyin/workflow/codemap.md`)
|
|
17
|
-
- `/warnyin:explore [คำถาม]` → สำรวจ/ตอบคำถามแบบ read-only — ไม่สร้าง artifact ใดๆ จบที่คำตอบในแชท (`warnyin/workflow/explore.md`)
|
|
18
|
-
- `/warnyin:next [slug]` → เช็คงานค้างทุก topic + แนะนำ command ถัดไป แบบ read-only (`warnyin/workflow/next.md`)
|
|
19
|
-
- `/warnyin:discovery [topic]` → Discovery stage (`.claude/commands/warnyin/discovery.md` → `warnyin/workflow/stages/discovery.md`)
|
|
20
|
-
- `/warnyin:design [slug] [change]` → DESIGN stage (`.claude/commands/warnyin/design.md` → `warnyin/workflow/stages/design.md`)
|
|
21
|
-
- `/warnyin:build [slug]` → BUILD stage — fan-out sub-agent ตาม dependency (`warnyin/workflow/stages/build.md` + `warnyin/workflow/scripts/build-wave.mjs`)
|
|
22
|
-
- `/warnyin:verify [slug]` → VERIFY stage — strategy tester เทส local env + UXUI แก้จนผ่าน (`warnyin/workflow/stages/verify.md`)
|
|
23
|
-
- `/warnyin:ship [slug]` → SHIP stage — ส่งมอบ: promote ความรู้ขึ้น `docs/` + archive topic (`warnyin/workflow/stages/ship.md`)
|
|
24
|
-
|
|
25
|
-
## การติดตั้งไปโปรเจกต์อื่น (npx installer)
|
|
26
|
-
- `npx @warnyin/agents` (หรือสำรอง `npx github:warnyin/warnyin-agents`) → copy โครงทั้งหมดลงโปรเจกต์ปลายทาง (ข้ามไฟล์ที่มีอยู่, CLAUDE.md/AGENTS.md ที่มีอยู่จะต่อท้ายเป็น section)
|
|
27
|
-
- `--update` → เขียนทับเฉพาะ core (`warnyin/workflow/`, `.claude/commands/warnyin/`, template ใน `warnyin/template/`) ไม่แตะ `docs/`/งานจริง
|
|
28
|
-
- ตัว installer: `bin/cli.mjs` + template CLAUDE.md ของโปรเจกต์ปลายทางที่ `warnyin/installer/templates/CLAUDE.md` (แก้ commands list ที่ไหน ให้แก้ template นี้ด้วย; โฟลเดอร์นี้ไม่ถูก copy ไป target)
|
|
29
|
-
- หลังติดตั้ง → รัน `/warnyin:init` เพื่อเติม `docs/`
|
|
30
|
-
|
|
31
|
-
## รองรับหลาย AI
|
|
32
|
-
repo นี้ tool-agnostic: Claude Code อ่าน `.claude/` + ไฟล์นี้, ส่วน Codex/Antigravity อ่าน `AGENTS.md`
|
|
33
|
-
ทุกเครื่องชี้กลับมาที่ playbook กลางชุดเดียวกันใน `warnyin/workflow/stages/` — ดูภาพรวมที่ `warnyin/workflow/README.md`
|
|
34
|
-
|
|
35
|
-
## สถานะการสร้าง workflow (อัปเดต 2026-06-04)
|
|
36
|
-
ครบทั้ง 5 stage: Discovery ✅ · DESIGN ✅ · BUILD ✅ · VERIFY ✅ · SHIP ✅
|
|
37
|
-
(playbook + command + template + build-wave.mjs ครบทุก stage)
|
|
38
|
-
|
|
39
|
-
แพทเทิร์นการเติม/แก้ stage: playbook `warnyin/workflow/stages/<stage>.md` + command `.claude/commands/warnyin/<stage>.md` + อัปเดตตาราง stage ใน `AGENTS.md`/`CLAUDE.md`/`warnyin/workflow/README.md` + output template ใน `warnyin/template/stages/[topic]/`
|
|
40
|
-
**สำคัญ: การเปลี่ยนพฤติกรรม stage ใดๆ ให้ user เป็นคนอธิบาย/ยืนยันก่อน อย่าเดาเอง**
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|