Giao diện
RFC 0002: Port thay đổi từ AntAdmin vào @tasco 2.0.0
- Trạng thái: Accepted
- Người đề xuất: Core team
- Ngày: 2026-09-14
Bối cảnh & vấn đề
AntAdmin (github.com/daothanh/antadmin, phát hành public trên npmjs) được tạo ngày 30/08/2026 từ working tree của repo này tại e14f2d4 cộng WIP scaffold CI/CD, bằng cách đổi tên cơ học tasco/Tasco/TASCO → antadmin/AntAdmin/ANTADMIN và thay domain nội bộ bằng domain public. Hai repo không chung lịch sử git.
Sau fork, AntAdmin có 44 commit (tới d07e34a, 14/09/2026). Trong đó có tính năng và bản sửa dùng chung mà @tasco/* chưa có:
CTablethành khung trang danh sách: toolbar, drawer bộ lọc, drawer thiết lập cột lưu localStorage, phân trang mặc định.- Token màu đạt tương phản WCAG AA, có test khoá cặp token; bật ESLint và Vitest cho
@tasco/theme. - Sửa d.ts lỗi TS2749 của
@tasco/uivà build Storybook. - Kiến trúc, coding conventions và quy trình trong
CLAUDE.md. - Sửa app scaffold fail
pnpm install/typecheck với pnpm 11+ khi đặt ngoài monorepo; gỡ phần OIDC còn sót trong layer.
Repo này sau fork chỉ thêm AGENTS.md và WIP ESLint 10, không sửa file tính năng nào, nên các commit trên áp được với xung đột nhỏ. Nếu không đồng bộ, hai codebase tiếp tục tách xa và mỗi bản sửa phải làm hai lần.
Đề xuất
Port từng commit bằng
scripts/port-antadmin.sh: map domain rồi đổi tên thương hiệu, bỏpnpm-lock.yaml,CHANGELOG.md,LICENSE,.github/**; giữ tác giả, ngày và trailerPort-From: antadmin@<sha>; chặn commit khi còn nội dung public (npmjs, GitHub, domain AntAdmin).Giữ hạ tầng Tasco: scope
@tasco, GitLab Package Registry,.gitlab-ci.yml, IAM Tasco mặc định, mock clientOAP_*, template Docker dùng BuildKit secret,@tasco/mcppublish nội bộ.Không nâng toolchain trong đợt này: giữ pnpm 11.7.0, changesets 2, lock Nuxt 4.4.8 và
engines.nodecủa monorepo. pnpm 12, Nuxt 4.5, Vite 8, changesets 3 làm MR riêng sau 2.0.0.Phạm vi: port 22 commit, hoãn 2 (
59eb902nâng pnpm 12;30aa5e9đặtengines.nodecủa monorepo theo Nuxt 4.5 trong khi lock còn Nuxt 4.4.8), bỏ 20 commit chỉ phục vụ bản public (phát hành npmjs và GitHub Actions, bỏ thương hiệu, version/CHANGELOG của npm, docs lên GitHub Pages). Danh sách đầy đủ ở.sync/antadmin.json.Chia MR xếp chồng, mỗi MR target nhánh ngay dưới, đổi target về
mainkhi nhánh dưới đã merge:MR Nhánh Nội dung 1 feat/cli-scaffold-cicdChốt WIP scaffold CI/CD 2 feat/eslint-10Chốt WIP ESLint 10 (RFC 0001) + test cấu hình từ AntAdmin 3 docs/rfc-0002-port-antadminRFC này 4 feat/port-antadmin-toolingScript port, turbo devphụ thuộc^build, conventions trongCLAUDE.md,.gitignore, layer không publish file test, AGENTS.md5 feat/port-antadmin-ui-kit11 commit theme + CTable, giữ thứ tự gốc6 fix/port-antadmin-cli-layer6 commit CLI/layer ngày 14/09 + test template scaffold 7 docs/port-antadmin-migrationMigration Guide v1 → v2, sổ đồng bộ .sync/antadmin.jsonPhát hành chung
@tasco/*2.0.0 qua dist-tagbeta, promote lênlatesttheo tiêu chí trong Release.Sau 2.0.0: AntAdmin làm upstream cho phần dùng chung, repo này là bản phân phối Tasco. Sau mỗi release AntAdmin, chạy script với dải
<sha trong .sync/antadmin.json>..<sha mới>. Code dùng chung chỉ viết thương hiệu ở 3 dạngantadmin/AntAdmin/ANTADMINvà không hardcode domain, để việc đổi tên luôn cơ học.
Phương án thay thế
- Chép đè snapshot AntAdmin rồi đổi tên một lần: nhanh nhưng mất lịch sử từng thay đổi và dễ kéo theo phần public hoá.
- Team sản phẩm dùng thẳng
@antadmin/*kèm layer Tasco mỏng: phải đổi--tasco-*,$tascoAuth, keytascotrongapp.config.tsvà cookietasco_session(mọi người dùng bị đăng xuất), đồng thời phụ thuộc registry nằm ngoài GitLab công ty. Cần RFC riêng nếu muốn đi hướng này. - Không đồng bộ: hai codebase tách xa, sửa lỗi hai nơi.
- Gộp nâng toolchain vào đợt port: khó khoanh vùng khi lỗi; bản thử đã đạt quality gate với toolchain hiện tại.
Ảnh hưởng
Breaking, phát hành major 2.0.0 cho mọi package
@tasco/*(lockstep):- ESLint 10, Node >= 20.19 (RFC 0001).
CTablebọc trong khungCCard:class/stylegắn vào khung ngoài;titlevà slot#titlehiện ở header khung; phân trang mặc định có tổng số dòng và bộ chọn số dòng/trang.- Token màu đổi giá trị để đạt AA;
ColorTokensthêm field bắt buộcaccentText,successText,warningText. useTable: bỏ sắp xếp thìsortField/sortOrderlàundefined;dataIndexlồng gửi'a.b'; sắp xếp nhiều cột lấy cột đầu.- Layer truyền locale
vi_VNcho<a-config-provider>. - Layer gỡ OIDC: xoá
server/utils/oidc.ts(các hàm auto-importgetOidcMetadata,generatePkce,refreshAccessToken,mapUserInfo),runtimeConfig.oidcvà envNUXT_OIDC_*, fieldrefreshTokencủa session;/auth/logoutkhông chuyển tới IdP.
Không breaking nhưng cần làm với app tạo từ template cũ: thêm
pnpm-workspace.yamlcóallowBuilds, fieldpackageManagervà dòng COPY trongDockerfile;engines.nodetheo Nuxt 4.5.Kiểm chứng với pnpm 11.7.0, Node 24:
feat/eslint-10,feat/port-antadmin-ui-kit,fix/port-antadmin-cli-layervàdocs/port-antadmin-migrationđều đạtpnpm install --frozen-lockfile, lint, typecheck, build (gồm docs) và test; nhánh cuối có 390 test.- Build Storybook đạt; playground
/ui-kitkiểm tra tayCTable(drawer lọc, drawer thiết lập cột) ở theme sáng và tối. - App scaffold từ tarball, đặt ngoài monorepo: install, lint, typecheck, build đạt; tarball không còn
workspace:*. changeset versionthử trên bản sao: mọi package@tasco/*lên 2.0.0.
Rà repo sản phẩm trước khi phát hành beta:
bashgrep -rnE '<CTable|NUXT_OIDC_|\.oidc\b|refreshToken|getOidcMetadata|generatePkce|refreshAccessToken|mapUserInfo|#ee0033|#1576f4|#4f76d1|#7b98df|#f43f5e|a-config-provider' \ --include='*.vue' --include='*.ts' --include='*.css' --include='*.scss' --include='.env*' \ --exclude-dir=node_modules --exclude-dir=.nuxt --exclude-dir=.output .
Câu hỏi mở
- Chiều nguồn chuẩn sau 2.0.0: AntAdmin làm upstream (đề xuất) hay repo này làm upstream?
- Repo sản phẩm nào dùng API bị đổi hoặc gỡ, và team nào pilot bản beta?
- GitLab có bật push rule kiểm tra email tác giả không? Commit port đang giữ tác giả gốc.
- Thời điểm nâng pnpm 12, Nuxt 4.5 và Vite 8 (kèm
30aa5e9). - Chưa chạy
docker build --target checkcủa template trên máy có Docker;playground/.env.examplecòn khối envNUXT_OIDC_*không còn tác dụng cần xoá.