huddle60 0.0.0-stage → 0.1.1

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/README.md CHANGED
@@ -1,3 +1,232 @@
1
- # Temporary Holding Version
1
+ <h1 align="center">huddle60</h1>
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ <p align="center">
4
+ <b>The 60-second huddle between PO, DEV and AI.</b><br>
5
+ One sentence in. A hash-locked plan out. PRs that can’t drift.
6
+ </p>
7
+
8
+ <p align="center">
9
+ <img alt="status: alpha" src="https://img.shields.io/badge/status-alpha-orange">
10
+ <img alt="protocol: AI-DLC" src="https://img.shields.io/badge/protocol-AI--DLC-5eead4">
11
+ <img alt="infra: none" src="https://img.shields.io/badge/infra-none-7aa2f7">
12
+ <img alt="node 22" src="https://img.shields.io/badge/node-22-339933">
13
+ </p>
14
+
15
+ ```bash
16
+ npx huddle60 ui
17
+ ```
18
+
19
+ **PO gõ một câu → AI soạn Epic/Story/Task → PO bấm _approve_ → DEV bấm _ready_ → agent code đúng yêu cầu đã khóa
20
+ bằng hash → ai sửa yêu cầu sau khi chốt, PR tự đỏ.**
21
+
22
+ Bỏ buổi grooming 60 phút. Thay bằng một **huddle 60 giây**.
23
+
24
+ <p align="center">
25
+ <img src="docs/assets/huddle60-flow.svg" width="100%"
26
+ alt="PO gõ một câu, AI đề xuất cây Epic/Story/Task, PO xác nhận, DEV làm trong IDE theo baseline, PR được kiểm tra tự động, PO nghiệm thu">
27
+ </p>
28
+
29
+ ### 60 giây trông như thế nào
30
+
31
+ | Giây | Ai | Việc |
32
+ |---|---|---|
33
+ | 0–10 | **PO** | Gõ _“Lập trình login sử dụng Google OAuth”_ |
34
+ | 10–30 | **AI** | Soạn Epic → Story → Task, AC dạng Given/When/Then, câu hỏi chặn và giả định |
35
+ | 30–45 | **PO** | Trả lời một câu hỏi, bấm **create issues**, rồi **approve** Story |
36
+ | 45–60 | **DEV** | Chọn lane, bấm **ready**, bấm **context** → dán vào Copilot/Claude/Gemini trong IDE |
37
+
38
+ Từ đó trở đi, mọi PR đều phải khớp đúng phiên bản yêu cầu đã duyệt. Không còn _“AI code theo bản cũ”_.
39
+
40
+ ### Vì sao developer sẽ star
41
+
42
+ - **`package-lock.json` cho yêu cầu.** Mỗi Story được chốt thành baseline có SHA-256 (RFC 8785). Issue bị sửa →
43
+ hash lệch → check `huddle60/baseline` chuyển đỏ. Giống hệt lockfile, nhưng cho nghiệp vụ.
44
+ - **Zero infra.** Không server, không database, không SaaS. Một lệnh `npx` trên máy bạn + GitHub Actions.
45
+ - **Agent-native.** `huddle60 context --issue 15` xuất đúng baseline đã duyệt cho bất kỳ coding agent nào, kèm
46
+ khối dán vào PR.
47
+ - **AI đề xuất, người quyết định.** Gemini không có quyền GitHub. App không có quyền hơn bạn. Mọi quyết định
48
+ được Actions kiểm tra theo user ID và ghi vào branch bằng chứng.
49
+ - **GitHub là nguồn sự thật.** Tận dụng Issues, Projects, PR quen thuộc của repository.
50
+
51
+ ### Định vị: huddle60 & AI-DLC
52
+
53
+ **huddle60** là bộ công cụ và governance engine mã nguồn mở thực thi quy trình **AI-DLC (AI Development Life Cycle)** trực tiếp trên GitHub:
54
+ - **AI-DLC** là phương pháp luận và chuẩn quy trình: AI tham gia phát triển phần mềm trong phạm vi được giao, con người định hướng và phê duyệt, mọi bước đều có bằng chứng số (evidence hash-locked).
55
+ - **huddle60** là công cụ hiện thực hóa quy trình này một cách tự nhiên nhất vào GitHub:
56
+ - Lệnh tương tác: `/huddle60` (hỗ trợ tương thích ngược với `/ai-dlc`)
57
+ - Nhãn phân loại: `huddle60:*` (như `huddle60:request`, `huddle60:plan-draft`...)
58
+ - PR verification gate: status check `huddle60/baseline`
59
+ - Bằng chứng kiểm toán: nhánh `huddle60-evidence`
60
+ - Cấu hình chính sách: `.github/huddle60/policy.yml`
61
+
62
+ Đặc tả đầy đủ: [tài liệu kỹ thuật](docs/technical-implementation.md).
63
+
64
+ > Thấy hữu ích? Hãy **star** repo và thử trên một repo thử nghiệm. Dự án đang alpha và cần người chạy thật nhất.
65
+
66
+ ## Vì sao PO và DEV sẽ thích
67
+
68
+ | | Hôm nay | Với huddle60 |
69
+ |---|---|---|
70
+ | **PO** | Ngồi viết từng ticket, AC, chia việc | Gõ _“Lập trình login sử dụng Google OAuth”_ → AI soạn cả cây công việc kèm AC. PO chỉ trả lời câu hỏi và xác nhận |
71
+ | **PO** | Không chắc DEV/AI đang làm theo phiên bản yêu cầu nào | Mỗi PR gắn baseline có hash; sửa yêu cầu sau khi chốt thì PR **tự bị chặn** |
72
+ | **DEV** | Ticket mơ hồ, hỏi đi hỏi lại | Nhận Story có AC rõ ràng; câu hỏi chặn đã được PO trả lời **trước** khi Issue được tạo |
73
+ | **DEV** | Copy yêu cầu vào agent bằng tay, dễ sót | `huddle60 context --issue 15` đưa đúng baseline vào agent trong IDE của bạn |
74
+ | **Cả team** | Merge xong vẫn không rõ “xong chưa” | Done chỉ khi PO nghiệm thu đúng build trên `main`; mọi quyết định truy vết được |
75
+
76
+ ### PO thấy gì sau 30 giây?
77
+
78
+ Chạy `huddle60 ui`, gõ yêu cầu vào tab **new plan**, bấm **generate plan** (rút gọn):
79
+
80
+ > ## Kế hoạch đề xuất (revision 1)
81
+ > Đăng nhập bằng Google OAuth cho ứng dụng web.
82
+ >
83
+ > - **Epic** `epic-auth`: Xác thực người dùng bằng Google OAuth
84
+ > - **Story** `story-login`: Đăng nhập bằng tài khoản Google
85
+ > - AC-01: Given tài khoản Google hợp lệ When đăng nhập Then vào trang chính
86
+ > - AC-02: Given người dùng hủy cấp quyền When đăng nhập Then thấy thông báo lỗi phù hợp
87
+ > - **Task** `task-oauth-setup`: Cấu hình Google OAuth Client
88
+ > - **Task** `task-login-ui`: Giao diện đăng nhập _(blocked by task-oauth-setup)_
89
+ > - **Story** `story-logout`: Đăng xuất
90
+ >
91
+ > **Câu hỏi khác:** Có cần lưu session vào cookie không?
92
+
93
+ PO bấm **create 5 issues** → Issues được tạo, liên kết cha–con và nằm sẵn trên Project board. Chưa đồng ý → gõ một dòng
94
+ vào ô **refine**, AI soạn lại. Có câu hỏi chặn thì nút tạo bị khóa đến khi PO trả lời.
95
+
96
+ **Trạng thái: alpha, cần cộng đồng kiểm thử.** Logic được kiểm thử tự động bằng fake GitHub/Gemini (105 test),
97
+ nhưng **chưa được chạy đầu-cuối trên GitHub và Gemini thật**. Xem [Giới hạn đã biết](#giới-hạn-đã-biết).
98
+
99
+ ## Bắt đầu nhanh
100
+
101
+ ```bash
102
+ gh auth login # app dùng token GitHub của chính bạn
103
+ export GEMINI_API_KEY=... # chỉ PO cần (để soạn kế hoạch); macOS có thể lưu vào Keychain:
104
+ # security add-generic-password -s huddle60-gemini -a $USER -w
105
+ npx huddle60 ui --repo owner/name
106
+ ```
107
+
108
+ App mở trình duyệt tại `http://127.0.0.1:4317/#token=…`:
109
+
110
+ - **work items**: mọi Epic/Story/Task đang mở, trạng thái _chờ PO duyệt → chờ DEV ready → đang làm_, cảnh báo khi
111
+ Issue bị sửa sau quyết định. Nút **approve / ready (lane) / accept / context** hiện theo role của bạn trong policy.
112
+ - **new plan**: mô tả nhu cầu → cây công việc, câu hỏi chặn, giả định → refine → tạo Issues.
113
+ - **activity**: lệnh đã gửi và phản hồi của GitHub Actions.
114
+
115
+ Mỗi nút chỉ đăng một comment `/huddle60 …` **bằng tài khoản của bạn**; GitHub Actions kiểm tra role, hash, phụ thuộc rồi
116
+ ghi bằng chứng. App không có quyền gì hơn bạn và không tự quyết thay ai.
117
+
118
+ Bảo mật app: chỉ nghe `127.0.0.1`, token phiên ngẫu nhiên mỗi lần chạy, kiểm tra `Host`/`Origin` (chống DNS rebinding,
119
+ CSRF), CSP chặt, không dựng HTML từ dữ liệu.
120
+
121
+ ## Cách hoạt động
122
+
123
+ ```mermaid
124
+ flowchart LR
125
+ PO[PO] -->|huddle60 ui| L[Local app<br/>127.0.0.1]
126
+ DEV[DEV] -->|huddle60 ui / context| L
127
+ L <-->|structured JSON| G[Gemini API]
128
+ L -->|Issues + comment /huddle60<br/>bằng token của user| GH[GitHub Issues/Projects]
129
+ GH -->|issue_comment| A[GitHub Action<br/>baseline/approve/ready/accept]
130
+ A -->|evidence + phản hồi| GH
131
+ DEV --> PR[Pull Request]
132
+ A -->|status huddle60/baseline| PR
133
+ ```
134
+
135
+ | Thành phần | Chạy ở đâu | Làm gì |
136
+ |---|---|---|
137
+ | **Local app** (`src/app`, `ui/`) | Máy PO/DEV (`huddle60 ui`) | Soạn kế hoạch với Gemini, tạo cây Issues, nút approve/ready/accept, context cho IDE agent |
138
+ | **Workflow gates** (`src/workflow`) | GitHub Actions (`action.yml`) | Baseline có hash, quyết định PO/DEV, check `huddle60/baseline` cho PR, nghiệm thu build |
139
+ | **CLI** (`src/entry/cli.ts`) | Máy DEV | `context` cho IDE agent, `init`, kiểm tra policy, thử planner |
140
+ | **Lõi** (`src/core`) | Dùng chung | Hash canonical (RFC 8785), parser, schema kế hoạch, kiểm tra quyết định — không phụ thuộc mạng |
141
+
142
+ Nguyên tắc: **AI đề xuất, con người quyết định.** Gemini không có quyền gọi GitHub; mọi quyết định được GitHub Actions
143
+ kiểm tra theo GitHub user ID trong `.github/huddle60/policy.yml`. Thiết kế đầy đủ:
144
+ [tài liệu kỹ thuật](docs/technical-implementation.md).
145
+
146
+ ## Luồng sử dụng
147
+
148
+ 1. **PO** mở `huddle60 ui` → **new plan**, gõ: _“Xây dựng tính năng đăng nhập Google OAuth”_ → trả lời câu hỏi chặn → **create issues**.
149
+ 2. PO và DEV chỉnh nội dung Story trên GitHub nếu cần. Khi Story đã rõ: PO bấm **approve** (chốt đúng nội dung hiện tại).
150
+ 3. DEV chọn lane và bấm **ready**. Task kế thừa approve của Story cha.
151
+ 4. DEV bấm **context** (hoặc chạy CLI) để đưa baseline vào IDE agent, rồi mở PR kèm khối Huddle60 trong context:
152
+ ```bash
153
+ npx huddle60 context --issue 15
154
+ ```
155
+ 5. Sau khi merge và build trên `main` thành công, PO bấm **accept**, chọn build → Issue được đóng.
156
+
157
+ Không dùng app vẫn được: mọi nút tương ứng một lệnh comment bên dưới.
158
+
159
+ ### Các lệnh qua GitHub Comment (xử lý bởi GitHub Action)
160
+
161
+ | Lệnh | Vai trò | Tác dụng |
162
+ |---|---|---|
163
+ | `/huddle60 baseline` | PO, DEV | Chụp snapshot yêu cầu của Issue, tính hash SHA-256 |
164
+ | `/huddle60 approve baseline=<id> hash=<h>` | PO | Duyệt nghiệp vụ của Story (Task kế thừa duyệt của Story cha) |
165
+ | `/huddle60 ready baseline=<id> hash=<h> lane=<fast\|standard\|strict>` | DEV | Xác nhận sẵn sàng code, sinh khối trace cho PR |
166
+ | `/huddle60 accept baseline=<id> run=<run_id> commit=<sha>` | PO | Nghiệm thu Story/Epic trên build thành công của branch `main`, đóng Issue |
167
+ | `/huddle60 revoke decision=<id> reason="..."` | Tác giả hoặc cùng role | Thu hồi quyết định đã ban hành |
168
+
169
+ *Lưu ý: Lệnh phải nằm ở **dòng đầu tiên** của comment (tiền tố `/huddle60`). Mọi quyết định đều được kiểm tra tính hợp lệ và ghi vào nhánh bằng chứng `huddle60-evidence`.*
170
+
171
+ ## Phát triển
172
+
173
+ Yêu cầu: Node.js 22.
174
+
175
+ ```bash
176
+ npm ci
177
+ npm run check # typecheck + test + format
178
+ npm run build # dist/action.js, dist/cli.js
179
+ ```
180
+
181
+ Chạy app với dữ liệu thật từ mã nguồn: `npm run build && node dist/cli.js ui --repo owner/name`.
182
+
183
+ Thử planner với Gemini thật mà không cần GitHub (tốn quota của bạn):
184
+
185
+ ```bash
186
+ GEMINI_API_KEY=... node dist/cli.js plan-preview "Xây dựng tính năng đăng nhập Google OAuth"
187
+ ```
188
+
189
+ ### Cấu trúc
190
+
191
+ ```text
192
+ src/core/ Lõi thuần: canonical hash, policy, command, issue form, plan, baseline, decision, render
193
+ src/app/ Local app: LocalApp (plan, items, decisions), HTTP server bảo vệ bằng token/Host/Origin
194
+ ui/ Giao diện tĩnh (HTML/CSS/JS thuần, không build step)
195
+ src/planner/ Prompt, generatePlan, IssueTreeCreator
196
+ src/workflow/ WorkflowService (baseline, approve, ready, accept, revoke, PR gate), agent context
197
+ src/adapters/ GitHub (Octokit), evidence branch, Gemini, in-memory
198
+ src/entry/ action, cli
199
+ templates/ Tệp cho repository áp dụng: Issue forms, policy, workflow, PR template, AGENTS.md
200
+ tests/ Unit + kịch bản đầu-cuối với FakeGitHub/FakeModel
201
+ ```
202
+
203
+ ## Cài đặt vào một repository
204
+
205
+ > Thử trên **repository kiểm thử** trước. Cách mặc định (local app + Actions) không cần Google Cloud hay bất kỳ server nào.
206
+
207
+ 1. **GitHub App** để Actions ghi bằng chứng (Organization settings → Developer settings → GitHub Apps):
208
+ - Repository permissions: Contents **RW**, Issues **RW**, Commit statuses **RW**, Pull requests **R**, Actions **R**, Metadata **R**.
209
+ - Organization permissions: Projects **RW** (bỏ qua nếu không dùng Project).
210
+ - **Không cần webhook** (bỏ chọn _Active_). Tải private key; cài App vào repository.
211
+ 2. **Repository áp dụng**: sao chép nội dung `templates/` vào repository (hoặc chạy `npx huddle60 init`).
212
+ 3. Tạo repository variable `AI_DLC_APP_ID` và secret `AI_DLC_APP_PRIVATE_KEY`.
213
+ 4. Tạo labels và evidence branch: `npx huddle60 init --repo owner/name`, rồi tạo ruleset chặn
214
+ force-push/xóa cho branch `huddle60-evidence` và chỉ cho App ghi.
215
+ 5. Ruleset cho `main`: bắt buộc PR, review, CODEOWNERS cho `.github/**`, required status check `huddle60/baseline`.
216
+ 6. Trong Project: **tắt** workflow tự chuyển Done khi Issue đóng hoặc PR merge.
217
+ 7. Mỗi PO/DEV: `gh auth login`, rồi `npx huddle60 ui`.
218
+
219
+ ## Giới hạn đã biết
220
+
221
+ - Local app: bản nháp kế hoạch chỉ nằm trong bộ nhớ của tiến trình; tắt app trước khi tạo Issues thì phải soạn lại.
222
+ Chỉ hỗ trợ github.com (chưa GHES). Mỗi PO cần Gemini key riêng hoặc key do tổ chức cấp.
223
+ - API **sub-issues** và **Projects v2** phụ thuộc gói/quyền GitHub; khi không khả dụng, Issue vẫn được tạo và tham chiếu
224
+ cha trong nội dung, lỗi được ghi trong comment kết quả.
225
+ - Sửa Issue sau baseline chỉ bị phát hiện khi PR có sự kiện mới (push, sửa mô tả); chưa có reconciler định kỳ.
226
+ - Chưa hỗ trợ merge queue (`merge_group`), Issue và code ở hai repository khác nhau, hoặc nghiệm thu trên preview PR.
227
+ - Planner chỉ đọc nội dung Request Issue; không đọc mã nguồn.
228
+ - **Chưa chọn giấy phép.** Chủ dự án cần thêm `LICENSE` trước khi công bố để người khác được phép đóng góp và sử dụng.
229
+
230
+ ## Đóng góp
231
+
232
+ Xem [CONTRIBUTING.md](CONTRIBUTING.md). Báo lỗ hổng bảo mật theo [SECURITY.md](SECURITY.md), không đăng công khai.