Planning Content
Workflow: Detect & Convert → Interview → Research → Content Map → Outlines → Save → Adjust (nếu cần)
Nguyên tắc cốt lõi:
- Skill CHỈ làm 2 việc: (1) phân tích nội dung input, (2) xác định các ý chính cần cover trong từng bài.
- KHÔNG can thiệp cách viết, tone, style, cách sắp xếp section, mở bài, kết bài, framework viết, độ dài bài. Đó là việc của skill viết bài.
- KHÔNG viết draft câu mở bài, câu kết, hay bất kỳ phần nào của bài hoàn chỉnh.
- Outline = bản đồ ý tưởng, KHÔNG phải bản nháp.
- Mọi data point phải cite nguồn (khi có research).
- Output tiếng Việt (trừ khi user yêu cầu khác). Thuật ngữ chuyên ngành giữ nguyên gốc trong ngoặc.
Quick Reference
| Reference |
Mục đích |
Load khi |
| tier-processing.md |
Tier detection, batch, subagent, quality gate |
Phase 4 (nếu input đã convert) |
Phase 1: Detect & Convert Input
1.0 Resolve Skill Paths
Chỉ cần khi input là file hoặc URL cần convert:
- Dùng Glob tìm
**/planning-content/scripts/wa-env
- Chạy:
bash {path_to_wa-env}
- Parse output lấy:
SCRIPTS_DIR, SKILL_DIR, PROJECT_ROOT, OUTPUT_DIR, REFERENCES_DIR
Nếu không tìm thấy wa-env: dùng WebFetch cho URL, Read cho file text. Scripts không bắt buộc.
1.1 Detect Input Type
| Input Type |
Detection |
Action |
| Topic thuần |
Chỉ có chủ đề, không file/URL |
→ Phase 2 trực tiếp |
| Notes/ý tưởng rời |
Bullet points, gạch đầu dòng |
→ Phase 2 trực tiếp |
| File (PDF/DOCX/EPUB) |
Path + extension |
wa-convert {path} → content.md + structure.json |
| File (XLSX/PPTX) |
Path + extension |
wa-convert {path} (qua Docling). Kiểm tra chất lượng, xem tier-processing.md mục "Lưu ý chất lượng conversion" |
| File (HTML/AsciiDoc) |
Path + extension |
wa-convert {path} (qua Docling) |
| Image (PNG/JPEG/TIFF/BMP/WEBP) |
Path + extension |
Dùng Read tool (multimodal) để đọc ảnh trực tiếp. Nếu cần text extraction: wa-convert {path} (OCR qua Docling) |
| URL (web page) |
http:// hoặc https:// (không YouTube) |
Ưu tiên WebFetch. Dùng wa-convert {url} khi WebFetch trả nội dung rác |
| YouTube URL |
youtube.com hoặc youtu.be |
wa-convert {url} |
| Plain text / .txt / .md |
Không extension phức tạp |
Read trực tiếp, hoặc wa-paste-text nếu cần lưu vào output dir |
1.2 File/URL Conversion
# Auto-generate output dir
{SCRIPTS_DIR}/wa-convert /path/to/file.pdf
# Custom output dir
{SCRIPTS_DIR}/wa-convert /path/to/file.pdf my-project/input-handling
Output: content.md + structure.json trong output dir.
Lưu ý venv: Scripts dùng venv riêng tại {SCRIPTS_DIR}/.venv/. Nếu chưa setup, chạy bash {SCRIPTS_DIR}/setup.sh trước.
1.3 Multi-Input
Khi user đưa nhiều file/URL cùng lúc:
- Xử lý tuần tự, mỗi input tạo thư mục riêng.
- Sau khi convert xong, hỏi user: gộp thành 1 content map chung hay tách riêng từng bộ outline?
1.4 Fallback (không có scripts)
- URL: dùng
WebFetch trực tiếp
- File text (.md/.txt): dùng
Read trực tiếp
- PDF/DOCX/EPUB/XLSX/PPTX: báo user chạy
bash {SCRIPTS_DIR}/setup.sh
Error Handling
| Lỗi |
Xử lý |
| File not found |
Hỏi lại path |
| Unsupported format |
Báo user, đề xuất convert thủ công |
| URL fetch failed |
Báo lỗi, dừng |
| Empty content |
Cảnh báo, xác nhận trước khi tiếp |
| Encrypted PDF |
Hỏi bản giải mã |
| YouTube không có transcript |
Báo user, hỏi có muốn dùng WebSearch research topic thay thế không |
Phase 2: Interview
Hỏi tất cả câu hỏi trong 1 lượt:
- Audience: Người đọc chính là ai?
- Goal: Mục tiêu chính? (educate / engage / convert / thought leadership)
- Scope: Góc cụ thể nào của chủ đề? (mặc định: bao phủ toàn bộ nội dung input)
- (Optional) Số bài: User muốn bao nhiêu bài? (mặc định: tự tính)
- (Optional) Constraints: Yêu cầu đặc biệt (deadline, topic cần tránh, kênh đăng, ngôn ngữ output)
Fast-track: Nếu input đã đủ context hoặc user yêu cầu "làm luôn", giả định sensible defaults và sang Phase 3.
Edge Cases
- Input quá ngắn (1-2 câu): Hỏi user bổ sung context hoặc dùng web research mở rộng.
- Thiếu data cho 1 ý: Note "Open questions" trong outline để writer biết cần tìm thêm.
- Topic quá rộng: Yêu cầu user chọn góc cụ thể trước khi plan.
Phase 3: Research (Conditional)
Khi nào chạy
- Luôn chạy: input là topic thuần, notes/ý tưởng rời
- Chạy nếu cần: tài liệu convert nhưng nội dung mỏng, YouTube transcript ngắn/thiếu context
- Skip: tài liệu đã convert có nội dung đầy đủ (sách, report dài, tài liệu chuyên sâu)
Tiêu chí "đầy đủ": tài liệu tự cung cấp đủ data, ví dụ, evidence cho các ý chính.
Quy trình
- WebSearch 3-5 queries liên quan topic + audience + trends.
- Thu thập: data, số liệu, góc nhìn mới, ví dụ thực tế, case study.
- Bắt buộc cite nguồn cho mọi data point.
Research ở Phase 3 là tìm bổ sung (trend mới, góc nhìn khác, data gap), KHÔNG phải fetch lại nội dung đã có từ Phase 1.
Phase 4: Map Content & Generate Outlines
4.0 Tier-Aware Processing (chỉ khi input đã convert)
Nếu input đã convert (có structure.json):
- Đọc
structure.json ONLY (không đọc content.md toàn bộ). Chỉ đọc content.md theo section cụ thể khi cần chi tiết.
- Xác định tier. Chi tiết workflow, batch, subagent: xem tier-processing.md.
- Nếu structure.json lỗi: xem mục "Fallback" trong tier-processing.md.
4.1 Content Map
Cho topic thuần/notes:
- Liệt kê toàn bộ concept/ý lớn từ input + research.
- Group các ý liên quan thành cluster theo chủ đề.
- Đánh dấu ưu tiên (must-have / nice-to-have).
Cho tài liệu đã convert:
- Dùng
outline từ structure.json: section titles, word counts, critical markers.
- Group sections thành clusters theo heading hierarchy.
4.2 Generate Outlines
Tính số bài:
if user_specified_article_count:
target = user_specified_count
else:
target = max(3, round(word_count / 2500))
Ước lượng theo loại input khi không có word count:
- Topic thuần → 3-10 bài (tùy scope)
- Notes/ý tưởng rời → theo số ý tưởng có sẵn
- URL/article → 5-15 bài (tùy độ dài + density)
- Sách/tài liệu dài → chia thành batches (~10 bài/batch)
Nguyên tắc lên outline:
- 1 bài = 1 chủ đề duy nhất. Mỗi outline tập trung đúng 1 ý chính.
- Outline = liệt kê ý chính bài cần cover, KHÔNG quy định cấu trúc trình bày.
- Mỗi ý chính phải có data/ví dụ hỗ trợ. Ý không có data → đánh dấu "cần tìm thêm" hoặc loại.
- Outline phải đủ rõ để writer hiểu bài nói về cái gì mà không cần đoán.
- Cho tài liệu đã convert: đọc content.md theo section cụ thể (
offset/limit từ structure.json), KHÔNG đọc toàn bộ.
Format mỗi outline:
### Bài [N]: [Tiêu đề đề xuất]
- **Audience:** [Người đọc cụ thể của bài này]
- **Goal:** [Sau khi đọc, reader hiểu hoặc làm được gì]
- **Angle:** [Góc tiếp cận]
- **Thesis (ý cốt lõi):** [1 câu]
- **Key points cần cover:**
- [Ý chính 1] | data/ví dụ: [...] | nguồn: [...]
- [Ý chính 2] | data/ví dụ: [...] | nguồn: [...]
- [Ý chính 3] | data/ví dụ: [...] | nguồn: [...]
- **Takeaway / insight chính:** [Reader rút ra điều gì]
- **Open questions:** [Data còn thiếu. Nếu không có, ghi "Không"]
Phase 5: Save Output
Cấu trúc thư mục:
{CWD}/planning-content/{topic-slug}-{YYMMDD-HHMM}/
├── input-handling/ # Chỉ khi có convert
│ ├── content.md
│ └── structure.json
├── index.md # Overview + danh sách link
├── outline-[NN]-[slug].md # Mỗi bài 1 file
├── research.md # Nếu Phase 3 chạy
└── content-map.md # Nếu input dài hoặc nhiều concepts
index.md format:
# Content Plan: [Topic]
## Overview
- Audience: [...]
- Goal: [...]
- Tổng số bài: [N]
- Nguồn input: [URL/file/topic]
- Word count gốc: [N] (nếu có structure.json)
## Danh sách Outlines
1. [Bài 1: Tiêu đề](outline-01-slug.md)
2. [Bài 2: Tiêu đề](outline-02-slug.md)
...
## Coverage Checklist (nếu batch)
- [x] Batch 1 — 10/10
- [ ] Batch 2 — 0/10
Xử lý input dài (batch):
- Tạo content map trước, lưu vào
content-map.md.
- Batch ~10 bài/batch, làm batch đầu trước.
- Coverage check (BẮT BUỘC) sau mỗi batch: đối chiếu content map, liệt kê concept ĐÃ cover vs CHƯA cover. Lặp đến 100%.
- Cập nhật
index.md sau mỗi batch.
- Hỏi user confirm trước batch tiếp.
Cuối cùng hỏi: "Đã hoàn thành outline cho [N] bài. Bạn muốn điều chỉnh outline nào không?"
Phase 6: Adjust Outlines (nếu user yêu cầu)
| Yêu cầu |
Xử lý |
| Sửa 1 outline |
Đọc file, chỉnh theo feedback, ghi đè |
| Merge 2+ outlines |
Gộp key points, chọn thesis mới, xoá file thừa, cập nhật index.md |
| Tách 1 outline |
Chia key points thành groups, tạo file mới, cập nhật index.md |
| Thêm outline mới |
Tạo file theo format Phase 4.2, thêm vào index.md |
| Xoá outline |
Xoá file, cập nhật index.md, chạy coverage check nếu input đã convert |
| Đổi thứ tự |
Rename file numbers, cập nhật index.md |
Sau mỗi điều chỉnh, chạy coverage check (nếu input đã convert) để đảm bảo không bỏ sót.
1---2name: planning-content3description: Phân tích tài liệu nguồn (topic, notes, URL, PDF/DOCX/EPUB/YouTube) và lên outline ý chính cho từng bài.4---56# Planning Content78Workflow: Detect & Convert → Interview → Research → Content Map → Outlines → Save → Adjust (nếu cần)910**Nguyên tắc cốt lõi:**1112- Skill CHỈ làm 2 việc: (1) phân tích nội dung input, (2) xác định các ý chính cần cover trong từng bài.13- KHÔNG can thiệp cách viết, tone, style, cách sắp xếp section, mở bài, kết bài, framework viết, độ dài bài. Đó là việc của skill viết bài.14- KHÔNG viết draft câu mở bài, câu kết, hay bất kỳ phần nào của bài hoàn chỉnh.15- Outline = bản đồ ý tưởng, KHÔNG phải bản nháp.16- Mọi data point phải cite nguồn (khi có research).17- Output tiếng Việt (trừ khi user yêu cầu khác). Thuật ngữ chuyên ngành giữ nguyên gốc trong ngoặc.1819## Quick Reference2021| Reference | Mục đích | Load khi |22|---|---|---|23| [tier-processing.md](references/tier-processing.md) | Tier detection, batch, subagent, quality gate | Phase 4 (nếu input đã convert) |2425## Phase 1: Detect & Convert Input2627### 1.0 Resolve Skill Paths2829Chỉ cần khi input là file hoặc URL cần convert:30311. Dùng Glob tìm `**/planning-content/scripts/wa-env`322. Chạy: `bash {path_to_wa-env}`333. Parse output lấy: `SCRIPTS_DIR`, `SKILL_DIR`, `PROJECT_ROOT`, `OUTPUT_DIR`, `REFERENCES_DIR`3435Nếu không tìm thấy `wa-env`: dùng WebFetch cho URL, Read cho file text. Scripts không bắt buộc.3637### 1.1 Detect Input Type3839| Input Type | Detection | Action |40|---|---|---|41| **Topic thuần** | Chỉ có chủ đề, không file/URL | → Phase 2 trực tiếp |42| **Notes/ý tưởng rời** | Bullet points, gạch đầu dòng | → Phase 2 trực tiếp |43| **File (PDF/DOCX/EPUB)** | Path + extension | `wa-convert {path}` → content.md + structure.json |44| **File (XLSX/PPTX)** | Path + extension | `wa-convert {path}` (qua Docling). Kiểm tra chất lượng, xem [tier-processing.md](references/tier-processing.md) mục "Lưu ý chất lượng conversion" |45| **File (HTML/AsciiDoc)** | Path + extension | `wa-convert {path}` (qua Docling) |46| **Image (PNG/JPEG/TIFF/BMP/WEBP)** | Path + extension | Dùng Read tool (multimodal) để đọc ảnh trực tiếp. Nếu cần text extraction: `wa-convert {path}` (OCR qua Docling) |47| **URL (web page)** | `http://` hoặc `https://` (không YouTube) | Ưu tiên `WebFetch`. Dùng `wa-convert {url}` khi WebFetch trả nội dung rác |48| **YouTube URL** | `youtube.com` hoặc `youtu.be` | `wa-convert {url}` |49| **Plain text / .txt / .md** | Không extension phức tạp | Read trực tiếp, hoặc `wa-paste-text` nếu cần lưu vào output dir |5051### 1.2 File/URL Conversion5253```bash54# Auto-generate output dir55{SCRIPTS_DIR}/wa-convert /path/to/file.pdf5657# Custom output dir58{SCRIPTS_DIR}/wa-convert /path/to/file.pdf my-project/input-handling59```6061**Output**: `content.md` + `structure.json` trong output dir.6263> **Lưu ý venv**: Scripts dùng venv riêng tại `{SCRIPTS_DIR}/.venv/`. Nếu chưa setup, chạy `bash {SCRIPTS_DIR}/setup.sh` trước.6465### 1.3 Multi-Input6667Khi user đưa nhiều file/URL cùng lúc:6869- Xử lý tuần tự, mỗi input tạo thư mục riêng.70- Sau khi convert xong, hỏi user: gộp thành 1 content map chung hay tách riêng từng bộ outline?7172### 1.4 Fallback (không có scripts)7374- **URL**: dùng `WebFetch` trực tiếp75- **File text (.md/.txt)**: dùng `Read` trực tiếp76- **PDF/DOCX/EPUB/XLSX/PPTX**: báo user chạy `bash {SCRIPTS_DIR}/setup.sh`7778### Error Handling7980| Lỗi | Xử lý |81|---|---|82| File not found | Hỏi lại path |83| Unsupported format | Báo user, đề xuất convert thủ công |84| URL fetch failed | Báo lỗi, dừng |85| Empty content | Cảnh báo, xác nhận trước khi tiếp |86| Encrypted PDF | Hỏi bản giải mã |87| YouTube không có transcript | Báo user, hỏi có muốn dùng WebSearch research topic thay thế không |8889## Phase 2: Interview9091Hỏi tất cả câu hỏi trong 1 lượt:92931. **Audience**: Người đọc chính là ai?942. **Goal**: Mục tiêu chính? (educate / engage / convert / thought leadership)953. **Scope**: Góc cụ thể nào của chủ đề? (mặc định: bao phủ toàn bộ nội dung input)964. *(Optional)* **Số bài**: User muốn bao nhiêu bài? (mặc định: tự tính)975. *(Optional)* **Constraints**: Yêu cầu đặc biệt (deadline, topic cần tránh, kênh đăng, ngôn ngữ output)9899*Fast-track: Nếu input đã đủ context hoặc user yêu cầu "làm luôn", giả định sensible defaults và sang Phase 3.*100101### Edge Cases102103- **Input quá ngắn (1-2 câu):** Hỏi user bổ sung context hoặc dùng web research mở rộng.104- **Thiếu data cho 1 ý:** Note "Open questions" trong outline để writer biết cần tìm thêm.105- **Topic quá rộng:** Yêu cầu user chọn góc cụ thể trước khi plan.106107## Phase 3: Research (Conditional)108109### Khi nào chạy110111- **Luôn chạy**: input là topic thuần, notes/ý tưởng rời112- **Chạy nếu cần**: tài liệu convert nhưng nội dung mỏng, YouTube transcript ngắn/thiếu context113- **Skip**: tài liệu đã convert có nội dung đầy đủ (sách, report dài, tài liệu chuyên sâu)114115Tiêu chí "đầy đủ": tài liệu tự cung cấp đủ data, ví dụ, evidence cho các ý chính.116117### Quy trình118119- WebSearch 3-5 queries liên quan topic + audience + trends.120- Thu thập: data, số liệu, góc nhìn mới, ví dụ thực tế, case study.121- **Bắt buộc cite nguồn** cho mọi data point.122123> Research ở Phase 3 là tìm **bổ sung** (trend mới, góc nhìn khác, data gap), KHÔNG phải fetch lại nội dung đã có từ Phase 1.124125## Phase 4: Map Content & Generate Outlines126127### 4.0 Tier-Aware Processing (chỉ khi input đã convert)128129Nếu input đã convert (có `structure.json`):1301311. Đọc `structure.json` ONLY (không đọc content.md toàn bộ). Chỉ đọc content.md theo section cụ thể khi cần chi tiết.1322. Xác định tier. Chi tiết workflow, batch, subagent: xem [tier-processing.md](references/tier-processing.md).1333. Nếu structure.json lỗi: xem mục "Fallback" trong [tier-processing.md](references/tier-processing.md).134135### 4.1 Content Map136137**Cho topic thuần/notes:**138- Liệt kê toàn bộ concept/ý lớn từ input + research.139- Group các ý liên quan thành cluster theo chủ đề.140- Đánh dấu ưu tiên (must-have / nice-to-have).141142**Cho tài liệu đã convert:**143- Dùng `outline` từ `structure.json`: section titles, word counts, critical markers.144- Group sections thành clusters theo heading hierarchy.145146### 4.2 Generate Outlines147148**Tính số bài:**149150```python151if user_specified_article_count:152 target = user_specified_count153else:154 target = max(3, round(word_count / 2500))155```156157Ước lượng theo loại input khi không có word count:158- Topic thuần → 3-10 bài (tùy scope)159- Notes/ý tưởng rời → theo số ý tưởng có sẵn160- URL/article → 5-15 bài (tùy độ dài + density)161- Sách/tài liệu dài → chia thành batches (~10 bài/batch)162163**Nguyên tắc lên outline:**164165- **1 bài = 1 chủ đề duy nhất.** Mỗi outline tập trung đúng 1 ý chính.166- Outline = liệt kê **ý chính** bài cần cover, KHÔNG quy định cấu trúc trình bày.167- Mỗi ý chính phải có data/ví dụ hỗ trợ. Ý không có data → đánh dấu "cần tìm thêm" hoặc loại.168- Outline phải đủ rõ để writer hiểu **bài nói về cái gì** mà không cần đoán.169- **Cho tài liệu đã convert**: đọc content.md theo section cụ thể (`offset`/`limit` từ structure.json), KHÔNG đọc toàn bộ.170171**Format mỗi outline:**172173```174### Bài [N]: [Tiêu đề đề xuất]175176- **Audience:** [Người đọc cụ thể của bài này]177- **Goal:** [Sau khi đọc, reader hiểu hoặc làm được gì]178- **Angle:** [Góc tiếp cận]179- **Thesis (ý cốt lõi):** [1 câu]180- **Key points cần cover:**181 - [Ý chính 1] | data/ví dụ: [...] | nguồn: [...]182 - [Ý chính 2] | data/ví dụ: [...] | nguồn: [...]183 - [Ý chính 3] | data/ví dụ: [...] | nguồn: [...]184- **Takeaway / insight chính:** [Reader rút ra điều gì]185- **Open questions:** [Data còn thiếu. Nếu không có, ghi "Không"]186```187188## Phase 5: Save Output189190**Cấu trúc thư mục:**191192```193{CWD}/planning-content/{topic-slug}-{YYMMDD-HHMM}/194├── input-handling/ # Chỉ khi có convert195│ ├── content.md196│ └── structure.json197├── index.md # Overview + danh sách link198├── outline-[NN]-[slug].md # Mỗi bài 1 file199├── research.md # Nếu Phase 3 chạy200└── content-map.md # Nếu input dài hoặc nhiều concepts201```202203**index.md format:**204205```markdown206# Content Plan: [Topic]207208## Overview209- Audience: [...]210- Goal: [...]211- Tổng số bài: [N]212- Nguồn input: [URL/file/topic]213- Word count gốc: [N] (nếu có structure.json)214215## Danh sách Outlines2161. [Bài 1: Tiêu đề](outline-01-slug.md)2172. [Bài 2: Tiêu đề](outline-02-slug.md)218...219220## Coverage Checklist (nếu batch)221- [x] Batch 1 — 10/10222- [ ] Batch 2 — 0/10223```224225**Xử lý input dài (batch):**226227- Tạo content map trước, lưu vào `content-map.md`.228- Batch ~10 bài/batch, làm batch đầu trước.229- **Coverage check (BẮT BUỘC) sau mỗi batch:** đối chiếu content map, liệt kê concept ĐÃ cover vs CHƯA cover. Lặp đến 100%.230- Cập nhật `index.md` sau mỗi batch.231- Hỏi user confirm trước batch tiếp.232233Cuối cùng hỏi: "Đã hoàn thành outline cho [N] bài. Bạn muốn điều chỉnh outline nào không?"234235## Phase 6: Adjust Outlines (nếu user yêu cầu)236237| Yêu cầu | Xử lý |238|---|---|239| **Sửa 1 outline** | Đọc file, chỉnh theo feedback, ghi đè |240| **Merge 2+ outlines** | Gộp key points, chọn thesis mới, xoá file thừa, cập nhật index.md |241| **Tách 1 outline** | Chia key points thành groups, tạo file mới, cập nhật index.md |242| **Thêm outline mới** | Tạo file theo format Phase 4.2, thêm vào index.md |243| **Xoá outline** | Xoá file, cập nhật index.md, chạy coverage check nếu input đã convert |244| **Đổi thứ tự** | Rename file numbers, cập nhật index.md |245246Sau mỗi điều chỉnh, chạy coverage check (nếu input đã convert) để đảm bảo không bỏ sót.