suken-cite-guide 0.1.0__tar.gz
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.
- suken_cite_guide-0.1.0/LICENSE +21 -0
- suken_cite_guide-0.1.0/PKG-INFO +96 -0
- suken_cite_guide-0.1.0/README.md +78 -0
- suken_cite_guide-0.1.0/THIRD_PARTY_NOTICES.md +23 -0
- suken_cite_guide-0.1.0/pyproject.toml +31 -0
- suken_cite_guide-0.1.0/setup.cfg +4 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/CITE.md +79 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/CODE.md +86 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/CODESTORY.md +116 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/GUIDE.md +124 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/RENDERER.md +65 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/STORY.md +159 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/__init__.py +1 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/__main__.py +3 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/agents/suken-guide-code-review.md +57 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/agents/suken-guide-story-review.md +45 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/cli.py +503 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/codeinfo.py +468 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/editor.py +101 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/guide.py +415 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/hook.py +152 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/project.py +353 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/server.py +95 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/snapshot.py +76 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/c.html +87 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/callout.js +2 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/github-dark.css +118 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/inject.js +2 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/inject.js.LEGAL.txt +11 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/pdf.worker.min.mjs +28 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/pdf_viewer.css +6463 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-code-explain.js +19 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-csv.js +2 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-docx.js +23 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-docx.js.LEGAL.txt +22 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-open.js +24 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-open.js.LEGAL.txt +22 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-pdf.js +55 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/render-story.js +12 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/dist/text-annotator.css +1 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/guide/guide.js +479 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/index.html +25 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/inject.css +58 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/code-explain.html +113 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/csv.html +18 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/docx.html +14 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/open.html +21 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/pdf.html +18 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/pptx.html +36 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/render.css +72 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/story.html +93 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/render/xlsx.html +43 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/LICENSE +21 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/assets/render-worker-1uPAxMZr.js +31 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/assets/render-worker-CzmiJfFL.js +11 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/bounded-raw-part-cache-Cg1BsSZQ.js +119 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/canvas-viewer-mechanics-DbLz0rYW.js +1384 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/chunk-DmhlhrBa.js +11 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/cjk-fallback-bLI3z70h.js +46 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/comment-occurrence-C8Y2uoVr.js +6 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/comment-ui-runtime-BsK8pmUT.js +2 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/comment-ui-runtime-CWGqn5Vr.js +112 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/delimited-text-worker-host-BVY-Ecni.js +27 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/dom-interaction-boundary-Cnm8DSBN.js +223 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/highlight-rect-C5hkRqUr.js +13 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/hyperlink-Cxzhet30.js +36446 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/line-distribute-D1WNHKz_.js +1023 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/line-metrics-B60C86uh.js +60 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/mathjax-DoyWZbSp.js +21 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/pixel-budget-9P63Bsk5.js +37 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/plot-area-frame-DLTYKHNP.js +4354 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/pptx-DkyYBYoL.js +3065 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/pptx.mjs +7 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/pptx_parser_bg.wasm +0 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/raster-target-ojDdQizC.js +91 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/read-only-comment-decoration-Dz7eTQ4d.js +96 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/read-only-comment-margin-DkgzASAl.js +189 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/render-worker-host-B5wQfB7U.js +9 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/render-worker-host-D4123J27.js +9 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/renderer-B4GZb5We.js +6492 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/renderer-module-contract-D91rkYHH.js +32 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/resource-measurement-SHQCbkh2.js +150 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/slide-pull-client-DiPnm240.js +6253 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/three-d-DJBl8g8M.js +1162 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/transfer-p6iCC2R7.js +6 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/units-BzZ0gAxs.js +4 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/visible-index-BgiHEc1z.js +17 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/worksheet-pull-client-BM8ywvbu.js +458 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/xlsx-C9NVjgaV.js +8484 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/xlsx.mjs +7 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/static/vendor/ooxml/xlsx_parser_bg.wasm +0 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/story.py +215 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide/tab.py +183 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide.egg-info/PKG-INFO +96 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide.egg-info/SOURCES.txt +96 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide.egg-info/dependency_links.txt +1 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide.egg-info/entry_points.txt +2 -0
- suken_cite_guide-0.1.0/src/suken_cite_guide.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 suken
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: suken-cite-guide
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Giải thích có bằng chứng (ảnh nguồn khoanh đỏ kèm dòng dịch, tuyến truyện trên khung UI, thẻ giải thích code) và cầm tay chỉ việc trên trình duyệt; 5 chế độ bật bằng từ khoá qua hook Claude Code.
|
|
5
|
+
Author: suken
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Keywords: citation,screenshot,highlight,annotation,llm,claude-code
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
10
|
+
Classifier: Operating System :: MacOS
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Topic :: Text Processing
|
|
13
|
+
Requires-Python: >=3.9
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
License-File: THIRD_PARTY_NOTICES.md
|
|
17
|
+
Dynamic: license-file
|
|
18
|
+
|
|
19
|
+
# suken-cite-guide
|
|
20
|
+
|
|
21
|
+
Giúp một LLM agent (như Claude Code) **giải thích có bằng chứng** và **cầm tay chỉ việc** cho người dùng.
|
|
22
|
+
Mỗi khẳng định kèm ảnh chụp nguồn khoanh đỏ đoạn trích và một dòng dịch; mỗi việc cần làm trên trình duyệt
|
|
23
|
+
thì agent vẽ vòng đỏ ngay trên màn hình để người dùng tự bấm. Gói có 5 chế độ, người dùng gõ từ khoá trong
|
|
24
|
+
chat để bật đúng chế độ cần:
|
|
25
|
+
|
|
26
|
+
| Từ khoá | Chế độ | Người đọc nhận |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| `suken-Story` | cốt truyện giải thích | **một link** tuyến truyện vẽ trên khung UI (trục thời gian, chuỗi nhân quả, so sánh, so số liệu, mâu thuẫn, chỗ hổng…), đi từng bước bằng ◀ ▶, ô nào cũng có 📷 mở ảnh nguồn |
|
|
29
|
+
| `suken-Cite` | trích dẫn đơn lẻ | câu trả lời ngắn, mỗi ý kèm một link ảnh nguồn khoanh đỏ |
|
|
30
|
+
| `suken-CodeStory` | cốt truyện code | một flow qua nhiều module kể thành tuyến truyện, mỗi bước một thẻ giải thích code |
|
|
31
|
+
| `suken-Code` | thẻ code | một thẻ gom vị trí trong flow, class, hàm, thư viện, biến và giá trị thật lúc chạy, bằng màu, icon, sơ đồ |
|
|
32
|
+
| `suken-Guide` / `suken-non_Guide` | cầm tay chỉ việc | vòng đỏ, mũi tên, 📋 dán, ⏎, 🔗 vẽ trên chính tab của mình; tự bấm từng bước, bấm sai thì bị chặn |
|
|
33
|
+
|
|
34
|
+
Nguồn có thể là trang web (kể cả email, chat phải đăng nhập), PDF, Word, Excel, PowerPoint, CSV, ảnh, file
|
|
35
|
+
code và file chữ (mở trong VS Code chạy trên trình duyệt).
|
|
36
|
+
|
|
37
|
+
## Dùng thế nào
|
|
38
|
+
|
|
39
|
+
Cài gói, rồi cài hook một lần trong thư mục mở Claude Code:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install suken-cite-guide
|
|
43
|
+
suken-cite-guide setup # cài hook, 2 reviewer, code-server; kiểm chrome-devtools
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Từ đó, gõ từ khoá kèm yêu cầu trong chat, ví dụ `suken-Story vì sao run B chậm hơn run A?`. Hook đưa
|
|
47
|
+
nguyên hướng dẫn của chế độ đó cho agent ngay trong lượt chat, agent không phải tự nhớ đọc. Riêng
|
|
48
|
+
`suken-Guide` giữ tới khi gõ `suken-non_Guide`: trong lúc bật, hook chặn agent tự bấm, gõ, mở, đóng tab
|
|
49
|
+
trên trình duyệt, chỉ người dùng tắt được.
|
|
50
|
+
|
|
51
|
+
Không dùng hook (agent khác Claude Code): bảo agent chạy `suken-cite-guide usage` để chọn chế độ và đọc
|
|
52
|
+
hướng dẫn. Mỗi hướng dẫn cùng một khung: luật vàng, checklist, review; agent chỉ giao kết quả khi reviewer
|
|
53
|
+
chấm **ĐẠT**.
|
|
54
|
+
|
|
55
|
+
## Các lệnh
|
|
56
|
+
|
|
57
|
+
| Lệnh | Làm gì |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| `suken-cite-guide setup [--remove]` | cài hook cho 5 từ khoá (`.claude/settings.local.json`, giữ nguyên hook khác), 2 subagent reviewer (`.claude/agents/`), code-server (~220 MB vào cache); kiểm MCP chrome-devtools và cổng Chrome DevTools rồi báo thiếu gì. `--remove` gỡ hook và reviewer |
|
|
60
|
+
| `suken-cite-guide usage [story\|cite\|codestory\|code\|guide\|renderer]` | in hướng dẫn của một chế độ (không kèm: in danh sách chế độ) |
|
|
61
|
+
| `suken-cite-guide init --dir ./cites` | tạo thư mục dự án trích dẫn |
|
|
62
|
+
| `suken-cite-guide serve --dir ./cites` | bật server xem ảnh, xem file (mặc định cổng 8123); `render/pdf.html?file=…&page=` và `render/open.html?file=…` mở thẳng PDF, Word, Excel, PowerPoint, CSV |
|
|
63
|
+
| `suken-cite-guide text --file … \| --doc …` | in chữ của nguồn (pdf, docx, xlsx, pptx) để đọc nhanh trước khi chụp |
|
|
64
|
+
| `suken-cite-guide add …` | thêm trích dẫn: ảnh chụp `--image` + `--box`, hoặc thẻ code `--explain <json>` — thiếu mục nào thì từ chối và nói rõ |
|
|
65
|
+
| `suken-cite-guide skeleton --file … --lines …` | thẻ code: in khung JSON điền sẵn class, hàm, biến của các dòng code (Python) |
|
|
66
|
+
| `suken-cite-guide story --template timeline\|argument` | in khung truyện; điền xong thì `story --id … --json …` kiểm và lưu |
|
|
67
|
+
| `suken-cite-guide editor --folder …` | mở VS Code chạy trên trình duyệt (code-server); lần đầu tự tải ~220 MB vào cache |
|
|
68
|
+
| `suken-cite-guide guide template` | in khung kịch bản cầm tay chỉ việc |
|
|
69
|
+
| `suken-cite-guide guide run <kịch bản\|->` | kiểm kịch bản rồi vẽ vòng đỏ trên tab người dùng; mỗi lần cần agent (xong, lạc, bấm sai, tunnel…) in một dòng JSON kèm ảnh tab và tóm tắt trang |
|
|
70
|
+
| `suken-cite-guide guide reattach [địa chỉ]` | gắn bộ điều khiển đang chạy vào kết nối Chrome mới (sau khi người dùng mở lại tunnel) |
|
|
71
|
+
| `suken-cite-guide register`, `snapshot`, `urls` | ghi nguồn gốc file; lưu bản sao trang web (cách cũ); in link |
|
|
72
|
+
| `suken-cite-guide check` | kiểm mọi trích dẫn và mọi truyện |
|
|
73
|
+
|
|
74
|
+
Ví dụ một trích dẫn:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
suken-cite-guide init --dir ./cites
|
|
78
|
+
suken-cite-guide serve --dir ./cites &
|
|
79
|
+
# agent mở nguồn trên Chrome, chụp màn hình vào ./cites/shots/price.png, rồi chỉ vùng cần khoanh:
|
|
80
|
+
suken-cite-guide add --dir ./cites --id price --image ./cites/shots/price.png --box 120,340,860,372 \
|
|
81
|
+
--quote "Pears 2.40/kg" --section "prices.pdf · trang 3" --vi "Lê giá 2,40 mỗi kg."
|
|
82
|
+
# link cho người đọc : http://127.0.0.1:8123/c.html?id=price
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Yêu cầu
|
|
86
|
+
|
|
87
|
+
- Python 3.9+ (không cần thư viện Python nào khác; phần chạy trên trình duyệt đã đóng gói sẵn).
|
|
88
|
+
- Chrome, và Claude Code có MCP server **chrome-devtools**; cầm tay chỉ việc dùng chung cổng DevTools đó
|
|
89
|
+
(mặc định `http://127.0.0.1:9222`).
|
|
90
|
+
- Hook và từ khoá: Claude Code.
|
|
91
|
+
- Nguồn phải đăng nhập (email, chat…): đăng nhập sẵn trên chính Chrome mà chrome-devtools điều khiển.
|
|
92
|
+
- Linux hoặc macOS.
|
|
93
|
+
|
|
94
|
+
## Giấy phép
|
|
95
|
+
|
|
96
|
+
MIT. Các thư viện trình duyệt đi kèm và giấy phép của chúng nằm trong `THIRD_PARTY_NOTICES.md`.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# suken-cite-guide
|
|
2
|
+
|
|
3
|
+
Giúp một LLM agent (như Claude Code) **giải thích có bằng chứng** và **cầm tay chỉ việc** cho người dùng.
|
|
4
|
+
Mỗi khẳng định kèm ảnh chụp nguồn khoanh đỏ đoạn trích và một dòng dịch; mỗi việc cần làm trên trình duyệt
|
|
5
|
+
thì agent vẽ vòng đỏ ngay trên màn hình để người dùng tự bấm. Gói có 5 chế độ, người dùng gõ từ khoá trong
|
|
6
|
+
chat để bật đúng chế độ cần:
|
|
7
|
+
|
|
8
|
+
| Từ khoá | Chế độ | Người đọc nhận |
|
|
9
|
+
| --- | --- | --- |
|
|
10
|
+
| `suken-Story` | cốt truyện giải thích | **một link** tuyến truyện vẽ trên khung UI (trục thời gian, chuỗi nhân quả, so sánh, so số liệu, mâu thuẫn, chỗ hổng…), đi từng bước bằng ◀ ▶, ô nào cũng có 📷 mở ảnh nguồn |
|
|
11
|
+
| `suken-Cite` | trích dẫn đơn lẻ | câu trả lời ngắn, mỗi ý kèm một link ảnh nguồn khoanh đỏ |
|
|
12
|
+
| `suken-CodeStory` | cốt truyện code | một flow qua nhiều module kể thành tuyến truyện, mỗi bước một thẻ giải thích code |
|
|
13
|
+
| `suken-Code` | thẻ code | một thẻ gom vị trí trong flow, class, hàm, thư viện, biến và giá trị thật lúc chạy, bằng màu, icon, sơ đồ |
|
|
14
|
+
| `suken-Guide` / `suken-non_Guide` | cầm tay chỉ việc | vòng đỏ, mũi tên, 📋 dán, ⏎, 🔗 vẽ trên chính tab của mình; tự bấm từng bước, bấm sai thì bị chặn |
|
|
15
|
+
|
|
16
|
+
Nguồn có thể là trang web (kể cả email, chat phải đăng nhập), PDF, Word, Excel, PowerPoint, CSV, ảnh, file
|
|
17
|
+
code và file chữ (mở trong VS Code chạy trên trình duyệt).
|
|
18
|
+
|
|
19
|
+
## Dùng thế nào
|
|
20
|
+
|
|
21
|
+
Cài gói, rồi cài hook một lần trong thư mục mở Claude Code:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pip install suken-cite-guide
|
|
25
|
+
suken-cite-guide setup # cài hook, 2 reviewer, code-server; kiểm chrome-devtools
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Từ đó, gõ từ khoá kèm yêu cầu trong chat, ví dụ `suken-Story vì sao run B chậm hơn run A?`. Hook đưa
|
|
29
|
+
nguyên hướng dẫn của chế độ đó cho agent ngay trong lượt chat, agent không phải tự nhớ đọc. Riêng
|
|
30
|
+
`suken-Guide` giữ tới khi gõ `suken-non_Guide`: trong lúc bật, hook chặn agent tự bấm, gõ, mở, đóng tab
|
|
31
|
+
trên trình duyệt, chỉ người dùng tắt được.
|
|
32
|
+
|
|
33
|
+
Không dùng hook (agent khác Claude Code): bảo agent chạy `suken-cite-guide usage` để chọn chế độ và đọc
|
|
34
|
+
hướng dẫn. Mỗi hướng dẫn cùng một khung: luật vàng, checklist, review; agent chỉ giao kết quả khi reviewer
|
|
35
|
+
chấm **ĐẠT**.
|
|
36
|
+
|
|
37
|
+
## Các lệnh
|
|
38
|
+
|
|
39
|
+
| Lệnh | Làm gì |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `suken-cite-guide setup [--remove]` | cài hook cho 5 từ khoá (`.claude/settings.local.json`, giữ nguyên hook khác), 2 subagent reviewer (`.claude/agents/`), code-server (~220 MB vào cache); kiểm MCP chrome-devtools và cổng Chrome DevTools rồi báo thiếu gì. `--remove` gỡ hook và reviewer |
|
|
42
|
+
| `suken-cite-guide usage [story\|cite\|codestory\|code\|guide\|renderer]` | in hướng dẫn của một chế độ (không kèm: in danh sách chế độ) |
|
|
43
|
+
| `suken-cite-guide init --dir ./cites` | tạo thư mục dự án trích dẫn |
|
|
44
|
+
| `suken-cite-guide serve --dir ./cites` | bật server xem ảnh, xem file (mặc định cổng 8123); `render/pdf.html?file=…&page=` và `render/open.html?file=…` mở thẳng PDF, Word, Excel, PowerPoint, CSV |
|
|
45
|
+
| `suken-cite-guide text --file … \| --doc …` | in chữ của nguồn (pdf, docx, xlsx, pptx) để đọc nhanh trước khi chụp |
|
|
46
|
+
| `suken-cite-guide add …` | thêm trích dẫn: ảnh chụp `--image` + `--box`, hoặc thẻ code `--explain <json>` — thiếu mục nào thì từ chối và nói rõ |
|
|
47
|
+
| `suken-cite-guide skeleton --file … --lines …` | thẻ code: in khung JSON điền sẵn class, hàm, biến của các dòng code (Python) |
|
|
48
|
+
| `suken-cite-guide story --template timeline\|argument` | in khung truyện; điền xong thì `story --id … --json …` kiểm và lưu |
|
|
49
|
+
| `suken-cite-guide editor --folder …` | mở VS Code chạy trên trình duyệt (code-server); lần đầu tự tải ~220 MB vào cache |
|
|
50
|
+
| `suken-cite-guide guide template` | in khung kịch bản cầm tay chỉ việc |
|
|
51
|
+
| `suken-cite-guide guide run <kịch bản\|->` | kiểm kịch bản rồi vẽ vòng đỏ trên tab người dùng; mỗi lần cần agent (xong, lạc, bấm sai, tunnel…) in một dòng JSON kèm ảnh tab và tóm tắt trang |
|
|
52
|
+
| `suken-cite-guide guide reattach [địa chỉ]` | gắn bộ điều khiển đang chạy vào kết nối Chrome mới (sau khi người dùng mở lại tunnel) |
|
|
53
|
+
| `suken-cite-guide register`, `snapshot`, `urls` | ghi nguồn gốc file; lưu bản sao trang web (cách cũ); in link |
|
|
54
|
+
| `suken-cite-guide check` | kiểm mọi trích dẫn và mọi truyện |
|
|
55
|
+
|
|
56
|
+
Ví dụ một trích dẫn:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
suken-cite-guide init --dir ./cites
|
|
60
|
+
suken-cite-guide serve --dir ./cites &
|
|
61
|
+
# agent mở nguồn trên Chrome, chụp màn hình vào ./cites/shots/price.png, rồi chỉ vùng cần khoanh:
|
|
62
|
+
suken-cite-guide add --dir ./cites --id price --image ./cites/shots/price.png --box 120,340,860,372 \
|
|
63
|
+
--quote "Pears 2.40/kg" --section "prices.pdf · trang 3" --vi "Lê giá 2,40 mỗi kg."
|
|
64
|
+
# link cho người đọc : http://127.0.0.1:8123/c.html?id=price
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Yêu cầu
|
|
68
|
+
|
|
69
|
+
- Python 3.9+ (không cần thư viện Python nào khác; phần chạy trên trình duyệt đã đóng gói sẵn).
|
|
70
|
+
- Chrome, và Claude Code có MCP server **chrome-devtools**; cầm tay chỉ việc dùng chung cổng DevTools đó
|
|
71
|
+
(mặc định `http://127.0.0.1:9222`).
|
|
72
|
+
- Hook và từ khoá: Claude Code.
|
|
73
|
+
- Nguồn phải đăng nhập (email, chat…): đăng nhập sẵn trên chính Chrome mà chrome-devtools điều khiển.
|
|
74
|
+
- Linux hoặc macOS.
|
|
75
|
+
|
|
76
|
+
## Giấy phép
|
|
77
|
+
|
|
78
|
+
MIT. Các thư viện trình duyệt đi kèm và giấy phép của chúng nằm trong `THIRD_PARTY_NOTICES.md`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
`suken-cite-guide` ships pre-built browser bundles (`src/suken_cite_guide/static/dist/`) that include the
|
|
4
|
+
following open-source libraries. License headers kept by the bundler are in `dist/*.LEGAL.txt`.
|
|
5
|
+
|
|
6
|
+
| Library | Version | License | Source |
|
|
7
|
+
| --- | --- | --- | --- |
|
|
8
|
+
| @recogito/text-annotator | 4.3.7 | BSD-3-Clause | https://github.com/recogito/text-annotator-js |
|
|
9
|
+
| pdfjs-dist (PDF.js) | 6.4.299 | Apache-2.0 | https://github.com/mozilla/pdf.js |
|
|
10
|
+
| docx-preview | 0.4.1 | Apache-2.0 | https://github.com/VolodymyrBaydalka/docxjs |
|
|
11
|
+
| @silurus/ooxml (xlsx, pptx viewer) | 0.88.0 | MIT | https://github.com/yukiyokotani/office-open-xml-viewer |
|
|
12
|
+
| JSZip (used by docx-preview) | 3.10.2 | MIT (dual MIT / GPL-3.0; used under MIT) | https://github.com/Stuk/jszip |
|
|
13
|
+
| highlight.js | 11.12.0 | BSD-3-Clause | https://github.com/highlightjs/highlight.js |
|
|
14
|
+
|
|
15
|
+
## Not distributed
|
|
16
|
+
|
|
17
|
+
`suken-cite-guide snapshot` downloads **SingleFile CLI** (AGPL-3.0,
|
|
18
|
+
https://github.com/gildas-lormeau/single-file-cli) from its GitHub releases into your user cache the
|
|
19
|
+
first time you run it. It is run as a separate program and is not included in this package.
|
|
20
|
+
|
|
21
|
+
`suken-cite-guide editor` downloads **code-server** (MIT, https://github.com/coder/code-server) from its GitHub
|
|
22
|
+
releases into your user cache the first time you run it, and checks its SHA-256. It is run as a separate
|
|
23
|
+
program and is not included in this package.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "suken-cite-guide"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Giải thích có bằng chứng (ảnh nguồn khoanh đỏ kèm dòng dịch, tuyến truyện trên khung UI, thẻ giải thích code) và cầm tay chỉ việc trên trình duyệt; 5 chế độ bật bằng từ khoá qua hook Claude Code."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.9"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE", "THIRD_PARTY_NOTICES.md"]
|
|
13
|
+
authors = [{ name = "suken" }]
|
|
14
|
+
keywords = ["citation", "screenshot", "highlight", "annotation", "llm", "claude-code"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Programming Language :: Python :: 3",
|
|
17
|
+
"Operating System :: POSIX :: Linux",
|
|
18
|
+
"Operating System :: MacOS",
|
|
19
|
+
"Environment :: Console",
|
|
20
|
+
"Topic :: Text Processing",
|
|
21
|
+
]
|
|
22
|
+
dependencies = []
|
|
23
|
+
|
|
24
|
+
[project.scripts]
|
|
25
|
+
suken-cite-guide = "suken_cite_guide.cli:main"
|
|
26
|
+
|
|
27
|
+
[tool.setuptools.packages.find]
|
|
28
|
+
where = ["src"]
|
|
29
|
+
|
|
30
|
+
[tool.setuptools.package-data]
|
|
31
|
+
suken_cite_guide = ["STORY.md", "CITE.md", "CODESTORY.md", "CODE.md", "GUIDE.md", "RENDERER.md", "agents/*.md", "static/*", "static/**/*"]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# suken-cite-guide — chế độ trích dẫn đơn lẻ (suken-Cite)
|
|
2
|
+
|
|
3
|
+
**Việc của bạn:** user hỏi một câu. Bạn trả lời **ngắn bằng chữ**, mỗi ý quan trọng kèm **một link trích
|
|
4
|
+
dẫn**: ảnh chụp đúng chỗ trong nguồn, đoạn trích khoanh đỏ, kèm một dòng dịch. Không dựng tuyến truyện.
|
|
5
|
+
|
|
6
|
+
> ⚠️ User cần hiểu cả một chuỗi sự việc hay lập luận nhiều bước thì đó là chế độ cốt truyện:
|
|
7
|
+
> `suken-cite-guide usage story`. Câu hỏi về code: `suken-cite-guide usage code`.
|
|
8
|
+
|
|
9
|
+
## Luật vàng — không bao giờ được phá
|
|
10
|
+
|
|
11
|
+
1. **Một khẳng định, một trích dẫn.** Câu nào nói điều nguồn khẳng định thì kèm link trích dẫn ngay sau.
|
|
12
|
+
Không có nguồn thì nói thẳng là nguồn không nói, không lấp bằng suy luận.
|
|
13
|
+
2. **Khoanh đúng đoạn nói lên điều đó.** Đoạn trích phải nói đúng điều câu trả lời khẳng định, không mạnh
|
|
14
|
+
hơn.
|
|
15
|
+
3. **Ít trích dẫn.** Mỗi trích dẫn chỉ khoanh đoạn user cần để tự kiểm câu trả lời.
|
|
16
|
+
4. **Xong khi:** `suken-cite-guide check --dir ./cites` báo `OK` cho mọi trích dẫn bạn đưa user.
|
|
17
|
+
|
|
18
|
+
## Quy trình — chép checklist này vào câu trả lời và đánh dấu dần
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
- [ ] 1. Chuẩn bị: init, serve
|
|
22
|
+
- [ ] 2. Đọc nguồn, chọn những đoạn cần trích
|
|
23
|
+
- [ ] 3. Mỗi đoạn: mở nguồn, chụp, thêm trích dẫn
|
|
24
|
+
- [ ] 4. Chạy suken-cite-guide check --dir ./cites
|
|
25
|
+
- [ ] 5. Trả lời: vài câu ngắn, mỗi ý kèm link cho người đọc
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**1. Chuẩn bị** (đứng ở thư mục mà user mở Claude Code):
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
suken-cite-guide init --dir ./cites
|
|
32
|
+
nohup suken-cite-guide serve --dir ./cites > ./cites/server.log 2>&1 &
|
|
33
|
+
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8123/c.html # phải ra 200
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Cổng 8123 đã bị dùng thì chọn cổng khác, và truyền cùng `--port` cho `serve` và `add`.
|
|
37
|
+
|
|
38
|
+
**2. Đọc nguồn** (trang web: mở bằng chrome-devtools; file: `suken-cite-guide text --file <file>` đọc nhanh
|
|
39
|
+
chữ của pdf, docx, xlsx, pptx).
|
|
40
|
+
|
|
41
|
+
## Trích dẫn
|
|
42
|
+
|
|
43
|
+
Mọi nguồn đi chung một đường: **mở → chụp màn hình → chỉ vùng khoanh**.
|
|
44
|
+
|
|
45
|
+
1. **Mở nguồn** bằng chrome-devtools `new_page` (nhớ `pageId`):
|
|
46
|
+
- Trang web, email, chat (kể cả phải đăng nhập): mở link thật. Bấm mở rộng, cuộn tới khi đoạn cần
|
|
47
|
+
trích nằm trong màn hình.
|
|
48
|
+
- Code, file chữ (`.py`, `.md`, `.txt`, `.log`…): mở trong code-server
|
|
49
|
+
(`nohup suken-cite-guide editor --folder <thư mục user mở trong IDE> > ./cites/editor.log 2>&1 &`, rồi
|
|
50
|
+
`http://127.0.0.1:8125/?folder=<thư mục đó>`), cuộn tới đúng dòng. code-server dùng chung giữa các phiên: `curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8125/healthz` ra 200 thì dùng luôn, không bật thêm.
|
|
51
|
+
- File trên máy: chép vào `./cites/sources/`. PDF, ảnh mở thẳng `http://127.0.0.1:8123/sources/<file>`;
|
|
52
|
+
Word, Excel, PowerPoint, CSV mở `http://127.0.0.1:8123/render/open.html?file=sources/<file>` (thêm
|
|
53
|
+
`&slide=7`, `&sheet=Phase 1&cell=B14` hoặc `&row=9`).
|
|
54
|
+
- Luôn mở **đúng file gốc** user đưa, cấm tự đổi định dạng (xlsx → csv, pptx → pdf…). Tắt Chrome tự
|
|
55
|
+
dịch và Dark Reader nếu chúng đang đổi trang.
|
|
56
|
+
2. **Chụp** `take_screenshot` (màn hình thường, không `fullPage`) với `filePath` là
|
|
57
|
+
`./cites/shots/<id>.png`, rồi `close_page` đúng `pageId` của bạn. Lấy kích thước ảnh:
|
|
58
|
+
`file ./cites/shots/<id>.png` (in ra `W x H`). Nhìn ảnh, tìm đoạn cần trích, ghi vùng bao quanh nó
|
|
59
|
+
`x0,y0,x1,y1` theo pixel của ảnh gốc, trong khoảng 0–W, 0–H. Ảnh hiển thị bị thu nhỏ thì đổi:
|
|
60
|
+
`x_gốc = x_hiển_thị × W ÷ rộng_hiển_thị`, `y_gốc = y_hiển_thị × H ÷ cao_hiển_thị`.
|
|
61
|
+
3. **Thêm:**
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
suken-cite-guide add --dir ./cites --id <id> --image ./cites/shots/<id>.png --box x0,y0,x1,y1 \
|
|
65
|
+
--quote "<chữ trong vùng khoanh, nguyên văn>" --section "<nguồn · vị trí>" --vi "<dòng dịch>" \
|
|
66
|
+
--source-url "<link gốc, nếu có>"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`--vi`: 1–2 câu tiếng Việt, bản dịch, kèm lý do đoạn này quan trọng nếu cần. `add` in ra
|
|
70
|
+
`link cho người đọc` — đó là link đưa user. `add` với một id đã có thì trích dẫn cũ bị thay.
|
|
71
|
+
|
|
72
|
+
## Gỡ lỗi
|
|
73
|
+
|
|
74
|
+
| Triệu chứng | Cách sửa |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `c.html` báo trích dẫn không tồn tại | sai id, hoặc server đang phục vụ `--dir` khác |
|
|
77
|
+
| `add` báo `--box` nằm ngoài ảnh | toạ độ phải trong 0–W, 0–H của ảnh gốc (`file <ảnh>` in ra `W x H`) |
|
|
78
|
+
| code-server không mở được | xem `./cites/editor.log`; cổng 8125 bận thì `editor --port` khác |
|
|
79
|
+
| Người đọc gặp lỗi kết nối | server đã tắt, hoặc cổng chưa được chuyển tiếp về máy người đọc |
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# suken-cite-guide — chế độ thẻ code (suken-Code)
|
|
2
|
+
|
|
3
|
+
Bạn trả lời bằng **thẻ giải thích code**: một trang ảnh gom 6 mục (vị trí trong flow, class, hàm, thư
|
|
4
|
+
viện, biến, giá trị thật lúc chạy) bằng màu, icon, sơ đồ. **Chi tiết nằm trong thẻ, không nằm trong chữ.**
|
|
5
|
+
|
|
6
|
+
> ⚠️ Ở đây chỉ giao **1 thẻ = 1 link**. Trả lời = link thẻ + 1 câu. User hỏi **một flow qua nhiều module /
|
|
7
|
+
> nhiều nút trong sơ đồ flow** thì đó là chế độ cốt truyện code: `suken-cite-guide usage codestory`.
|
|
8
|
+
|
|
9
|
+
## Chọn loại thẻ
|
|
10
|
+
|
|
11
|
+
| Loại thẻ | Khi nào |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| **Thẻ đơn** (mặc định) | Hàm được gọi vẽ thành **hộp đen** (nhận gì, làm gì, trả gì). Không có `steps`, `calls`, `defs` |
|
|
14
|
+
| **Thẻ nhiều đoạn** | User chỉ ra nhiều đoạn, hoặc không mở hàm được gọi thì không hiểu được → thêm `steps`, tối đa 4 đoạn. Vẫn **1 link**, user tự tua ◀ ▶ (mục *Thẻ nhiều đoạn*) |
|
|
15
|
+
|
|
16
|
+
## ⛔ CẤM
|
|
17
|
+
|
|
18
|
+
1. **Cấm ảnh code thường** (kể cả ảnh chụp code-server) và **cấm trích trang web, tài liệu thư viện**. Chỉ dùng thẻ `code-explain`.
|
|
19
|
+
2. **Cấm vượt phạm vi câu hỏi:** không lần sang module/backend/framework mà câu hỏi không cần.
|
|
20
|
+
3. **Cấm bịa giá trị.** Không ghi `value` (giá trị thật lúc chạy) nếu chưa thấy trong log hoặc chưa chạy lại
|
|
21
|
+
bằng lệnh chỉ đọc (không ghi file, không gọi dịch vụ ngoài); không có thì để `""`. `output` là hàm trả về
|
|
22
|
+
gì, dạng chữ: luôn điền.
|
|
23
|
+
|
|
24
|
+
## Quy trình
|
|
25
|
+
|
|
26
|
+
Đứng ở thư mục mà user mở Claude Code.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
- [ ] 1. Chọn loại thẻ (bảng trên)
|
|
30
|
+
- [ ] 2. suken-cite-guide init --dir ./cites
|
|
31
|
+
nohup suken-cite-guide serve --dir ./cites > ./cites/server.log 2>&1 &
|
|
32
|
+
- [ ] 3. suken-cite-guide skeleton --file <file> --lines <a-b> > <id>.json ← khung điền sẵn class, hàm, tham số, biến
|
|
33
|
+
Chỉ dựng được khung cho file .py. File khác: dừng và báo user rằng thẻ code chưa hỗ trợ ngôn ngữ đó.
|
|
34
|
+
- [ ] 4. Điền các ô trong <id>.json (mục Điền khung)
|
|
35
|
+
- [ ] 5. suken-cite-guide add --dir ./cites --id <id> --file <file> --explain <id>.json --section "…" --vi "<1 câu>"
|
|
36
|
+
add báo thiếu gì → điền tiếp → chạy lại, tới khi lưu được
|
|
37
|
+
- [ ] 6. Chụp thẻ: new_page tới dòng "trang cần chụp" mà add in ra (nhớ pageId), take_screenshot với filePath là dòng
|
|
38
|
+
"lưu ảnh vào", rồi close_page đúng pageId. Nhìn ảnh: sai vòng khoanh hay nhãn → sửa <id>.json, add lại, chụp lại
|
|
39
|
+
- [ ] 7. Gọi subagent suken-guide-code-review (đưa: câu hỏi gốc, link thẻ sẽ đưa user, loại thẻ, ./cites, nguồn của giá trị lúc chạy) → sửa tới khi ĐẠT
|
|
40
|
+
- [ ] 8. Đưa user đúng dòng `link cho người đọc` mà add in ra
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Cổng 8123 bận thì dùng cổng khác, truyền cùng `--port` cho `serve` và `add`.
|
|
44
|
+
|
|
45
|
+
## Điền khung
|
|
46
|
+
|
|
47
|
+
**Thuật ngữ:** *vòng khoanh* là các dòng được hỏi (`focus` của thẻ đơn, `lines` của từng đoạn). `show` là các
|
|
48
|
+
dòng hiện thêm quanh vòng khoanh để xem. Chữ = từ tách bởi khoảng trắng.
|
|
49
|
+
**Biểu tượng trên thẻ:** 🏛 class có hàm · 📋 class dữ liệu (dataclass, NamedTuple, model DB) · 📦 hàm/class thư viện.
|
|
50
|
+
|
|
51
|
+
Sau `skeleton`, điền các ô sau; ô không nhắc tới thì giữ nguyên.
|
|
52
|
+
|
|
53
|
+
| Ô | Điền gì |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| `question` | câu người mới chắc chắn sẽ hỏi về vòng khoanh (thường là *vì sao đoạn này đúng / làm được việc đó*). **Chỉ để bạn tự biết phải trả lời gì, không hiện trên thẻ** |
|
|
56
|
+
| nhãn `"answer": true` | câu trả lời cho `question`, gắn vào **chữ then chốt** trong vòng khoanh, `from` trỏ tới dòng chứa lời giải (vd `rev-parse` → `↖ main = dòng 35`). Chữ then chốt nằm trong chuỗi (lệnh git/shell, SQL) thì tự thêm nhãn, `kind: "library"` |
|
|
57
|
+
| `kind: "unknown"` | đổi thành `function` (hàm của dự án — thêm hộp vào `machine`) hoặc `library` |
|
|
58
|
+
| `label` của nhãn | làm gì, 2–4 chữ (tối đa 6). **Hàm/class thư viện (📦): nói rõ vai trò bằng chính tên những thứ đã có trên thẻ**, tối đa 14 chữ — vd `gói câu hỏi + câu trả lời + đáp án thành 1 ca chấm`, không phải `gói 3 thứ để chấm` |
|
|
59
|
+
| `from` | tạo ra ở đâu (khung đã gợi ý) |
|
|
60
|
+
| `inputs[].label` | giá trị truyền vào là một biến chưa có nhãn (vd `r`) → ghi nó là gì (vd `1 hàng CSV`) |
|
|
61
|
+
| `machine[]` (hộp hàm) | `does`: làm gì, vài chữ. `output`: **bắt buộc**, hàm trả về gì, dạng chữ (vd `danh sách câu hỏi`). `value`: giá trị thật lúc chạy, không có thì `""` |
|
|
62
|
+
| `machine[].owner` | khung tự điền khi hàm là hàm của một class → hộp hàm được lồng vào hộp class đó. Hàm thư viện không có hộp |
|
|
63
|
+
| `machine[].then` | kết quả hàm được dùng tiếp ngay (vd `.close()`): `{name, does}` |
|
|
64
|
+
| `classBox` class có hàm (🏛) | `does` + `does` của từng hàm; hàm được gọi trong vòng khoanh thì thêm `"called": true` |
|
|
65
|
+
| `classBox` class dữ liệu (📋) | `does` + `does` của từng trường trong `fields` |
|
|
66
|
+
| `classBox` `guess` | mục đích class là bạn suy ra, không từ docstring → `"guess": true` (thẻ hiện "≈ suy ra từ code") |
|
|
67
|
+
| `map` | sơ đồ flow của dự án (README, docs, specs…): `{"label": "…", "nodes": ["…"], "here": <số thứ tự nút đang ở, từ 0>}`. Không tìm thấy → **hỏi user**; user xác nhận không có → `"map": "không có"` |
|
|
68
|
+
|
|
69
|
+
Khung chỉ có các dòng được hỏi; muốn hiện thêm dòng xung quanh thì mở rộng `show` (dòng thêm chỉ để xem,
|
|
70
|
+
**không gắn nhãn** — nhãn chỉ nằm trong vòng khoanh).
|
|
71
|
+
|
|
72
|
+
## Thẻ nhiều đoạn
|
|
73
|
+
|
|
74
|
+
Chạy `skeleton` cho từng đoạn rồi gộp vào một file. Thêm `show` gồm mọi đoạn, `defs` = các đoạn định
|
|
75
|
+
nghĩa hàm được mở, `machine` lồng bằng `calls` (A gọi B), và `steps` (mỗi phần tử là một đoạn):
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
"steps": [
|
|
79
|
+
{ "label": "dòng 51–52 · trong main", "lines": [[51, 52]], "lit": ["0"], "question": "…" },
|
|
80
|
+
{ "label": "dòng 17–19 · trong A", "lines": [[17, 19]], "lit": ["1", "0:head", "0:out"], "question": "…" }
|
|
81
|
+
]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Mỗi đoạn một `question` và một nhãn `answer` trong dòng của đoạn đó. `lit` = phần sơ đồ được sáng: `"1"`
|
|
85
|
+
cả hộp cấp 1; `"1:in"`, `"1:head"`, `"1:out"` từng phần (cấp 0 = hộp ngoài cùng). Muốn tự nhìn từng
|
|
86
|
+
đoạn thì mở `trang cần chụp` thêm `&step=N`.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# suken-cite-guide — chế độ cốt truyện code (suken-CodeStory)
|
|
2
|
+
|
|
3
|
+
Bạn trả lời một câu hỏi về **flow qua nhiều module / nhiều nút trong sơ đồ flow** bằng **tuyến truyện trên
|
|
4
|
+
khung UI**. Mỗi bước truyện = 1 nút flow = 1 `headline` + 1 **thẻ giải thích code** (một trang ảnh gom 6
|
|
5
|
+
mục: vị trí trong flow, class, hàm, thư viện, biến, giá trị thật lúc chạy). **Chi tiết nằm trong thẻ, không
|
|
6
|
+
nằm trong chữ.** Khi chọn dòng code cho mỗi thẻ: giá trị nào được dùng cũng phải thấy nó từ đâu ra, trong cùng
|
|
7
|
+
vòng khoanh hoặc ở bước trước.
|
|
8
|
+
|
|
9
|
+
> ⚠️ User chỉ hỏi **vài dòng code** thì đó là chế độ thẻ code: `suken-cite-guide usage code`.
|
|
10
|
+
|
|
11
|
+
## Chọn loại thẻ cho mỗi bước truyện
|
|
12
|
+
|
|
13
|
+
| Loại thẻ | Khi nào |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| **Thẻ đơn** (mặc định) | Hàm được gọi vẽ thành **hộp đen** (nhận gì, làm gì, trả gì). Không có `steps`, `calls`, `defs` |
|
|
16
|
+
| **Thẻ nhiều đoạn** | Trong bước đó cần xem nhiều đoạn, hoặc không mở hàm được gọi thì không hiểu được → thêm `steps`, tối đa 4 đoạn; người đọc tua ◀ ▶ trong thẻ (mục *Thẻ nhiều đoạn*) |
|
|
17
|
+
|
|
18
|
+
## ⛔ CẤM
|
|
19
|
+
|
|
20
|
+
1. **Cấm ảnh code thường** (kể cả ảnh chụp code-server) và **cấm trích trang web, tài liệu thư viện**. Chỉ dùng thẻ `code-explain`.
|
|
21
|
+
2. **Cấm vượt phạm vi câu hỏi:** không lần sang module/backend/framework mà câu hỏi không cần.
|
|
22
|
+
3. **Cấm bịa giá trị.** Không ghi `value` (giá trị thật lúc chạy) nếu chưa thấy trong log hoặc chưa chạy lại
|
|
23
|
+
bằng lệnh chỉ đọc (không ghi file, không gọi dịch vụ ngoài); không có thì để `""`. `output` là hàm trả về
|
|
24
|
+
gì, dạng chữ: luôn điền.
|
|
25
|
+
|
|
26
|
+
## Quy trình
|
|
27
|
+
|
|
28
|
+
Đứng ở thư mục mà user mở Claude Code.
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
- [ ] 1. Chọn các nút flow (mỗi nút 1 bước truyện) + loại thẻ cho mỗi bước (bảng trên)
|
|
32
|
+
- [ ] 2. suken-cite-guide init --dir ./cites
|
|
33
|
+
nohup suken-cite-guide serve --dir ./cites > ./cites/server.log 2>&1 &
|
|
34
|
+
- [ ] 3. Với từng thẻ, làm 3a–3d:
|
|
35
|
+
3a. suken-cite-guide skeleton --file <file> --lines <a-b> > <id>.json ← khung điền sẵn class, hàm, tham số, biến
|
|
36
|
+
Chỉ dựng được khung cho file .py. File khác: dừng và báo user rằng thẻ code chưa hỗ trợ ngôn ngữ đó.
|
|
37
|
+
3b. Điền các ô trong <id>.json (mục Điền khung)
|
|
38
|
+
3c. suken-cite-guide add --dir ./cites --id <id> --file <file> --explain <id>.json --section "…" --vi "<1 câu>"
|
|
39
|
+
add báo thiếu gì → điền tiếp → chạy lại, tới khi lưu được
|
|
40
|
+
3d. Chụp thẻ: new_page tới dòng "trang cần chụp" mà add in ra (nhớ pageId), take_screenshot với filePath là dòng
|
|
41
|
+
"lưu ảnh vào", rồi close_page đúng pageId. Nhìn ảnh: sai vòng khoanh hay nhãn → sửa, add lại, chụp lại
|
|
42
|
+
- [ ] 4. Điền khung truyện, chạy suken-cite-guide story tới khi lưu được (mục Tuyến truyện)
|
|
43
|
+
- [ ] 5. Gọi subagent suken-guide-code-review (đưa: câu hỏi gốc, link của mọi thẻ, id truyện, loại thẻ, ./cites, nguồn của giá trị lúc chạy) → sửa tới khi ĐẠT
|
|
44
|
+
- [ ] 6. Đưa user đúng dòng `link cho người đọc` mà story in ra
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Cổng 8123 bận thì dùng cổng khác, truyền cùng `--port` cho `serve`, `add` và `story`.
|
|
48
|
+
|
|
49
|
+
## Điền khung
|
|
50
|
+
|
|
51
|
+
**Thuật ngữ:** *vòng khoanh* là các dòng được hỏi (`focus` của thẻ đơn, `lines` của từng đoạn). `show` là các
|
|
52
|
+
dòng hiện thêm quanh vòng khoanh để xem. Chữ = từ tách bởi khoảng trắng.
|
|
53
|
+
**Biểu tượng trên thẻ:** 🏛 class có hàm · 📋 class dữ liệu (dataclass, NamedTuple, model DB) · 📦 hàm/class thư viện.
|
|
54
|
+
|
|
55
|
+
Sau `skeleton`, điền các ô sau; ô không nhắc tới thì giữ nguyên.
|
|
56
|
+
|
|
57
|
+
| Ô | Điền gì |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| `question` | câu người mới chắc chắn sẽ hỏi về vòng khoanh (thường là *vì sao đoạn này đúng / làm được việc đó*). **Chỉ để bạn tự biết phải trả lời gì, không hiện trên thẻ** |
|
|
60
|
+
| nhãn `"answer": true` | câu trả lời cho `question`, gắn vào **chữ then chốt** trong vòng khoanh, `from` trỏ tới dòng chứa lời giải (vd `rev-parse` → `↖ main = dòng 35`). Chữ then chốt nằm trong chuỗi (lệnh git/shell, SQL) thì tự thêm nhãn, `kind: "library"` |
|
|
61
|
+
| `kind: "unknown"` | đổi thành `function` (hàm của dự án — thêm hộp vào `machine`) hoặc `library` |
|
|
62
|
+
| `label` của nhãn | làm gì, 2–4 chữ (tối đa 6). **Hàm/class thư viện (📦): nói rõ vai trò bằng chính tên những thứ đã có trên thẻ**, tối đa 14 chữ — vd `gói câu hỏi + câu trả lời + đáp án thành 1 ca chấm`, không phải `gói 3 thứ để chấm` |
|
|
63
|
+
| `from` | tạo ra ở đâu (khung đã gợi ý) |
|
|
64
|
+
| `inputs[].label` | giá trị truyền vào là một biến chưa có nhãn (vd `r`) → ghi nó là gì (vd `1 hàng CSV`) |
|
|
65
|
+
| `machine[]` (hộp hàm) | `does`: làm gì, vài chữ. `output`: **bắt buộc**, hàm trả về gì, dạng chữ (vd `danh sách câu hỏi`). `value`: giá trị thật lúc chạy, không có thì `""` |
|
|
66
|
+
| `machine[].owner` | khung tự điền khi hàm là hàm của một class → hộp hàm được lồng vào hộp class đó. Hàm thư viện không có hộp |
|
|
67
|
+
| `machine[].then` | kết quả hàm được dùng tiếp ngay (vd `.close()`): `{name, does}` |
|
|
68
|
+
| `classBox` class có hàm (🏛) | `does` + `does` của từng hàm; hàm được gọi trong vòng khoanh thì thêm `"called": true` |
|
|
69
|
+
| `classBox` class dữ liệu (📋) | `does` + `does` của từng trường trong `fields` |
|
|
70
|
+
| `classBox` `guess` | mục đích class là bạn suy ra, không từ docstring → `"guess": true` (thẻ hiện "≈ suy ra từ code") |
|
|
71
|
+
| `map` | sơ đồ flow của dự án (README, docs, specs…): `{"label": "…", "nodes": ["…"], "here": <số thứ tự nút đang ở, từ 0>}`. Không tìm thấy → **hỏi user**; user xác nhận không có → `"map": "không có"` |
|
|
72
|
+
|
|
73
|
+
Khung chỉ có các dòng được hỏi; muốn hiện thêm dòng xung quanh thì mở rộng `show` (dòng thêm chỉ để xem,
|
|
74
|
+
**không gắn nhãn** — nhãn chỉ nằm trong vòng khoanh).
|
|
75
|
+
|
|
76
|
+
## Thẻ nhiều đoạn
|
|
77
|
+
|
|
78
|
+
Chạy `skeleton` cho từng đoạn rồi gộp vào một file. Thêm `show` gồm mọi đoạn, `defs` = các đoạn định
|
|
79
|
+
nghĩa hàm được mở, `machine` lồng bằng `calls` (A gọi B), và `steps` (mỗi phần tử là một đoạn):
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
"steps": [
|
|
83
|
+
{ "label": "dòng 51–52 · trong main", "lines": [[51, 52]], "lit": ["0"], "question": "…" },
|
|
84
|
+
{ "label": "dòng 17–19 · trong A", "lines": [[17, 19]], "lit": ["1", "0:head", "0:out"], "question": "…" }
|
|
85
|
+
]
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Mỗi đoạn một `question` và một nhãn `answer` trong dòng của đoạn đó. `lit` = phần sơ đồ được sáng: `"1"`
|
|
89
|
+
cả hộp cấp 1; `"1:in"`, `"1:head"`, `"1:out"` từng phần (cấp 0 = hộp ngoài cùng). Muốn tự nhìn từng
|
|
90
|
+
đoạn thì mở `trang cần chụp` thêm `&step=N`.
|
|
91
|
+
|
|
92
|
+
## Tuyến truyện
|
|
93
|
+
|
|
94
|
+
**Xương sống:** `argument`, chuỗi nhân quả theo thứ tự code chạy. Mỗi `cite` trong khung truyện là id một thẻ.
|
|
95
|
+
Từ bước 2, `link` là chữ nối với bước trước (nên | vì | nhưng | rồi | để | vì vậy); bước 1 không có `link`.
|
|
96
|
+
|
|
97
|
+
**Mỗi bước** có `headline` (tối đa 16 chữ, một câu "vậy thì sao", không phải câu tả ảnh) và `cards`
|
|
98
|
+
(`{label ≤8 chữ, cite}`), thêm tối đa 3 khối trong `blocks` khi cần:
|
|
99
|
+
|
|
100
|
+
| Khối | Dùng khi | Điền |
|
|
101
|
+
| --- | --- | --- |
|
|
102
|
+
| `conflict` | hai nguồn nói khác | `left`/`right`: `{who ≤3 chữ, cite}`; `rows` ≥1 hàng `{left, right}`, mỗi bên ≤6 chữ |
|
|
103
|
+
| `compare` | so phương án | `columns` 2–4 tên ≤4 chữ; `rows`: `{label ≤5 chữ, cells}`, mỗi ô `text` ≤6 chữ hoặc `mark` (yes/no) |
|
|
104
|
+
| `bars` | so con số | `groups`: `{label ≤6 chữ, items}`; mỗi nhóm ≥2 `items`: `{label ≤4 chữ, value > 0, text ≤3 chữ, cite}` |
|
|
105
|
+
| `status` | chưa chốt / đang chờ / đã chốt | `items`: `{label ≤8 chữ, state: open \| wait \| done, note ≤3 chữ (tuỳ chọn), cite}` |
|
|
106
|
+
| `gap` | nguồn không nói | `text` ≤12 chữ; **khối** không có `cite`. `need` tuỳ chọn `{label ≤8 chữ, cite}`: ai cần điều đó, kèm nguồn nói vậy |
|
|
107
|
+
| `ref` | nhắc lại một bước trước | `step` (số thứ tự bước trước, từ 1), `label` ≤8 chữ, `cite` |
|
|
108
|
+
| `funnel` | lọc dần còn ít | `stages` ≥3 `{label ≤6 chữ, cite}`; `here` = số tầng đang ở, từ 1 |
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
suken-cite-guide story --template argument > story.json # khung mẫu có sẵn đủ các khối: xoá khối không dùng
|
|
112
|
+
suken-cite-guide story --dir ./cites --id <id-truyện> --json story.json
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Lệnh chỉ rõ ô nào thiếu hoặc quá dài, và chỉ lưu khi đủ; lưu xong in `link cho người đọc` — link duy
|
|
116
|
+
nhất đưa user. Truyện tối đa 20 bước.
|