huddle60 0.0.0-stage → 0.1.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/README.md CHANGED
@@ -1,3 +1,249 @@
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/ai-dlc-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 Firebase”_ |
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 `ai-dlc/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.** Issues, Projects, PR như team đang dùng. Không board thứ hai, không Jira.
50
+
51
+ ### Built on AI-DLC
52
+
53
+ huddle60 là bản hiện thực mở của **AI-DLC (AI-Driven Development Lifecycle)** trên GitHub: AI thực thi trong
54
+ phạm vi được giao, con người định hướng và quyết định, mọi bước có bằng chứng.
55
+ Giao thức AI-DLC là phần bạn thấy trên GitHub: lệnh `/ai-dlc`, label `ai-dlc:*`, check `ai-dlc/baseline`, branch
56
+ `ai-dlc-evidence`. huddle60 là cách nhanh nhất để dùng giao thức đó. Đặc tả đầy đủ:
57
+ [workflow AI-DLC](webapp_quanly.md) · [tài liệu kỹ thuật](docs/technical-implementation.md).
58
+
59
+ > 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.
60
+
61
+ ## Vì sao PO và DEV sẽ thích
62
+
63
+ | | Hôm nay | Với huddle60 |
64
+ |---|---|---|
65
+ | **PO** | Ngồi viết từng ticket, AC, chia việc | Gõ _“Lập trình login sử dụng Firebase”_ → 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 |
66
+ | **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** |
67
+ | **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 |
68
+ | **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 |
69
+ | **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 |
70
+
71
+ ### PO thấy gì sau 30 giây?
72
+
73
+ Chạy `huddle60 ui`, gõ yêu cầu vào tab **new plan**, bấm **generate plan** (rút gọn):
74
+
75
+ > ## Kế hoạch đề xuất (revision 1)
76
+ > Đăng nhập bằng Firebase Authentication cho ứng dụng web.
77
+ >
78
+ > - **Epic** `epic-auth`: Xác thực người dùng bằng Firebase
79
+ > - **Story** `story-login`: Đăng nhập bằng email và mật khẩu
80
+ > - AC-01: Given tài khoản hợp lệ When đăng nhập Then vào trang chính
81
+ > - AC-02: Given sai mật khẩu When đăng nhập Then thấy thông báo lỗi chung
82
+ > - **Task** `task-firebase-setup`: Cấu hình Firebase Authentication
83
+ > - **Task** `task-login-ui`: Giao diện đăng nhập _(blocked by task-firebase-setup)_
84
+ > - **Story** `story-logout`: Đăng xuất
85
+ >
86
+ > **Câu hỏi khác:** Có cần đăng nhập bằng Google không?
87
+
88
+ 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
89
+ 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.
90
+
91
+ **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),
92
+ 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).
93
+
94
+ ## Bắt đầu nhanh
95
+
96
+ ```bash
97
+ gh auth login # app dùng token GitHub của chính bạn
98
+ export GEMINI_API_KEY=... # chỉ PO cần (để soạn kế hoạch); macOS có thể lưu vào Keychain:
99
+ # security add-generic-password -s huddle60-gemini -a $USER -w
100
+ npx huddle60 ui --repo owner/name
101
+ ```
102
+
103
+ App mở trình duyệt tại `http://127.0.0.1:4317/#token=…`:
104
+
105
+ - **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
106
+ 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.
107
+ - **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.
108
+ - **activity**: lệnh đã gửi và phản hồi của GitHub Actions.
109
+
110
+ Mỗi nút chỉ đăng một comment `/ai-dlc …` **bằng tài khoản của bạn**; GitHub Actions kiểm tra role, hash, phụ thuộc rồi
111
+ ghi bằng chứng. App không có quyền gì hơn bạn và không tự quyết thay ai.
112
+
113
+ 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,
114
+ CSRF), CSP chặt, không dựng HTML từ dữ liệu.
115
+
116
+ ## Cách hoạt động
117
+
118
+ ```mermaid
119
+ flowchart LR
120
+ PO[PO] -->|huddle60 ui| L[Local app<br/>127.0.0.1]
121
+ DEV[DEV] -->|huddle60 ui / context| L
122
+ L <-->|structured JSON| G[Gemini API]
123
+ L -->|Issues + comment /ai-dlc<br/>bằng token của user| GH[GitHub Issues/Projects]
124
+ GH -->|issue_comment| A[GitHub Action<br/>baseline/approve/ready/accept]
125
+ A -->|evidence + phản hồi| GH
126
+ DEV --> PR[Pull Request]
127
+ A -->|status ai-dlc/baseline| PR
128
+ ```
129
+
130
+ | Thành phần | Chạy ở đâu | Làm gì |
131
+ |---|---|---|
132
+ | **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 |
133
+ | **Workflow gates** (`src/workflow`) | GitHub Actions (`action.yml`) | Baseline có hash, quyết định PO/DEV, check `ai-dlc/baseline` cho PR, nghiệm thu build |
134
+ | **CLI** (`src/entry/cli.ts`) | Máy DEV | `context` cho IDE agent, `init`, kiểm tra policy, thử planner |
135
+ | **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 |
136
+ | _Planner service_ (`src/planner`, `src/server`) | _Tùy chọn_: Cloud Run + Cloud Tasks + Firestore | Cho team muốn PO làm hoàn toàn trên GitHub bằng lệnh `/ai-dlc refine`, `create-plan` |
137
+
138
+ 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
139
+ kiểm tra theo GitHub user ID trong `.github/ai-dlc/policy.yml`. Thiết kế đầy đủ:
140
+ [đặc tả workflow](webapp_quanly.md) · [tài liệu kỹ thuật](docs/technical-implementation.md).
141
+
142
+ ## Luồng sử dụng
143
+
144
+ 1. **PO** mở `huddle60 ui` → **new plan**, gõ: _“Lập trình login sử dụng Firebase”_ → trả lời câu hỏi chặn → **create issues**.
145
+ 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).
146
+ 3. DEV chọn lane và bấm **ready**. Task kế thừa approve của Story cha.
147
+ 4. DEV bấm **context** (hoặc chạy CLI) để đưa baseline vào IDE agent, rồi mở PR kèm khối AI-DLC trong context:
148
+ ```bash
149
+ npx huddle60 context --issue 15
150
+ ```
151
+ 5. Sau khi merge và build trên `main` thành công, PO bấm **accept**, chọn build → Issue được đóng.
152
+
153
+ Không dùng app vẫn được: mọi nút tương ứng một lệnh comment bên dưới.
154
+
155
+ ### Các lệnh
156
+
157
+ | Lệnh | Ai | Xử lý bởi | Tác dụng |
158
+ |---|---|---|---|
159
+ | `refine plan=<id>` + ghi chú | PO | Planner service | Tạo revision mới của kế hoạch |
160
+ | `create-plan plan=<id> hash=<h>` | PO | Planner service | Tạo cây Issues; lặp lại an toàn nếu bị gián đoạn |
161
+ | `resume-plan plan=<id>` | PO, maintainer | Planner service | Tiếp tục tạo Issues dở dang, không tạo trùng |
162
+ | `baseline` | PO, DEV | Action | Chụp snapshot yêu cầu, trả id + hash (tùy chọn: approve/ready tự chụp) |
163
+ | `approve baseline=<id> hash=<h>` | PO | Action | Duyệt nghiệp vụ của Story (Task kế thừa duyệt của Story cha) |
164
+ | `ready baseline=<id> hash=<h> lane=<fast\|standard\|strict>` | DEV | Action | Xác nhận Story/Task sẵn sàng, trả khối cho PR |
165
+ | `accept baseline=<id> run=<run_id> commit=<sha>` | PO | Action | Nghiệm thu Story/Epic trên build `main`, đóng Issue |
166
+ | `revoke decision=<id> reason="..."` | Tác giả hoặc cùng role | Action | Thu hồi quyết định |
167
+
168
+ Lệnh phải nằm ở **dòng đầu** của comment. Mọi quyết định được kiểm tra lại mỗi lần dùng: sửa/xóa comment,
169
+ mất role, sửa Issue sau baseline hoặc thu hồi đều làm quyết định mất hiệu lực.
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/planner-server.js, 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 "Lập trình login sử dụng Firebase"
187
+ ```
188
+
189
+ Chạy planner service tùy chọn cục bộ (store và queue trong bộ nhớ): sao chép `.env.example` thành `.env`, điền giá trị,
190
+ rồi `node --env-file=.env dist/planner-server.js`. Dùng công cụ như `smee.io` để chuyển webhook từ GitHub App về máy.
191
+
192
+ ### Cấu trúc
193
+
194
+ ```text
195
+ src/core/ Lõi thuần: canonical hash, policy, command, issue form, plan, baseline, decision, render
196
+ src/app/ Local app: LocalApp (plan, items, decisions), HTTP server bảo vệ bằng token/Host/Origin
197
+ ui/ Giao diện tĩnh (HTML/CSS/JS thuần, không build step)
198
+ src/planner/ Prompt, generatePlan, IssueTreeCreator, PlannerService (dịch vụ tùy chọn)
199
+ src/workflow/ WorkflowService (baseline, approve, ready, accept, revoke, PR gate), agent context
200
+ src/adapters/ GitHub (Octokit), evidence branch, Gemini, Firestore, Cloud Tasks, in-memory
201
+ src/server/ HTTP của planner service: xác minh HMAC webhook, chống trùng delivery
202
+ src/entry/ planner-server, action, cli
203
+ templates/ Tệp cho repository áp dụng: Issue forms, policy, workflow, PR template, AGENTS.md
204
+ infra/cloud-run/ Script triển khai planner
205
+ tests/ Unit + kịch bản đầu-cuối với FakeGitHub/FakeModel
206
+ ```
207
+
208
+ ## Cài đặt vào một repository
209
+
210
+ > Thử trên **repository kiểm thử** trước. Cách mặc định (local app + Actions) không cần Google Cloud.
211
+
212
+ 1. **GitHub App** để Actions ghi bằng chứng (Organization settings → Developer settings → GitHub Apps):
213
+ - Repository permissions: Contents **RW**, Issues **RW**, Commit statuses **RW**, Pull requests **R**, Actions **R**, Metadata **R**.
214
+ - Organization permissions: Projects **RW** (bỏ qua nếu không dùng Project).
215
+ - **Không cần webhook** (bỏ chọn _Active_). Tải private key; cài App vào repository.
216
+ 2. **Repository áp dụng**: sao chép nội dung `templates/` vào repository; sửa `policy.yml` (numeric user id từ
217
+ `gh api users/<login> --jq .id`), thay `your-org/huddle60@v0` bằng commit SHA của repository này.
218
+ 3. Tạo repository variable `AI_DLC_APP_ID` và secret `AI_DLC_APP_PRIVATE_KEY`.
219
+ 4. Tạo labels và evidence branch: `npx huddle60 init --repo owner/name`, rồi tạo ruleset chặn
220
+ force-push/xóa cho branch `ai-dlc-evidence` và chỉ cho App ghi.
221
+ 5. Ruleset cho `main`: bắt buộc PR, review, CODEOWNERS cho `.github/**`, required status check `ai-dlc/baseline`.
222
+ 6. Trong Project: **tắt** workflow tự chuyển Done khi Issue đóng hoặc PR merge.
223
+ 7. Mỗi PO/DEV: `gh auth login`, rồi `npx huddle60 ui`.
224
+
225
+ **Tùy chọn — planner service trên Cloud Run** (PO làm hoàn toàn trên GitHub bằng lệnh, không cần app local): bật
226
+ webhook của App cho sự kiện **Issues** và **Issue comment**, rồi
227
+ ```bash
228
+ GCP_PROJECT=my-project GITHUB_APP_ID=123456 \
229
+ GITHUB_APP_PRIVATE_KEY_FILE=./app.pem GEMINI_API_KEY_FILE=./gemini.key \
230
+ ./infra/cloud-run/deploy.sh
231
+ ```
232
+ Đặt Webhook URL và secret mà script in ra vào GitHub App.
233
+
234
+ ## Giới hạn đã biết
235
+
236
+ - **Chưa kiểm chứng đầu-cuối** với GitHub, Gemini, Firestore và Cloud Tasks thật. Các adapter được typecheck theo SDK
237
+ nhưng chỉ logic dùng fake mới có test. Đây là việc cần cộng đồng nhất.
238
+ - 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.
239
+ 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.
240
+ - 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
241
+ cha trong nội dung, lỗi được ghi trong comment kết quả.
242
+ - 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ỳ.
243
+ - 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.
244
+ - Planner chỉ đọc nội dung Request Issue; không đọc mã nguồn.
245
+ - **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.
246
+
247
+ ## Đóng góp
248
+
249
+ 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.