1561 words
8 minutes
Dùng Claude Code để gắn tag và dọn dẹp 1Password

Sau nhiều năm dùng LastPass rồi chuyển sang 1Password, kho mật khẩu của mình có hơn 700 item. Tag mang theo từ LastPass thì lộn xộn: ngân hàng nằm trong “My Sites”, usps.com lại thuộc “Business”, và item nào cũng dính thêm một tag kiểu Imported November 1 2026 09:08:54.

Gắn tag lại bằng tay cho 700 item thì mình chịu. Vì vậy mình nhờ Claude Code làm, và bài này ghi lại cách làm cùng những điều mình rút ra, nhất là về an toàn, vì đây là kho mật khẩu chứ không phải một thư mục code bình thường.

Kết quả#

  • Hơn 700 item được phân loại vào khoảng 55 tag tiếng Anh, có phân cấp như Finance/Banking, Tech/Hosting, Shopping/Fashion.
  • Tag riêng cho từng công ty mình làm hoặc từng làm, để tách tài khoản công việc khỏi tài khoản cá nhân.
  • Item không đủ thông tin để phân loại được gắn Needs Review để mình tự xem.
  • Khoảng 80 tài khoản của một công ty cũ được gắn zDeleting để mình rà và xóa dần.
  • Mật khẩu, username, ghi chú và custom field không bị thay đổi. Claude kiểm tra điều này trên từng item.

Chuẩn bị#

1. Cài 1Password CLI#

Trên Windows:

Terminal window
winget install AgileBits.1Password.CLI

Sau đó vào app 1Password, chọn Settings → Developer và bật Integrate with 1Password CLI. Khi đã bật, lệnh op xác thực qua app 1Password, có thể bằng Windows Hello hay vân tay. Bạn không cần dán session token vào terminal, nên Claude Code cũng không bao giờ thấy mật khẩu chính của bạn.

2. Xuất danh sách item, chỉ lấy metadata#

Terminal window
op item list --format json > items.json

Điểm quan trọng: op item list chỉ trả về metadata như tiêu đề, URL, tag, danh mục và vault. Mật khẩu không nằm trong đó. Trường additional_information thường chứa username, nên vẫn nên coi file này là dữ liệu nhạy cảm.

Đừng dùng tính năng export đầy đủ của app (.1pux hay CSV) cho việc này, vì các file đó có chứa mật khẩu.

Quy trình làm việc với Claude Code#

Câu lệnh đầu tiên của mình rất đơn giản:

tôi export items.json từ 1Password, hãy đọc và đề xuất Tags, gắn tag và giúp mình update vào 1password. Tag phải là tiếng anh.

Phần đáng nói là cách Claude Code xử lý yêu cầu này.

Bước 1: Xem cấu trúc trước khi đọc dữ liệu#

Claude không mở file ra đọc ngay. Nó viết một script nhỏ để in cấu trúc của JSON (tên khóa, kiểu dữ liệu, số lượng) mà không in giá trị nào. Nhờ đó nó biết đây là output của op item list, có 740 item, phần lớn là LOGIN, và tag cũ được phân bố ra sao.

Sau đó nó tạo một file chỉ mục gọn với tiêu đề, danh mục, domain và tag cũ, đồng thời cố ý bỏ qua additional_information vì trường đó chứa username. Nó chỉ dùng phần thông tin này để phân loại.

Bước 2: Đề xuất hệ tag#

Claude đề xuất một hệ tag phân cấp, vì 1Password hiển thị tag có dấu / thành dạng cây ở sidebar:

NhómVí dụ
FinanceFinance/Banking, Finance/Credit, Finance/Payments, Finance/Mortgage
BusinessBusiness/Ecommerce, Business/Shipping, Business/Print on Demand
TechTech/Hosting, Tech/Domains & SSL, Tech/Cloud, Tech/Dev, Tech/Monitoring
ShoppingShopping, Shopping/Fashion, Shopping/Electronics
Cá nhânGovernment, Health, Insurance, Travel, Education, Entertainment
Đặc biệtNotes, Needs Review, và tag riêng cho từng công ty

Việc phân loại dựa vào domain: một bảng quy tắc ánh xạ domain sang tag, trong đó domain cụ thể nhất được ưu tiên. Ví dụ ship.amazon.com được gắn Business/Shipping, signin.aws.amazon.com được gắn Tech/Cloud, còn amazon.com là Shopping. Những item mà URL bị thiếu hoặc không khớp với tiêu đề thì được chỉ định thủ công, hoặc gắn Needs Review.

Bước 3: Xem trước, chưa ghi gì#

Trước khi động vào 1Password, Claude tạo một file preview.csv gồm tiêu đề, domain, tag mới và tag cũ để mình mở bằng Excel, kèm bảng thống kê số item theo từng tag.

Nó cũng hỏi mình một quyết định mà nó không nên tự quyết: xử lý tag cũ thế nào. Lý do là op item edit --tags thay toàn bộ tag chứ không cộng thêm. Mình chọn thay hết, nhưng giữ các tag tên công ty vì chúng giúp phân biệt tài khoản của từng công ty. Mình còn bổ sung một quy tắc: tài khoản Etsy của công ty thì gắn tag công ty kèm Business/Ecommerce, không để chung với Shopping cá nhân. Claude cập nhật lại và cho mình xem preview lần nữa.

Bước 4: Kiểm tra lại dữ liệu thật trước khi ghi#

Khi mình đồng ý, Claude chưa ghi ngay mà lấy lại danh sách hiện tại từ vault và so với file export. Nó phát hiện vault chỉ còn 739 item thay vì 740: một item rác (dòng tiêu đề CSV bị import nhầm thành item name / url) đã bị xóa sau khi export. Nó bỏ qua item đó, và chỉ sửa những item có version vẫn khớp với lúc export. Cách này tránh ghi đè lên một thay đổi mình vừa làm trong app.

Bước 5: Chạy thử, và dừng lại khi có điều bất thường#

Claude chạy thử trên 5 item đại diện, gồm một login thường, một identity, một tag có ký tự & và hai secure note. Với mỗi item, script lấy hash toàn bộ nội dung trước và sau khi sửa (bỏ qua tag, version và thời gian cập nhật) để chắc chắn chỉ có tag thay đổi.

Ba item đạt, còn hai secure note thì báo hash bị thay đổi. Claude dừng lại, không chạy tiếp cho toàn bộ, và tìm nguyên nhân:

  • So hai lần op item get liên tiếp thì giống hệt nhau, nên hash không tự dao động.
  • Dùng op item edit --dry-run cũng không tái hiện được.
  • Sửa thật một note khác, rồi so từng đường dẫn trường (chỉ in tên trường và độ dài, không in giá trị). Kết quả cho thấy chỉ có trường additional_information thay đổi, từ không có thành có. Đây là dòng tóm tắt mà 1Password tự sinh khi lưu một item trước đó chưa có. Username, password, ghi chú và custom field đều giữ nguyên.

Sau đó script được chỉnh để chấp nhận đúng thay đổi đó: additional_information được phép xuất hiện nếu trước đó chưa có, còn mọi khác biệt khác vẫn bị báo lỗi.

Bước 6: Chạy toàn bộ và đối chiếu#

Script chạy nền với 4 luồng, ghi log để chạy lại tiếp được nếu bị ngắt giữa chừng, và tự thử lại khi gặp giới hạn tần suất. Kết quả là 733/733 item thành công, không có lỗi.

Cuối cùng, Claude đọc lại toàn bộ vault và so với kế hoạch:

tag mismatches: 0
items without tags: 0
distinct tags live: 56 | outside plan: []
version bumps != 1: Counter({1: 739})
title changed: 0
urls changed: 0

Phần thêm: gom tài khoản công ty cũ để xóa#

Sau đó mình nhờ:

thêm tag zDeleting và gom tất cả items liên quan đến [công ty cũ] để mình check và xóa

Lúc này Claude mới tìm cả trong username, nhưng chỉ in ra tên công ty khớp được chứ không in username. Kết quả là khoảng 80 item, trong khi chỉ khoảng 20 item có sẵn tag công ty. Phần lớn là tài khoản đăng ký bằng email công ty mà tiêu đề không hề nhắc đến công ty.

Lần này Claude chỉ thêm tag zDeleting và giữ nguyên các tag cũ, không xóa item nào. Tên bắt đầu bằng z để tag này nằm cuối sidebar. Claude cũng nhắc mình vài điều mình suýt bỏ qua:

  • Một số tài khoản trong nhóm đó là ngân hàng hay hồ sơ visa, chỉ tình cờ đăng ký bằng email công ty. Những item này cần xem kỹ trước khi xóa.
  • Xóa item trong 1Password không đóng tài khoản ở dịch vụ đó. Nếu mình không còn truy cập email công ty cũ, mất mật khẩu đồng nghĩa với việc không đặt lại được nữa. Với tài khoản còn dùng, nên đổi email trước rồi mới xóa.

Những điều mình rút ra#

  1. Dùng op item list thay vì export đầy đủ. Muốn gắn tag thì chỉ cần metadata. Claude Code không cần thấy mật khẩu để làm việc này.
  2. Luôn xem preview trước khi ghi. Một file CSV mở bằng Excel giúp rà nhanh hơn rất nhiều so với đọc log trong terminal.
  3. Nhớ rằng --tags thay toàn bộ tag. Muốn thêm tag thì phải truyền cả tag cũ lẫn tag mới.
  4. Chạy thử vài item trước. Lỗi additional_information chỉ xuất hiện với secure note. Nếu chạy cả 700 item ngay từ đầu, mình đã không biết nguyên nhân nằm ở đâu.
  5. Kiểm tra bằng hash, đừng in giá trị. Cách này xác nhận dữ liệu không đổi mà mật khẩu không bao giờ xuất hiện trong terminal hay trong log.
  6. Để AI dừng lại khi có điều bất thường. Điểm mình đánh giá cao nhất là Claude Code không cố chạy tiếp khi kết quả kiểm tra không khớp, mà dừng lại tìm hiểu rồi mới đi tiếp.
  7. Có thể gặp authorization timeout. Sau một đợt chạy dài, op thỉnh thoảng báo lỗi này. Mở khóa lại app 1Password và phê duyệt là chạy tiếp được.
  8. Dọn file tạm sau khi xong. File items.json chứa tiêu đề, URL và username, nên hãy xóa hoặc cất vào nơi an toàn khi không cần nữa.

Nếu kho mật khẩu của bạn cũng đang lộn xộn sau nhiều năm, bạn có thể thử cách này. Chỉ cần nhớ: xem trước, chạy thử, kiểm tra rồi mới làm hàng loạt.

Dùng Claude Code để gắn tag và dọn dẹp 1Password
https://jbngan.com/posts/sap-xep-1password-bang-claude-code/
Author
jbngan
Published at
2026-11-04
License
CC BY-NC-SA 4.0