@kesflow/kf 0.1.0 → 0.1.2

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.
Files changed (3) hide show
  1. package/README.md +94 -13
  2. package/SKILL.md +37 -0
  3. package/package.json +15 -5
package/README.md CHANGED
@@ -1,25 +1,106 @@
1
- # `@kesflow/kf`
1
+ # `kf` — CLI nội bộ KesFlow
2
2
 
3
- CLI for KesFlow staff agents. Requires Node.js 22 or newer and a personal token from **Nội bộ → Kết nối của tôi**.
3
+ `kf` cho phép agent (Claude Code, Hermes, Codex) làm việc nội bộ KesFlow **thay bạn**, thay vì bạn bấm từng màn trên ops. Agent dùng đúng tài khoản ops của bạn: bạn được làm gì trên ops thì agent làm được đúng như vậy, không hơn. Mỗi thao tác qua agent đều được ghi nhật ký.
4
+
5
+ Hiện có nhóm **LMS sau buổi học**: xem lớp/buổi mình phụ trách, gắn record từ Google Drive, tải slide/record lên, đổi tên/gỡ tệp, ghi recap/bài tập/chuẩn bị, đăng buổi. Danh sách luôn cập nhật theo server — gõ `kf --help` để xem.
6
+
7
+ ![kf hoạt động thế nào: bạn nói việc → agent chạy kf → server kiểm token, chạy đúng hàm như ops với vai của bạn, ghi nhật ký → kết quả về chat](docs/kf-hoat-dong.png)
8
+
9
+ ## 1. Cài đặt (một lần mỗi máy)
10
+
11
+ Cần Node.js 22 trở lên.
4
12
 
5
13
  ```sh
6
14
  npm install -g @kesflow/kf
7
15
  ```
8
16
 
9
- Đăng nhập: bảo người dùng mở một terminal riêng và gõ `kf login`, rồi dán token vào ô ẩn (ô chat Claude Code với `!` không có terminal nên không dùng được). Agent không tự chạy `kf login`, không bao giờ hỏi hay nhận token trong chat. `kf logout` removes the local file; revoke the token on the ops page.
17
+ Cài skill cho Claude Code (giúp agent dùng `kf` đúng cách):
18
+
19
+ ```sh
20
+ mkdir -p ~/.claude/skills/kf-cli && cp "$(npm root -g)/@kesflow/kf/SKILL.md" ~/.claude/skills/kf-cli/SKILL.md
21
+ ```
22
+
23
+ Agent khác (Hermes, Codex…): nạp tệp `SKILL.md` ở `$(npm root -g)/@kesflow/kf/SKILL.md` theo cách agent đó nạp skill.
24
+
25
+ ## 2. Đăng nhập (một lần mỗi máy)
26
+
27
+ ![Đăng nhập một lần mỗi máy: tạo token trên ops → kf login trong terminal riêng → kf status → dùng trong Claude Code; không dán token vào chat](docs/dang-nhap-mot-lan.png)
28
+
29
+ 1. Vào ops → **Kết nối của tôi** (`/noi-bo/ket-noi`) → đặt tên máy (vd "Laptop làm việc") → **Tạo token** → copy. Token chỉ hiện một lần.
30
+ 2. **Mở một terminal riêng** (Terminal trên macOS/Linux, PowerShell trên Windows) và gõ:
31
+ ```sh
32
+ kf login
33
+ ```
34
+ Dán token vào ô ẩn (không hiện chữ) rồi Enter.
35
+ 3. Kiểm tra: `kf status` hiện tên bạn và các lớp bạn phụ trách.
36
+
37
+ > **Không** dán token vào ô chat của Claude Code hay bất kỳ agent nào, và không gõ `! kf login` trong ô chat (lệnh `!` không có terminal nên không nhập ẩn được). Agent sẽ chỉ nhắc bạn đăng nhập, không bao giờ hỏi token.
38
+
39
+ Token **tự gia hạn khi còn dùng**; bỏ không dùng 30 ngày thì hết hạn — khi đó tạo token mới và `kf login` lại. Đổi máy, mất máy hoặc nghi lộ: vào **Kết nối của tôi** → **Thu hồi**. `kf logout` chỉ xoá token trên máy, không thu hồi trên server.
40
+
41
+ ## 3. Dùng với Claude Code
42
+
43
+ Sau khi đăng nhập, cứ nói việc cần làm, ví dụ:
44
+
45
+ - "Xem các buổi của lớp TA05."
46
+ - "Chốt buổi B03 lớp TA05: gắn record từ link Drive này, đổi tên thành 'Record Buổi 3 - …', ghi recap như sau …"
47
+ - "Tải file slide.html này lên buổi B03 lớp TA05."
48
+
49
+ Agent tự tìm thao tác phù hợp (`kf --help`), chạy thử khi cần (`--dry-run`), rồi làm.
50
+
51
+ ## 4. Thao tác rủi ro cao
52
+
53
+ Các thao tác gắn nhãn `[high]` (vd **đăng buổi có gửi thư cho học viên**) cần thêm `--yes`. Agent chỉ được thêm `--yes` **sau khi bạn đồng ý rõ trong chat** với đúng nội dung: buổi nào, lớp nào, có gửi thư không. Đọc kỹ trước khi đồng ý — thư đã gửi thì không thu hồi được.
54
+
55
+ Khuyến nghị: để Claude Code hỏi quyền trước khi chạy lệnh shell (không bật chế độ bỏ qua quyền) khi làm việc với `kf`.
56
+
57
+ ## 5. Dùng tay (tuỳ chọn)
58
+
59
+ ```sh
60
+ kf --help # danh sách thao tác hiện có
61
+ kf lms-buoi --lop-ma TA05 # các buổi của lớp
62
+ kf lms-buoi-chi-tiet --buoi-id <id> # tệp, recap, đề bài của buổi
63
+ kf lms-doi-ten --tep-id <id> --ten 'Tên mới'
64
+ kf lms upload slide.html --buoi-id <id> # tải tệp lên (tự nhận loại theo đuôi tệp)
65
+ kf lms-ghi-recap --buoi-id <id> --recap-md '# Recap' --de-bai-md null --dry-run
66
+ kf <thao-tác> --help # tham số của một thao tác
67
+ ```
68
+
69
+ Kết quả là một dòng JSON (`--pretty` để dễ đọc).
70
+
71
+ ## 6. Lỗi thường gặp
72
+
73
+ | Mã thoát | Thông báo | Nghĩa / làm gì |
74
+ |---|---|---|
75
+ | 3 | `NOT_LOGGED_IN`, `HTTP_401`, "token hết hạn/đã thu hồi" | Tạo token mới trên ops, mở terminal riêng gõ `kf login` |
76
+ | 3 | `khong_vai` (403) | Bạn không có vai với lớp/buổi đó — nhờ quản trị cấp vai trên ops |
77
+ | 2 | "cần --yes", sai tham số, `KF_API_URL khác nơi đã đăng nhập` | Sửa lệnh; với địa chỉ API thì đăng nhập lại |
78
+ | 4 | `LMS_…` (vd `LMS_DA_CO_RECORD`) | Lỗi nghiệp vụ — đọc mã, xử lý như trên ops |
79
+ | 5 | `AGENT_TAT` | Agent API đang tạm tắt — báo quản trị, làm tay trên ops |
80
+ | 5 | mạng / server | Thử lại sau; vẫn lỗi thì báo kỹ thuật |
81
+
82
+ `lms-dang-buoi` trả `da_dang:false, thieu:["record"]` nghĩa là buổi chưa có record sẵn sàng nên chưa đăng — không phải lỗi.
10
83
 
11
- Commands use the operation IDs from `GET /ops` exactly: `kf <op-id>`. Run `kf --help` for the live list, `kf schema <op-id>` for JSON Schema, or `kf <op-id> --help` for flags. The CLI keeps no persistent operations cache.
84
+ ## 7. Cập nhật
85
+
86
+ Thao tác mới do server thêm sẽ **tự hiện** trong `kf --help`, không cần cập nhật. Chỉ khi được báo có bản CLI mới:
12
87
 
13
88
  ```sh
14
- kf status
15
- kf ops
16
- kf lms-buoi --lop-ma THUCLI
17
- kf lms-doi-ten --tep-id UUID --ten 'Tên mới'
18
- kf lms-ghi-recap --json '{"buoi_id":"UUID","recap_md":"# Buổi học","de_bai_md":null}'
19
- kf lms-dang-buoi --buoi-id UUID --gui-thu false --yes
20
- kf lms upload slide.html --buoi-id UUID
89
+ npm install -g @kesflow/kf@latest
90
+ cp "$(npm root -g)/@kesflow/kf/SKILL.md" ~/.claude/skills/kf-cli/SKILL.md
21
91
  ```
22
92
 
23
- Use `--dry-run` to validate an operation without writing and `--pretty` for indented JSON. High-risk operations require `--yes`. Normal output is one JSON line on stdout; errors are one JSON line on stderr. Exit codes: 0 success, 2 usage, 3 authentication or permission, 4 business error, 5 server or network.
93
+ ## 8. Bảo mật
94
+
95
+ - Token nằm ở `~/.config/kf/credentials.json` (chỉ bạn đọc được) và gắn với địa chỉ API lúc đăng nhập.
96
+ - Không dùng `kf` trên máy dùng chung. Không chép tệp credentials sang máy khác — mỗi máy một token.
97
+
98
+ ---
99
+
100
+ ## Cho người phát triển
24
101
 
25
- Credentials are stored in `~/.config/kf/credentials.json` (directory mode 700, file mode 600). `KF_API_URL` is honoured by `kf login` and saved with the token. Changing it later requires another login. Plain HTTP is accepted only for localhost loopback tests.
102
+ - Mã nguồn: repo riêng tư `kescyz/kf`. TypeScript, không phụ thuộc runtime; lệnh dựng lúc chạy từ `GET https://kesflow.vn/api/agent/v1/ops` — CLI **không chứa nghiệp vụ**. Thêm thao tác = sửa registry ở repo website (tài liệu API sinh tự động: `docs/api/agent-ops.md`), không cần phát hành CLI.
103
+ - Phần chung (đọc đặc tả → dựng lệnh, đăng nhập, mã thoát) nằm ở `src/api.ts`, `src/ops.ts`, `src/config.ts`; phần riêng KesFlow ở `src/kesflow.ts` — nền để sau tách `kes-api2cli`.
104
+ - Sơ đồ trong README: nguồn sửa là `docs/*.html` (skill `kf-create-diagram`), `docs/*.png` là bản xuất để nhúng, `docs/*.svg` là bản vector.
105
+ - `npm test` (build + test), `npm run typecheck`, `npm pack --dry-run` (chỉ `dist`, `README.md`, `SKILL.md`, `package.json`).
106
+ - Phát hành: tăng `version`, rồi chủ tài khoản npm chạy `npm publish --auth-type=web` trong terminal riêng (xác nhận passkey).
package/SKILL.md ADDED
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: kf-cli
3
+ description: Thao tác nội bộ KesFlow qua CLI `kf` thay cho bấm màn ops — chốt buổi học LMS (gắn record từ Drive, tải slide, đổi tên/gỡ tệp, ghi recap/bài tập/chuẩn bị, đăng buổi), xem lớp và buổi mình phụ trách. Dùng khi nhân sự KesFlow nhờ "chốt buổi", "up slide/record lên LMS", "ghi recap", "đăng buổi", "đổi tên record", "xem buổi lớp TA05" hoặc nhắc tới `kf`. Không dùng cho việc ngoài danh sách `kf --help` (tiền, ghi danh, gửi mail tự do chưa có trong CLI).
4
+ ---
5
+
6
+ # kf — CLI nội bộ KesFlow cho agent
7
+
8
+ `kf` gọi Agent API của KesFlow **nhân danh người đang đăng nhập**; quyền do DB quyết định theo vai của người đó, y như màn ops.
9
+
10
+ ## Đăng nhập — người dùng tự làm, KHÔNG qua chat
11
+ - Chưa đăng nhập (`kf status` thoát mã 3, `NOT_LOGGED_IN`) hoặc token hết hạn/thu hồi (401): bảo người dùng
12
+ 1. vào ops → **Kết nối của tôi** → **Tạo token** (đặt tên máy);
13
+ 2. **mở một terminal riêng** (ô chat Claude Code với `!` không có terminal nên không dùng được), gõ `kf login`, dán token vào ô ẩn.
14
+ - **Không bao giờ** hỏi, nhận, đọc, in hay ghi token. Không tự chạy `kf login`. Không đọc `~/.config/kf/credentials.json`.
15
+
16
+ ## Cách dùng
17
+ - Danh sách thao tác (lấy trực tiếp từ server, luôn đúng): `kf --help`. Tham số một thao tác: `kf <op> --help`, `kf schema <op>`.
18
+ - Gọi: `kf <op> --<tham-so> <giá trị>` hoặc `kf <op> --json '{...}'`. Kết quả: một dòng JSON (`--pretty` để đọc).
19
+ - Không chắc thì chạy thử trước: thêm `--dry-run` (chỉ kiểm, không ghi gì).
20
+ - Tải tệp từ máy lên buổi học: `kf lms upload <tệp> --buoi-id <id> [--loai slide_pdf|slide_html|record|video_xem_truoc] [--ten ...]`.
21
+ - Tìm `buoi-id`: `kf status` (lớp tôi phụ trách) → `kf lms-buoi --lop-ma <MÃ LỚP>`.
22
+
23
+ ## Thao tác rủi ro cao (`[high]`, cần `--yes`)
24
+ - Ví dụ `lms-dang-buoi --gui-thu true` gửi thư cho **cả lớp thật**.
25
+ - Chỉ thêm `--yes` **sau khi người dùng đồng ý rõ trong chat** với đúng nội dung: buổi nào, lớp nào, có gửi thư không. Không tự suy ra ý định gửi thư.
26
+ - `--yes` không thay người duyệt; người dùng nên để Claude Code hỏi quyền trước lệnh `kf … --yes`.
27
+
28
+ ## Đọc kết quả
29
+ | Mã thoát | Nghĩa | Làm gì |
30
+ |---|---|---|
31
+ | 0 | OK | báo kết quả |
32
+ | 2 | Sai cách dùng / thiếu `--yes` / cấu hình | sửa lệnh; cấu hình lỗi → nhắc đăng nhập lại ở terminal riêng |
33
+ | 3 | 401 (token) / 403 `khong_vai` (không có vai với lớp/buổi đó) | 401 → nhắc đăng nhập lại; 403 → báo người dùng không có quyền, không thử đường khác |
34
+ | 4 | Lỗi nghiệp vụ (`LMS_*`, vd `LMS_DA_CO_RECORD`) | đọc mã, báo người dùng |
35
+ | 5 | Mạng/server; `AGENT_TAT` = Agent API đang tắt | báo người dùng, không thử lại liên tục |
36
+
37
+ `lms-dang-buoi` có thể trả `da_dang:false, thieu:["record"]`: buổi chưa có record sẵn sàng nên chưa đăng — không phải lỗi.
package/package.json CHANGED
@@ -1,12 +1,22 @@
1
1
  {
2
2
  "name": "@kesflow/kf",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "KesFlow agent CLI",
5
5
  "type": "module",
6
- "bin": { "kf": "./dist/cli.js" },
7
- "files": ["dist", "README.md"],
8
- "publishConfig": { "access": "public" },
9
- "engines": { "node": ">=22" },
6
+ "bin": {
7
+ "kf": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "SKILL.md"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "engines": {
18
+ "node": ">=22"
19
+ },
10
20
  "scripts": {
11
21
  "build": "tsc -p tsconfig.json && node -e \"require('node:fs').chmodSync('dist/cli.js', 0o755)\"",
12
22
  "prepack": "npm run build",