85187dfc78
The Memory tab could only show this machine's user memory and the
dashboard's own project file. Setting up a project you had not run
through the dashboard meant opening a terminal — `PUT /file`'s
"project" scope always resolves against the server's cwd, on purpose.
Add one narrow route per tool that writes into the directory you name:
CLAUDE.md for Claude Code, AGENTS.md for Codex, both through the same
`project-memory.js`. Being the only write path that honours a
caller-supplied directory, it pays for that:
- the directory must be absolute and already exist — nothing is
created for you;
- the filename comes from the route, never from the body;
- an existing file, symlink included, is a 409 — this can only
create, never overwrite;
- it sits behind the loopback-Origin guard /api/run uses, so a page
in the user's browser cannot plant agent instructions in a project
directory. That guard moves to lib/same-origin.js to be shared.
The modal takes the dashboard's known project dirs as suggestions on a
free-text input rather than a closed list: a project it has never seen
is exactly the case this exists for.
Mutation-checked: dropping the origin guard, and swapping lstat for
stat, each fail a test.
124 lines
4.8 KiB
JSON
124 lines
4.8 KiB
JSON
{
|
|
"title": "Trình khám phá cấu hình Codex",
|
|
"subtitle": "Toàn cảnh thiết lập Codex CLI của bạn - skill, agent, rule, bộ nhớ AGENTS.md, config.toml, máy chủ MCP, plugin và marketplace.",
|
|
"refresh": "Làm mới",
|
|
"refreshing": "Đang làm mới…",
|
|
"lastUpdated": "Cập nhật lần cuối {{time}}",
|
|
"loadError": "Tải thất bại: {{message}}",
|
|
"scope": {
|
|
"all": "Tất cả phạm vi",
|
|
"user": "Người dùng",
|
|
"project": "Dự án"
|
|
},
|
|
"tabs": {
|
|
"overview": "Tổng quan",
|
|
"skills": "Skill",
|
|
"agents": "Agent",
|
|
"rules": "Rule",
|
|
"memory": "Bộ nhớ",
|
|
"config": "Cấu hình",
|
|
"mcp": "Máy chủ MCP",
|
|
"plugins": "Plugin"
|
|
},
|
|
"overview": {
|
|
"rootsTitle": "Thư mục gốc",
|
|
"codexHome": "Thư mục Codex",
|
|
"projectCodexDir": "Thư mục .codex của dự án",
|
|
"projectRoot": "Thư mục gốc dự án",
|
|
"summary": "Tóm tắt nhanh",
|
|
"user": "người dùng",
|
|
"project": "dự án"
|
|
},
|
|
"common": {
|
|
"search": "Tìm theo tên…",
|
|
"clearSearch": "Xóa tìm kiếm",
|
|
"close": "Đóng"
|
|
},
|
|
"list": {
|
|
"newButton": "Mới",
|
|
"viewButton": "Xem nguồn",
|
|
"editButton": "Sửa",
|
|
"deleteButton": "Xóa"
|
|
},
|
|
"edit": {
|
|
"saveSuccess": "Đã lưu · {{path}}",
|
|
"saveSuccessNew": "Đã tạo.",
|
|
"deleteSuccess": "Đã xóa · {{path}}",
|
|
"deleteError": "Xóa thất bại: {{message}}",
|
|
"templates": {
|
|
"skills": "---\nname: my-skill\ndescription: Mô tả một dòng (hiển thị khi Codex chọn skill)\n---\n\nNội dung - skill làm gì, khi nào dùng, ví dụ.\n",
|
|
"agents": "name = \"my-agent\"\ndescription = \"Khi nào gọi agent này\"\n\ninstructions = \"\"\"\nSystem prompt cho agent.\n\"\"\"\n",
|
|
"rules": "# Rules\n\nCodex tuân theo các quy tắc này ở phạm vi này.\n",
|
|
"memory": "# Bộ nhớ dự án\n\nCodex đọc tệp này khi bắt đầu phiên làm việc.\n",
|
|
"config": "# config.toml\n"
|
|
}
|
|
},
|
|
"memory": {
|
|
"missing": "Không tìm thấy AGENTS.md."
|
|
},
|
|
"projectMemory": {
|
|
"newButton": "Memory cho project khác",
|
|
"title": "Tạo {{file}} cho một project khác",
|
|
"dirLabel": "Thư mục project",
|
|
"dirHelp": "Đường dẫn tuyệt đối tới một project đã có trên máy. {{file}} sẽ được tạo bên trong; file đã tồn tại thì không bao giờ bị ghi đè.",
|
|
"dirRequired": "Cần nhập thư mục project",
|
|
"createButton": "Tạo",
|
|
"created": "Đã tạo {{path}}",
|
|
"template": "# Project memory\n\nProject này là gì, và những gì agent cần biết trước khi đụng vào.\n\n## Stack\n\n## Quy ước\n\n## Lệnh thường dùng\n",
|
|
"contentLabel": "Nội dung",
|
|
"cancel": "Huỷ",
|
|
"saving": "Đang tạo…",
|
|
"close": "Đóng"
|
|
},
|
|
"config": {
|
|
"missing": "Không tìm thấy config.toml."
|
|
},
|
|
"mcp": {
|
|
"addTitle": "Thêm máy chủ MCP",
|
|
"nameLabel": "Tên",
|
|
"modeCommand": "Lệnh",
|
|
"modeUrl": "URL",
|
|
"commandLabel": "Lệnh",
|
|
"argsLabel": "Tham số (cách nhau bằng dấu cách)",
|
|
"urlLabel": "URL",
|
|
"bearerLabel": "Biến môi trường bearer token (tùy chọn)",
|
|
"addButton": "Thêm",
|
|
"removeButton": "Gỡ bỏ",
|
|
"added": "Đã thêm {{name}}.",
|
|
"removed": "Đã gỡ bỏ {{name}}."
|
|
},
|
|
"plugins": {
|
|
"installTitle": "Cài đặt plugin",
|
|
"installPlaceholder": "tên hoặc tên@marketplace",
|
|
"installButton": "Thêm",
|
|
"removeButton": "Gỡ bỏ",
|
|
"installed": "Đã cài đặt {{name}}.",
|
|
"removed": "Đã gỡ bỏ {{name}}.",
|
|
"noPlugins": "Chưa cài đặt plugin nào.",
|
|
"marketplacesTitle": "Marketplace",
|
|
"addMarketplaceTitle": "Thêm marketplace",
|
|
"addMarketplacePlaceholder": "https://github.com/owner/repo",
|
|
"addMarketplaceButton": "Thêm",
|
|
"marketplaceAdded": "Đã thêm marketplace.",
|
|
"marketplaceRemoved": "Đã gỡ bỏ marketplace {{name}}."
|
|
},
|
|
"manage": {
|
|
"working": "Đang xử lý…",
|
|
"noIdentifier": "Mục này không có định danh ổn định - hãy gỡ trực tiếp từ CLI."
|
|
},
|
|
"cli": {
|
|
"unavailable": "CLI codex không có sẵn trên máy này ({{message}}) - cài đặt hoặc thêm vào PATH để quản lý mục này."
|
|
},
|
|
"backups": {
|
|
"openButton": "Bản sao lưu",
|
|
"title": "Bản sao lưu",
|
|
"subtitle": "Mỗi thao tác lưu / xoá đều ghi bản sao tới đây trước. Thư mục sao lưu nằm ngoài các vị trí CLI quét, nên không xuất hiện như mục thừa trong CLI.",
|
|
"empty": "Chưa có bản sao lưu - mỗi lần sửa hoặc xoá sẽ tạo bản sao có dấu thời gian.",
|
|
"restoreHint": "Khôi phục bằng cách đổi tên bản sao về vị trí cũ:"
|
|
},
|
|
"snippet": {
|
|
"copy": "Sao chép",
|
|
"copied": "Đã sao chép"
|
|
}
|
|
}
|