document-template
Skill13 starsChanged 33 days agoMITView on GitHub
Quản lý document template Cogover qua `/api/v1/import-export` (phiên Web App): phân loại Word/Excel, mapping dữ liệu mẫu sang object fields, chuyển DOCX/XLSX thành Velocity template, CRUD, upload, HTML; sau create bắt buộc kiểm thử export end-to-end bằng Chrome; tùy chọn tạo Object Button xuất gắn layout Xem/Sửa qua $object-button và $object-layout.
In this repository23 other files it gives its agents.
- agent-builderSkill
- app-menu-managerSkill
- build-cogover-appSkill
- cogover-api-authSkill
- cogover-custom-moduleSkill
- cogover-iconSkill
- cogover-overviewSkill
- create-cogover-objectsSkill
- dashboard-builderSkill
- layout-scriptingSkill
- object-buttonSkill
- object-filterSkill
- object-formSkill
- object-history-trackingSkill
- object-infoSkill
- object-layoutSkill
- object-path-componentSkill
- object-recordSkill
- object-transition-ruleSkill
- process-creatorSkill
- record-emailSkill
- report-builderSkill
- user-permissionSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 24
Create/update bằng file: làm đủ mục Kiểm tra và chuẩn bị file mẫu trước khi upload.
- Very specific: line 26
Update/delete: đọc detail (service 15) trước.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Document Template
- Phiên bản:
1.0.2 - Ngày phát hành:
2026-09-11
Quản lý document template của Cogover qua POST /api/v1/import-export (service 12–17) và endpoint upload v2, với hai mode: upload file Word .docx/Excel .xlsx, hoặc lưu trực tiếp nội dung HTML. Mọi cấu hình template, fixture và lệnh export đi qua API; không thao tác UI để tạo/sửa cấu hình. Không suy đoán endpoint, service code, định dạng file, giới hạn dung lượng hay trường payload ngoài references/api-contract.md; đọc toàn bộ file này trước khi tạo request.
Điều kiện môi trường
- Credential, header và quy ước response/lỗi chung: theo $cogover-api-auth. Mọi endpoint của skill thuộc
/api/v1nên dùng phiên Web App; API Key chỉ để gọiPOST /bapi/v1/auth-token, không gửi API Key Bearer trực tiếp. - Kiểm thử export end-to-end sau create cần công cụ điều khiển trình duyệt (Chrome) sẵn có của môi trường, không phụ thuộc tên plugin cố định, giữ được phiên Workspace đã đăng nhập, giữ tab mở và theo dõi được download; chỉ dùng nó để mở record test, giữ Web App nhận websocket và lấy file Web App tự tải. Thiếu công cụ này: hoàn tất phần chuẩn bị/cấu hình đã được phép, bàn giao các bước kiểm thử thủ công và ghi rõ export end-to-end chưa được xác minh; không báo PASS, không tiếp tục bước phụ thuộc kết quả đó.
Quy trình bắt buộc
- Xác định workspace domain, thao tác, object slug đích và mode template.
- Create/update bằng file: làm đủ mục Kiểm tra và chuẩn bị file mẫu trước khi upload.
- Mọi create: làm mục Xác nhận gộp trước khi tạo sau khi có bảng mapping/biến và trước khi sửa file hoặc gọi API create; không hỏi xác nhận button thành một lượt riêng.
- Update/delete: đọc detail (service
15) trước; giữ nguyên trường người dùng không yêu cầu thay đổi. - Kiểm tra payload theo mode và ma trận định dạng (mục Quy tắc dữ liệu và lỗi) rồi gọi API theo workflow tương ứng.
- Đọc lại detail sau create/update; sau delete, xác minh item không còn trong list hoặc detail không còn trả về bản ghi.
- Sau mọi create: làm đủ mục Kiểm thử export end-to-end sau create. Kiểm thử đạt và người dùng đã chọn Có → Tạo button xuất và đưa vào layout đã chọn; chọn Không → kết thúc, không gọi
$object-buttonhoặc$object-layoutđể ghi.
Kiểm tra và chuẩn bị file mẫu
Làm trước workflow upload DOCX/XLSX, kể cả khi người dùng gọi file là "template". Đọc đầy đủ references/template-syntax.md trước khi phân loại hoặc sửa file; khi file có #foreach, #if, lookup nhiều cấp, .format(...) hoặc vùng dòng/bảng động, đọc thêm đầy đủ references/template-examples.md trước khi lập mapping hoặc sửa file. Chỉ dùng cấu trúc của ví dụ; resolve lại mọi slug bằng $object-info, không sao chép slug minh họa sang workspace khác.
- Mở và đọc file thật bằng skill Word/spreadsheet khả dụng: nội dung, bảng, sheet, công thức, bố cục, cả text hiển thị lẫn cấu trúc OOXML có thể làm vỡ token. Không phân loại chỉ từ tên file, extension, mô tả của người dùng hoặc preview một trang.
- Phân loại theo bằng chứng trong file:
Đã là template(vị trí dữ liệu động đã dùng cú pháp Velocity được server hỗ trợ và field path hợp lệ);Template một phần(có cả token/directive hợp lệ và dữ liệu mẫu còn hard-code);File dữ liệu mẫu(vị trí động vẫn là tên, ngày, số tiền, dòng sản phẩm... của một hồ sơ thực tế).{{...}},${...}, merge field của hệ khác, token bị Word chia vụn hoặc field path không tồn tại là chưa sẵn sàng, không phải Cogover template hợp lệ. - File đã là template: dùng
$object-inforesolve object/field/related-list thật; kiểm tra toàn bộ path, cân bằng directive, vị trí loop và khả năng render theo reference. Chỉ sửa lỗi nếu cần; không thay token hợp lệ bằng dữ liệu mẫu. - Template một phần hoặc file dữ liệu mẫu: lập mapping trước khi sửa file.
- Dùng
$object-infolấy object đích với fields, options, metadata và related lists. Hiểu ngữ nghĩa bằng cách đối chiếuname,slug,nameTranslations/bản dịch, description,fieldType, options và object quan hệ; không match chỉ vì chuỗi giống nhau. - Đọc nhãn, ngữ cảnh, vị trí, định dạng và giá trị mẫu trong file; phân biệt dữ liệu của record chính, current user, lookup và danh sách liên quan.
- Trình bày bảng đề xuất tối thiểu gồm cột
Vị trí trong file(sheet/page, cell/table/paragraph),Nội dung mẫu/nhãn,Diễn giải,Nguồn(record/currentUser/relatedList/object),Object/related list,Field path,Cú pháp đề xuất(Velocity),Độ tin cậy/Ghi chú(cao/vừa/thấp kèm lý do hoặc câu hỏi). Giữ nguyên slug kỹ thuật trong bảng. - Mapping mơ hồ: nêu rõ ứng viên hoặc câu hỏi; không tự chọn một field khi có nhiều khả năng hợp lý.
- Dùng
- Chốt bảng mapping trước khi sửa file. Create: chưa hỏi xác nhận riêng, đưa bảng vào Xác nhận gộp trước khi tạo để người dùng duyệt mapping/biến, quyết định button và chọn layout trong cùng một lượt. Update: yêu cầu người dùng xác nhận bảng mapping. Người dùng đổi mapping → cập nhật bảng và chỉ chuyển file sau khi bảng hiện tại được xác nhận rõ.
- Chuyển trên bản sao, không ghi đè file gốc. Thay đúng các giá trị mẫu đã duyệt bằng biến/directive theo hai reference trên. Giữ nguyên logo, style, kích thước, merge cell, công thức và nội dung tĩnh ngoài mapping. Với một vùng lặp, giữ một dòng mẫu và bọc bằng
#foreach/#end; không lặp lại nhiều dòng hard-code. - Kiểm tra file sau chuyển đổi theo Kiểm tra trước upload: mở lại, render/preview bố cục bằng skill Word/spreadsheet, trích lại text/token; file không hỏng, không còn dữ liệu mẫu tại các vị trí đã mapping, không còn placeholder của hệ khác, mọi path tồn tại,
#if/#foreachcó#end, token không bị chia vụn, loop row/table đúng cấu trúc. Chỉ render thử với một record khi có API render đã được chứng minh trong ngữ cảnh; không tự suy đoán endpoint preview. - Chỉ upload bản đã kiểm tra (file đã chuyển hoặc file template hợp lệ ban đầu) theo workflow Tạo từ DOCX/XLSX, rồi mới gọi API create/update.
Xác nhận gộp trước khi tạo
Áp dụng cho mọi create bằng DOCX, XLSX hoặc HTML: chỉ gửi một yêu cầu xác nhận chứa cả mapping/biến và lựa chọn tạo button; không duyệt mapping trước rồi hỏi button ở một lượt khác.
- Bảng dữ liệu động: file dữ liệu mẫu hoặc template một phần → bảng mapping ở mục trên; file đã là template → bảng kiểm tra các biến/directive hiện có, tối thiểu gồm
Vị trí,Cú pháp hiện tại,Nguồn,Object/related list,Field path,Kết quả resolve,Ghi chú; HTML → bảng mapping/biến tương đương từ nội dung HTML dự kiến, mọi field path vẫn phải resolve bằng$object-info. - Bảng layout: dùng
$object-layoutlấy danh sách layout của đúngrelated_object; chỉ đưa vào lựa chọn các layout hỗ trợ xem/sửa (functionLayout: 2, hoặcfunctionLayout: 3có quyềnVIEW_EDIT), hiển thị tối thiểuID,Tên,functionLayout,Web/Mobile,Trạng tháivà phạm vi access control. Không tự chọn tất cả layout active, không dùng layout của object khác, không dùng layout chỉ có chức năng Tạo. - Button đề xuất theo quy tắc của
$object-button: tên tiếng Anh mặc định nếu người dùng chưa đặt tên,slugtiếng Anh dạngsnake_caseđã tra trùng,status: 1,isBulk: 0, cùng cấu hình UI theo bảng ở mục Tạo button xuất và đưa vào layout đã chọn vớiMẫu văn bản tải xuốnglà document template đang chuẩn bị tạo. Không tự đổi tên/slug sau khi đã được xác nhận. - Trong cùng một câu trả lời trình bày ba phần trên và một yêu cầu trả lời gộp: xác nhận mapping/biến, chọn Có/Không tạo button và, nếu Có, chọn chính xác layout ID đích. Chỉ chấp nhận nhiều layout khi người dùng chủ động liệt kê rõ từng ID.
- Xác nhận chỉ hoàn tất khi người dùng đã duyệt bảng mapping/biến, trả lời Có/Không và cung cấp layout ID nếu chọn Có. Không có layout đủ điều kiện: nêu rõ không thể gắn button và không tự tạo layout mới; lựa chọn Có bị chặn cho tới khi có layout đích hợp lệ.
- Sau xác nhận gộp, không hỏi thêm lượt xác nhận cho create template, create button hoặc update layout. Người dùng thay đổi mapping, tên/slug button hay layout đích sau đó: thay thế đề xuất cũ và yêu cầu duyệt lại toàn bộ đề xuất gộp hiện hành; không dùng một xác nhận cũ cho cấu hình đã thay đổi.
Liệt kê hoặc xem chi tiết
- Service
13: liệt kê, lọc hoặc tìm ID. Pagination: chuyển tiếpsearchAftertừ response vàosearch_aftercủa trang kế tiếp; không tự chế offset. - Service
15vớiid: trạng thái chuẩn trước update/delete và xác minh sau ghi.
Tạo từ DOCX/XLSX
- Chỉ nhận file đã hoàn tất Kiểm tra và chuẩn bị file mẫu và Xác nhận gộp trước khi tạo; không upload file dữ liệu mẫu chưa chuyển hoặc file còn chờ xác nhận mapping/biến/button/layout.
- Kiểm tra extension cuối tên file, không phân biệt hoa thường:
Tai_len_file_Wordyêu cầu.docx;Tai_len_file_Excelyêu cầu.xlsx. - Upload file bằng multipart endpoint v2 với đúng một part tên
file. - Lấy nguyên object
datacủa response upload làmcontent_upload; không chỉ lấy URL hoặcfile_id, không dùng URL tạm làm payload thay cho toàn bộ object upload. Không từ chối response chỉ vì thiếutemp_urlhoặcfileTypekhông phải MIME: các key này thay đổi theo file-server/deployment. Không gọi create nếu upload thất bại,datakhông phải object, extension/tên file không khớp, hoặc object không có server reference nào để lưu. - Gọi service
12với JSON metadata vàcontent_upload; lấy ID từbody.data.id, xác minh bằng service15, rồi làm Kiểm thử export end-to-end sau create.
Tạo từ HTML
- Resolve bảng mapping/biến của HTML và hoàn tất Xác nhận gộp trước khi tạo.
file_format: "Tai_len_file_Html";download_formatlàPDFhoặcIMAGE; gửicontent_htmlkhông rỗng; không gọi upload và không gửicontent_uploadcủa file cũ.- Field path là chuỗi các field slug nối bằng dấu chấm lấy từ object metadata. Chỉ bọc path bằng delimiter placeholder khi contract template hiện hành đã chứng minh cú pháp; nếu chưa, không tự bịa delimiter.
- Gọi service
12, đọc lại bằng service15, rồi làm Kiểm thử export end-to-end sau create.
Kiểm thử export end-to-end sau create
Bắt buộc cho mọi create DOCX, XLSX hoặc HTML sau khi service 15 đã trả đúng template; create/detail thành công không phải bằng chứng template render đúng. Kiểm thử từng fixture tuần tự để ghép đúng request với file trình duyệt (Chrome) vừa tải.
- Ma trận bao phủ từ bảng mapping/biến đã duyệt: placeholder, lookup path,
currentUser, nhánh#if, vùng#foreach, related list, format ngày/số/tiền và trường hợp rỗng. Chọn số fixture ít nhất nhưng bao phủ nhiều nhất; dùng nhiều record khi một record không thể đồng thời đi qua các nhánh đối lập hoặc các trường hợp 0/1/nhiều dòng. - Tạo fixture bằng API:
$object-infolấy fields, kiểu dữ liệu, required fields, lookup và toàn bộ related lists thật của đúngrelated_object;$object-recordtạo record chính cùng các record lookup/related cần thiết, điền dữ liệu đại diện cho mọi biến có thể kiểm tra, marker duy nhất dạngcodex-document-template-test-{timestamp}-{case}; đọc lại từng record và lưu toàn bộ Object slug/record ID đã tạo. Không dùng dữ liệu nghiệp vụ có sẵn làm fixture khi có thể tạo dữ liệu test riêng. - Chuẩn bị Web App nhận file: dùng công cụ trình duyệt mở record chính tại
https://{WORKSPACE_DOMAIN}/settings/o/{OBJECT_SLUG}/{OBJECT_RECORD_ID}, chờ trang sẵn sàng và giữ tab mở để Web App nhận websocket rồi tự tải file export. Nhiều fixture: mở đúng record sắp test trước mỗi request. related_list_sortstừ metadata: chỉ dùng related-list slug và field sort do$object-infotrả về và cần cho template; đối chiếu chiềuasc/descvới thứ tự mong đợi trong file; không cần sort thì gửi object rỗng thay vì bịa slug; không sao chép slug minh họa sang object khác.- Gọi export service
17:POST /api/v1/import-export,x-req-service: 17,x-req-type: 1, payload gồmdocument_template_id,object_record_id,object_slug,related_list_sortstheo api-contract. Kiểm tra HTTP status và mã nghiệp vụ nếu có; request bất đồng bộ nên response thành công chỉ chứng minh job đã được nhận, chưa chứng minh file đúng. Không retry mù quáng khi timeout hoặc kết quả nhận job chưa rõ vì có thể tạo download trùng. - Chờ và nhận đúng file: chờ có giới hạn, theo dõi download mới trong trình duyệt kể từ lúc gửi request và cập nhật tiến độ nếu phải chờ; ghép file theo thời điểm request, fixture và format mong đợi, không lấy một file cũ trong Downloads. Hết thời gian hợp lý mà không có file: ghi nhận test thất bại với nguyên nhân
không nhận được file export, không suy diễn rằng template đúng. - Mở và kiểm tra file đầu ra bằng skill phù hợp định dạng (Word cho DOCX, spreadsheet cho XLSX, PDF cho PDF, kiểm tra ảnh cho IMAGE); render/preview toàn bộ trang/sheet và đối chiếu với fixture cùng bảng mapping đã duyệt:
- file mở được, không rỗng, đúng định dạng và không hỏng;
- mọi placeholder/path đã được thay bằng đúng dữ liệu record, lookup, related list hoặc
currentUser; không còn token/directive chưa render hay placeholder của hệ khác; #ifchọn đúng nhánh;#foreachsinh đúng số dòng, không lặp dòng mẫu và đúng thứ tựrelated_list_sorts;- ngày, số, tiền tệ, option label, công thức/tổng và trường hợp null/rỗng hiển thị đúng yêu cầu;
- nội dung tĩnh, logo, style, merge cell, bảng, ngắt trang, kích thước và bố cục vẫn đúng; không tràn, cắt hoặc chồng nội dung.
- Ghi kết quả theo từng fixture: bảng tối thiểu gồm
Case,Object/Record ID,Biến/nhánh được bao phủ,File đầu ra,Kết quả,Sai khác. Chỉ đánh dấu đạt khi mọi case bắt buộc đạt. Lỗi: báo rõ template đã tồn tại nhưng workflow kiểm thử chưa hoàn tất, không tạo button/gắn layout, nêu chính xác file, vị trí, giá trị mong đợi/thực tế; chỉ sửa rồi chạy lại khi thay đổi vẫn thuộc phạm vi người dùng đã cho phép; đổi mapping/biến đã duyệt thì quay lại Xác nhận gộp trước khi tạo. - Quản lý fixture: báo toàn bộ record test và record liên quan đã tạo; không tự xóa. Người dùng yêu cầu dọn dẹp: dùng quy trình xác nhận/xóa của
$object-record, rồi xác minh từng ID không còn.
Tạo button xuất và đưa vào layout đã chọn
Chỉ khi người dùng đã chọn Có, document template vừa tạo đã được đọc lại thành công bằng service 15 và Kiểm thử export end-to-end sau create đã đạt.
Dùng
$object-buttontạo một custom record-level button trên đúng object của template, với name/slug đã duyệt trong xác nhận gộp và mapping UI/API:Cấu hình UI Giá trị API Loại hành động = Xuất dữ liệuactionType: 8Object sở hữu/nguồn objectTypeSlugvàsourceObjectSlugđều bằng slug củarelated_objectKiểu xuất dữ liệu = Xuất theo mẫu văn bảnfileDownloadType: 1Mẫu văn bản tải xuốngdocumentTemplate: "{document-template-id-vừa-tạo}"Trạng thái/phạm vi status: 1,isBulk: 0Thực hiện đầy đủ bước kiểm tra trùng, create và view lại của
$object-button; chỉ tiếp tục khi view trả đúngobjectTypeSlug,sourceObjectSlug,actionType: 8,fileDownloadType: 1vàdocumentTemplatebằng ID mẫu vừa tạo.- Dùng
$object-layoutđưa button vừa xác minh vào layout ID người dùng đã chọn quapageSettings.buttons.listButton: giữ nguyên mọi button hiện có và thứ tự của chúng, chống trùng theobuttonId; không tạo componentfieldType: "button_group", không thêm vào layout khác, không hỏi xác nhận lần nữa. View lại layout; chỉ báo hoàn tất khi button xuất hiện đúng một lần, layout vẫn thuộc đúng object và vẫn hỗ trợ xem/sửa. - Create button thất bại: không update layout. Button đã tạo nhưng update/xác minh layout thất bại: không tự xóa button; báo rõ template và button đã tồn tại nhưng button chưa được gắn thành công vào layout để người dùng quyết định bước tiếp theo.
Cập nhật
- Gọi service
15; nếucontent_uploadcủa response cũ là chuỗi JSON, parse trên bản sao để kiểm tra; merge đúng thay đổi được yêu cầu và giữ nguyên representation gốc nếu không thay file. - Thay DOCX/XLSX: upload file mới trước, thay toàn bộ
content_uploadbằng object upload mới. Chuyển sang HTML: gửicontent_htmlvà bỏ metadata upload không còn áp dụng; chuyển từ HTML sang file: gửicontent_uploadvà bỏcontent_html. - Gọi service
14vớiidvà trạng thái đầy đủ sau merge; đọc lại detail và so sánh các trường đã đổi. - Không đổi
related_objectqua update (UI khóa trường này khi item đã tồn tại) nếu chưa có contract server bổ sung chứng minh thao tác được hỗ trợ.
Xóa
- Đọc detail, hiển thị chính xác mẫu sắp xóa và yêu cầu xác nhận nếu người dùng chưa xác nhận rõ hành động phá hủy này.
- Gọi service
16vớiid. Response lỗi chứabody.data[id]: mẫu đang được interface/button tham chiếu, liệt kênamecủa các tham chiếu; không retry hoặc cố gỡ liên kết ngoài phạm vi. - Chỉ báo thành công sau khi xác minh item đã biến mất.
Quy tắc dữ liệu và lỗi
related_objectlà object slug, không dùng display name.category,file_format,download_formatlấy từ metadata objectdocument_templatekhi cần; không dịch label UI thành slug bằng phỏng đoán.- Ma trận format: Excel →
XLSX; Word →DOCX,PDFhoặcIMAGE; HTML →PDFhoặcIMAGE. - Trim
name, 2–100 ký tự;descriptionnull/rỗng được nhưng tối đa 1000 ký tự. - Gửi đúng trường nội dung của mode hiện tại; khi chủ động đổi mode, bỏ trường nội dung cũ khỏi payload để tránh dữ liệu stale.
body.r: 436là trùng tên: không tự đổi tên; báo người dùng hoặc dùng tên mới mà họ đã chỉ định.- Kiểm tra cả HTTP status và mã nghiệp vụ (
body.rhoặcrtùy endpoint); HTTP 2xx kèm mã nghiệp vụ báo lỗi không phải thành công. - Không tuyên bố giới hạn dung lượng/MIME chưa được chứng minh: front-end chỉ kiểm tra extension cho template và đặt timeout upload 3 phút; lỗi server phải được giữ nguyên và báo lại.
Kết quả cần trả
- Workspace, operation, document template ID/name và mode đã xử lý; với file, kết quả upload nêu riêng với kết quả create/update; cách đã xác minh hậu điều kiện.
- Create: ma trận kiểm thử, fixture Object/record IDs, file export đã kiểm tra, mức bao phủ, pass/fail từng case và mọi fixture còn tồn tại; quyết định button và, nếu đã tạo, button ID/name/slug, layout ID/name cùng kết quả view xác minh cả button lẫn
pageSettings.buttons.listButton.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

