Skip to content

RFC 0003: Tái cấu trúc tài liệu framework

  • Trạng thái: Accepted
  • Người đề xuất: Core team
  • Ngày: 2026-09-16

Bối cảnh & vấn đề

Docs hiện tại là VitePress với 15 trang (~1.800 dòng) cộng 2 RFC, tổ chức theo package. Quy trình đóng góp, release và Migration v1 → v2 đã đủ dùng; phần team sản phẩm cần hằng ngày thì thiếu, và có chỗ đang hướng dẫn sai.

Khảo sát ngày 15/09/2026 tại 08e7b14:

  • Component: 17 component thương hiệu dồn trong một trang guide/ui.md. 16 component chỉ có một dòng trong bảng, riêng CTable có mục chi tiết. 50 primitive antdv re-export chỉ được liệt kê tên. Không có ví dụ chạy được, không có bảng props/events/slots đầy đủ.
  • Source chưa đủ để sinh tài liệu tự động: 7 component có prop nhưng không prop nào có JSDoc (CAppLayout, CButton, CEmpty, CInputCurrency, CInputPercent, CPageHeader, CTopNav); không component nào khai báo slot bằng defineSlots.
  • API chưa có tài liệu: useConfirm, useErrorHandler$tascoError, useThemeMode, @tasco/utils (AppError, toAppError, getFieldErrors), error.vue, bảng biến môi trường đầy đủ.
  • Sai lệch (sửa riêng ở MR fix/docs-sai-lech, không chờ RFC này):
    • .npmrc hướng dẫn trỏ instance endpoint /api/v4/packages/npm/guide/getting-started.md, contributing/npmrc.md và template CLI, trong khi CLAUDE.mdguide/ai-tooling.md nói đúng phải là group endpoint — đây là nguyên nhân lỗi E404 khi cài package.
    • Permission dạng order.read còn ở docs, template CLI, mock đăng nhập, playground và comment middleware; thực tế permission là URI so khớp chính xác.
    • Ví dụ trong guide/ui.md viết thẻ <a-dropdown>, <a-menu>, <a-form-item>, trái quy tắc app chỉ dùng C*.
    • README.md còn ghi dòng 1.2.x/1.3.x; sơ đồ guide/architecture.md thiếu ai, mcp và quan hệ composables → theme.
  • Phiên bản: site chỉ có một bản, tự deploy từ main, nên tài liệu luôn là của major mới nhất — team đang ở major cũ không có bản tương ứng để đọc. Remote cũng chưa có tag phát hành vì job release không đẩy tag.
  • Trải nghiệm: chưa bật tìm kiếm, chưa có "Sửa trang này", chưa hiện ngày cập nhật. Trang dài khiến search_docs của @tasco/mcp trả cả file thay vì đúng đoạn.

Đề xuất

1. Chia theo người đọc: 6 khu, khoảng 98 trang

Tên package chỉ còn là nhãn trong khu Tra cứu. Mỗi trang một việc, theo khung Diátaxis (Học / Làm / Hiểu / Tra cứu).

KhuĐường dẫnNgười đọcSố trang
Bắt đầu/v2/start/Team sản phẩm5
Hướng dẫn/v2/guide/Team sản phẩm27
Component/v2/components/Team sản phẩm33
UI/UX/v2/design/Designer, BA, dev8
Tra cứu/v2/reference/Mọi người10
Phát triển core/v2/core/Team core15
  • Bắt đầu: giới thiệu, chuẩn bị môi trường và registry, tạo app bằng CLI, hướng dẫn làm từng bước một app quản lý đơn hàng, thêm vào project có sẵn.
  • Hướng dẫn: nền tảng (layer, cấu hình, chế độ render), gọi backend (BFF, hợp đồng dữ liệu, fetcher), đăng nhập và phân quyền (7 trang tách từ auth.md), xử lý lỗi, 4 mẫu trang (danh sách, form, chi tiết, dashboard), giao diện, AI, vận hành (deploy, nâng cấp, xử lý sự cố).
  • Component: mỗi component một trang; CTable tách 6 trang con; 6 trang cho primitive antdv re-export theo nhóm; TascoLoginForm, Can/v-can, useConfirm, useErrorHandler.
  • Phát triển core: 4 trang contributing hiện có chuyển sang, cộng kiến trúc nội bộ, thêm component/composable, test và coverage, đổi design token, viết tài liệu, CI/CD, MCP và AI review, nợ kỹ thuật.

URL cũ chuyển hướng bằng _redirects của Cloudflare Pages, giữ ít nhất tới hết major 2.

2. Chuẩn trang component

Mọi trang theo cùng thứ tự: mở đầu (khi nào dùng / không dùng) → ví dụ cho từng trường hợp → API sinh từ source → giao diện và biến CSS → khả năng tiếp cận → lưu ý → liên quan.

Trang xong khi: mọi prop/event/slot có mô tả (bảng API không còn ô cảnh báo); có demo cơ bản, demo cho mỗi biến thể chính, mỗi trạng thái component có, và ít nhất một ví dụ ghép thực tế (useTable, CForm, phân quyền); demo chỉ dùng C* và composable công khai, qua vue-tsc và ESLint với cấu hình của template CLI; một người không viết trang làm theo được.

3. Docs-as-code

  • Ví dụ là code thật: mỗi ví dụ dài hơn 10 dòng là file .vue trong demos/ của trang, render bằng cú pháp <demo src> trong <ClientOnly> (antdv render phía server kém — gotcha đã biết), code hiển thị đọc từ chính file đó.
  • Bảng API sinh từ source: vue-component-meta (cùng engine với vue-tsc 2.2) chạy trong build @tasco/ui, xuất component-meta.json vào dist. VitePress và @tasco/mcp dùng chung file này; @tasco/mcp bỏ parser regex hiện tại (không đọc được slot và payload event).
  • Tra cứu package TS: TypeDoc + typedoc-plugin-markdown cho composables, utils, theme, ai.
  • Token: bảng màu và tỉ lệ tương phản sinh từ cssVars()contrast.ts của @tasco/theme.
  • CI: job docs chặn khi build gặp link hỏng, demo lỗi vue-tsc hoặc ESLint, hoặc docs-coverage thấy export C*, prop, event, slot, khoá runtimeConfig chưa có tài liệu. Cảnh báo từ M1, chặn MR từ M3.
  • Quy ước code nhúng từ CLAUDE.md bằng <!--@include-->, không chép tay.

4. Docs theo phiên bản, bắt đầu từ 2.x

Đơn vị là major (các package đi lockstep; trong một major, minor chỉ thêm tính năng tương thích ngược). Không dựng tài liệu cho 1.x: team còn ở 1.x nâng lên theo Migration v1 → v2 nằm trong bản 2.x.

Đường dẫnBuild từNội dung
/v2/mainCấu trúc mới; demo chạy @tasco/ui 2.x. / chuyển hướng về đây
/v3/ (khi 3.0 ra mắt)mainBản 2.x lúc đó chuyển sang nhánh release/2.x và vẫn phục vụ ở /v2/
  • Đường dẫn cố định theo major: app 2.x (template CLI, CLAUDE.md của sản phẩm, MCP) trỏ /v2/… và vẫn đúng sau khi 3.0 ra mắt.
  • Mỗi bản build từ nhánh của nó nên demo luôn khớp phiên bản. Storybook không chia phiên bản.
  • Menu phiên bản và banner bản cũ đọc /versions.json ở gốc site lúc chạy, nên bản cũ không phải build lại khi có bản mới.
  • Trong một major: JSDoc @since hiện badge "từ 2.1"; phần đã merge nhưng chưa phát hành hiện "sắp phát hành" (so @since với version trong package.json). docs-coverage so component-meta.json với bản @tasco/ui đã publish để bắt prop/event/slot mới thiếu @since.
  • Hiện site chỉ có một bản nên job deploy giữ như cũ, chỉ thêm base /v2/_redirects. Từ bản cũ đầu tiên (khi 3.0 ra mắt): Cloudflare Pages thay toàn bộ site mỗi lần deploy, nên job deploy trên main build bản mới rồi tải artifact của nhánh release/<major cũ>.x qua API artifact của GitLab và ghép lại; không tải được thì job dừng, không deploy site thiếu phiên bản. Push vào nhánh duy trì thì build artifact rồi kích hoạt pipeline main.
  • Checklist phát hành major mới nằm ở trang Release của khu Phát triển core.

5. Quy trình và quyền sở hữu

  • MR đổi API công khai chỉ xong khi có JSDoc, trang docs, demo, changeset và Migration nếu breaking. docs-coverage kiểm tự động.
  • CODEOWNERS trỏ theo thư mục docs mới (docs/components/** cho owner UI, docs/guide/auth/** cho owner platform…).
  • MR template thêm mục docs và ảnh chụp cho MR đổi giao diện; skill new-component thêm bước viết trang và demo; thêm skill doc-component soạn nháp trang từ source.
  • Không có preview theo MR: người review chạy pnpm turbo run dev --filter=docs.
  • Site giữ công khai. Quy tắc nội dung: không đưa token, secret; host IAM và gateway trong ví dụ dùng example.com; chỉ ghi host thật khi người đọc bắt buộc phải cấu hình đúng host đó (registry GitLab).

6. Lộ trình

12 tuần, khoảng 107 ngày công trên năng lực khoảng 120 (2 dev core toàn thời gian). Designer tham gia khoảng 30% ở tuần 7–10; 1 dev team sản phẩm dùng thử khoảng 3 ngày; core lead duyệt RFC và MR.

Giai đoạnTuầnNgày côngKết quả
GĐ0 Chốt phạm vi, chuẩn viết, sửa sai lệch1~5RFC duyệt, hướng dẫn viết + template
GĐ1 Hạ tầng docs (theme, demo, API, phiên bản, CI)2–3~14M1 09/10 — site mới tại /v2/
GĐ2 Bắt đầu và Hướng dẫn3–6~25M2 30/10 — team sản phẩm tự onboarding
GĐ3 Component, 3 đợt4–9~30M3 20/11 — đủ trang, docs-coverage chặn MR
GĐ4 UI/UX, Tra cứu, Phát triển core7–10~2633 trang còn lại
GĐ5 Đồng bộ MCP, quy trình, ra mắt10–12~7M4 11/12 — công bố chính thức

Thiếu người thì lùi GĐ4 trước, giữ GĐ2 và GĐ3 để mốc M2 không trượt.

Phương án thay thế

Nhu cầuChọnKhông chọn vì
Ví dụ chạy đượcPlugin demo trong VitePress, file .vue vừa chạy vừa là code hiển thịNhúng iframe Storybook: nặng, lệch theme, code không đồng bộ. Code viết trong markdown: không typecheck, dễ lệch
Bảng APIvue-component-metaParser regex hiện tại của MCP không đọc được slot và payload event; viết tay thì lệch source
Tìm kiếmLocal search của VitePress, chuẩn hoá bỏ dấu tiếng ViệtAlgolia DocSearch phải gửi nội dung nội bộ ra dịch vụ ngoài
Phiên bảnMỗi major một bản, build từ nhánh của major đóChép thư mục docs cho từng bản trong cùng nhánh: demo sẽ chạy @tasco/ui mới nhất, sai với bản cũ
Tổ chứcTheo người đọcTheo package: người đọc phải biết trước API nằm ở package nào mới tra được

Ảnh hưởng

  • Không breaking với API runtime. Package thay đổi:
    • @tasco/ui (patch): JSDoc cho mọi prop/emit, defineSlots cho 17 component, sinh component-meta.json vào dist. Cần chạy vue-tsc với playground và app tạo từ CLI trước khi phát hành vì defineSlots có thể làm lộ lỗi type sẵn có ở app sản phẩm.
    • @tasco/mcp (minor): đọc component-meta.json, chia docs theo heading, trả link /v<major>/. Giữ coverage 90%.
    • @tasco/cli (patch): link docs trong template trỏ /v2/.
  • URL đổi: mọi link docs hiện có. Giảm thiểu bằng _redirects và cập nhật template CLI trong cùng đợt.
  • CI: thêm job docs; job deploy chỉ thêm base /v2/_redirects, phần ghép nhiều phiên bản để tới khi có bản cũ đầu tiên (3.0).
  • Team sản phẩm: không phải làm gì; link cũ vẫn vào được. Team còn ở 1.x không có tài liệu riêng — nâng lên 2.x theo Migration v1 → v2.

Quyết định đã chốt (15/09/2026)

#Câu hỏiChốt
1Site docs đặt sau đăng nhập?Chưa cần ở thời điểm hiện tại; áp quy tắc nội dung cho site công khai
2Vai trò Storybook?Chưa thể hiện được vai trò → không đầu tư thêm, giữ nguyên bản build ở /storybook/, trang component không link story, đánh giá lại ở GĐ5
3Duy trì docs theo phiên bản?Có, tính từ 2.x trở đi; không dựng tài liệu cho 1.x (chốt 16/09/2026)
4Nhân sự2 dev core, designer ~30% tuần 7–10, 1 dev team sản phẩm ~3 ngày, core lead duyệt
5Preview docs theo MR?Không
6Demo cần primitive antdv chưa re-exportThêm alias vào @tasco/ui, demo không viết thẻ <a-*>
7Storybook sau GĐ5 (đánh giá lại câu 2)Chỉ giữ làm công cụ dev cục bộ (HMR trên source, panel a11y): không deploy, /storybook/* chuyển hướng về trang Component; .stories.ts tuỳ chọn, trang docs + demo bắt buộc (chốt 16/09/2026)

Câu hỏi mở

  • @since tự động (mục 4) chưa làm: bảng API chưa hiện badge, docs-coverage chưa so với bản đã publish. Tạm thời mục docs mô tả API mới gắn nhãn tay từ x.y (Viết tài liệu › API mới trong một major). Cần chốt nguồn để so: registry (pipeline MR phải có token đọc) hay bản component-meta.json lưu lại trong version MR.
  • Có bổ sung đẩy tag phát hành trong job release không, để khi tạo nhánh duy trì cho major cũ (lần đầu là lúc 3.0 ra mắt) lấy mốc bằng tag thay vì tra lịch sử package.json.
  • Thời điểm xem lại chính sách truy cập site, khi các trang hạ tầng và bảo mật chi tiết hơn.