feat(shortcuts): add user key shortcuts #262

Closed
co63oc wants to merge 1 commits from co63oc/gitlink-cli:fix9 into master
9 changed files with 3629 additions and 7 deletions

View File

@ -117,7 +117,7 @@ The official [GitLink](https://www.gitlink.org.cn) CLI tool — built for humans
| 📖 Wiki | List, view, create, update, and delete wiki pages |
| 🔍 Search | Search repositories, users |
| 📊 Dataset | Query research datasets by project |
| 👤 User | View user profiles and info |
| 👤 User | View user profiles, manage keys, messages, projects, settings, and account |
| 📊 Profile | User ability, role, major, activity, and contribution statistics |
| 📋 PM | Sprint management, kanban boards, weekly reports |
| 🤖 Workflow | AI-powered issue triage, PR review, release notes |
@ -528,6 +528,51 @@ gitlink-cli search +repos -k "machine learning"
gitlink-cli search +users -k "zhangsan"
```
### SSH Key Management
```bash
# List SSH public keys for the current user
gitlink-cli user +keys
# List keys with pagination
gitlink-cli user +keys --page 1 --limit 10
# Add an SSH public key
gitlink-cli user +key-add --title "my-laptop" --key "ssh-rsa AAAA... user@host"
# Delete an SSH public key by ID
gitlink-cli user +key-delete --id 123
```
### User Operations
Manage user profile, projects, messages, and account settings:
```bash
# View current user info
gitlink-cli user +current-info
# Update user profile
gitlink-cli user +update --login alice --nickname "New Name" --province "Beijing"
# List user projects
gitlink-cli user +projects --login alice --page 1 --limit 15
# Manage messages
gitlink-cli user +messages-list --login alice --type notification
gitlink-cli user +messages-read --login alice --type notification --ids -1
# Starred projects
gitlink-cli user +pinned-list --login alice
gitlink-cli user +pinned-update --login alice --project-ids 17,23,42
# Submit feedback
gitlink-cli user +feedback --login alice --content "Great feature!"
# Account security
gitlink-cli user +change-password --login alice --old-password *** --new-password ***
```
### User Profile
`profile` surfaces GitLink's native user statistics (ability, role, major, activity,

View File

@ -116,7 +116,7 @@
| 📖 Wiki | 列出、查看、创建、更新、删除 Wiki 页面 |
| 🔍 搜索 | 搜索仓库、用户 |
| 📊 数据集 | 按项目查询科研数据集 |
| 👤 用户 | 查看用户资料和信息 |
| 👤 用户 | 查看用户资料、管理密钥、消息、项目、设置和账号 |
| 📊 画像 | 用户开发能力、角色定位、专业定位、近期活动、贡献热力图统计 |
| 📋 项目管理 | Sprint 管理、看板、周报 |
| 🤖 工作流 | AI 驱动的 Issue 分类、PR Review、Release Notes |
@ -506,6 +506,51 @@ gitlink-cli search +repos -k "machine learning"
gitlink-cli search +users -k "zhangsan"
```
### SSH 公钥管理
```bash
# 列出当前用户的 SSH 公钥
gitlink-cli user +keys
# 分页列出公钥
gitlink-cli user +keys --page 1 --limit 10
# 添加 SSH 公钥
gitlink-cli user +key-add --title "我的笔记本" --key "ssh-rsa AAAA... user@host"
# 根据 ID 删除 SSH 公钥
gitlink-cli user +key-delete --id 123
```
### 用户操作
管理用户资料、项目、消息和账号设置:
```bash
# 查看当前用户信息
gitlink-cli user +current-info
# 更新用户资料
gitlink-cli user +update --login alice --nickname "新昵称" --province "北京"
# 列出用户项目
gitlink-cli user +projects --login alice --page 1 --limit 15
# 消息管理
gitlink-cli user +messages-list --login alice --type notification
gitlink-cli user +messages-read --login alice --type notification --ids -1
# 星标项目
gitlink-cli user +pinned-list --login alice
gitlink-cli user +pinned-update --login alice --project-ids 17,23,42
# 提交反馈
gitlink-cli user +feedback --login alice --content "功能很棒!"
# 账号安全
gitlink-cli user +change-password --login alice --old-password *** --new-password ***
```
### 用户画像
`profile` 暴露 GitLink 原生的用户画像统计(开发能力、角色定位、专业定位、近期活动、贡献热力图)。

View File

@ -0,0 +1,129 @@
# User shortcuts 扩展
## Summary
`user` 命令组下新增大量 OpenAPI 支持的 shortcut涵盖 SSH 公钥管理、用户资料、项目、消息、星标项目、反馈、迁移、邮箱/手机/密码管理等。
## SSH 公钥管理
| Command | Method | Endpoint |
|---|---|---|
| `user +keys` | GET | `/api/public_keys.json` |
| `user +key-add` | POST | `/api/public_keys.json` |
| `user +key-delete` | DELETE | `/api/public_keys/{id}.json` |
### 用户操作扩展fix10
| Command | Method | Endpoint |
|---|---|---|
| `user +current-info` | GET | `/users/get_user_info.json` |
| `user +update` | PUT | `/users/{owner}.json` |
### 项目列表
| Command | Method | Endpoint |
|---|---|---|
| `user +projects` | GET | `/v1/{owner}/projects.json` |
### 消息管理
| Command | Method | Endpoint |
|---|---|---|
| `user +messages-list` | GET | `/users/{owner}/messages.json` |
| `user +messages-read` | POST | `/users/{owner}/messages/read.json` |
| `user +messages-delete` | DELETE | `/users/{owner}/messages.json` |
| `user +messages-create` | POST | `/users/{owner}/messages.json` |
### 消息设置
| Command | Method | Endpoint |
|---|---|---|
| `user +platform-settings` | GET | `/template_message_settings.json` |
| `user +user-settings` | GET | `/users/{owner}/template_message_settings.json` |
| `user +update-settings` | POST | `/users/{owner}/template_message_settings/update_setting.json` |
### 星标项目
| Command | Method | Endpoint |
|---|---|---|
| `user +pinned-list` | GET | `/users/{owner}/is_pinned_projects.json` |
| `user +pinned-update` | POST | `/users/{owner}/is_pinned_projects/pin.json` |
| `user +pinned-sort` | PUT | `/users/{owner}/is_pinned_projects/{id}.json` |
### 反馈与迁移
| Command | Method | Endpoint |
|---|---|---|
| `user +feedback` | POST | `/v1/{owner}/feedbacks.json` |
| `user +transfer-list` | GET | `/users/{owner}/applied_transfer_projects.json` |
| `user +transfer-accept` | POST | `/users/{owner}/applied_transfer_projects/{id}/accept.json` |
| `user +transfer-refuse` | POST | `/users/{owner}/applied_transfer_projects/{id}/refuse.json` |
### 邮箱与手机
| Command | Method | Endpoint |
|---|---|---|
| `user +send-email-code` | GET | `/v1/{owner}/send_email_vefify_code.json` |
| `user +verify-email-code` | POST | `/v1/{owner}/check_email_verify_code.json` |
| `user +check-email` | GET | `/v1/{owner}/check_email.json` |
| `user +update-email` | POST | `/v1/{owner}/update_email.json` |
| `user +update-phone` | POST | `/v1/{owner}/update_phone.json` |
### 密码与账号
| Command | Method | Endpoint |
|---|---|---|
| `user +check-password` | POST | `/accounts/check_password.json` |
| `user +change-password` | POST | `/accounts/change_password.json` |
| `user +check-delete` | POST | `/v1/{owner}/check_user_can_delete.json` |
| `user +delete-account` | DELETE | `/v1/{owner}.json` |
### 项目申请
| Command | Method | Endpoint |
|---|---|---|
| `user +applied-list` | GET | `/users/{owner}/applied_projects.json` |
| `user +applied-accept` | POST | `/users/{owner}/applied_projects/{id}/accept.json` |
| `user +applied-refuse` | POST | `/users/{owner}/applied_projects/{id}/refuse.json` |
## 使用示例
```bash
# 获取当前用户详细信息
gitlink-cli user +current-info
# 更新用户资料
gitlink-cli user +update --login alice --nickname "新昵称" --gender 0 --province "广东" --city "深圳"
# 列出用户项目
gitlink-cli user +projects --login alice --page 1 --limit 15
# 消息管理
gitlink-cli user +messages-list --login alice --type notification
gitlink-cli user +messages-read --login alice --type notification --ids -1
# 星标项目
gitlink-cli user +pinned-list --login alice
gitlink-cli user +pinned-update --login alice --project-ids 17,23,42
# 提交反馈
gitlink-cli user +feedback --login alice --content "希望增加批量操作功能"
# 更改密码
gitlink-cli user +change-password --login alice --old-password *** --new-password *** --new-password-repeat newpass456
```
## 国际化支持
所有新增 shortcut 均已添加中英文翻译,通过 `tr.T()` 获取描述和帮助文本。
## 测试覆盖
所有新增 shortcut 均有对应的单元测试,覆盖:
- 正常执行路径
- 参数缺失校验
- HTTP 错误处理
```bash
go test ./shortcuts/user/ -v
```

View File

@ -94,6 +94,12 @@
"cmd.search.short": "Search operations",
"cmd.search.users.short": "Search users",
"cmd.user.info.short": "Show user profile",
"cmd.user.keys.short": "List SSH public keys",
"cmd.user.key_add.short": "Add an SSH public key",
"cmd.user.key_delete.short": "Delete an SSH public key",
"flag.user.key_title": "Key title (name)",
"flag.user.key_content": "SSH public key content",
"flag.user.key_id": "Public key ID",
"cmd.user.me.short": "Show current authenticated user",
"cmd.user.short": "User operations",
"cmd.version.short": "Print version information",
@ -259,6 +265,11 @@
"prompt.auth.password": "Password: ",
"prompt.auth.token": "Paste your access token: ",
"prompt.auth.username": "Username/Email/Phone: ",
"prompt.user.password": "Password: ",
"prompt.user.old_password": "Current password: ",
"prompt.user.new_password": "New password: ",
"prompt.user.new_password_repeat": "Confirm new password: ",
"prompt.user.key_content": "SSH public key: ",
"success.auth.logged_in_as": "✓ Logged in as {login}",
"success.auth.logged_in_via_env": "✓ Logged in via {env} environment variable",
"success.auth.logged_out": "✓ Logged out",
@ -267,5 +278,105 @@
"success.config.set": "✓ {key} = {value}",
"warning.auth.not_logged_in": "✗ Not logged in",
"warning.auth.token_unverified": "✓ Token stored (but cannot verify: {message})",
"warning.auth.user_unavailable": "✓ Token stored (user info unavailable)"
}
"warning.auth.user_unavailable": "✓ Token stored (user info unavailable)",
"cmd.user.update.short": "Update user profile",
"cmd.user.update.long": "Update user nickname, gender, province, city, description and department.",
"cmd.user.projects.short": "List user projects",
"cmd.user.projects.long": "List projects for a given user with category, sort and search filters.",
"flag.user.nickname": "User nickname",
"flag.user.gender": "User gender (integer)",
"flag.user.province": "User province",
"flag.user.city": "User city",
"flag.user.description": "User bio / description",
"flag.user.custom_department": "User department / organization",
"flag.user.projects_category": "Project category: all/join/created/manage/only_watched/watched/forked",
"flag.user.projects_is_public": "Filter by public visibility",
"flag.user.projects_project_type": "Project type: common/mirror/sync_mirror",
"flag.user.projects_search": "Search keyword",
"cmd.user.current_info.short": "Show current user info (detailed)",
"cmd.user.current_info.long": "Fetch detailed information for the currently authenticated user via /api/users/get_user_info.json.",
"flag.user.projects_start_at": "Start timestamp (only for watched/only_watched/forked categories)",
"flag.user.projects_end_at": "End timestamp (only for watched/only_watched/forked categories)",
"cmd.user.messages_list.short": "List user messages",
"cmd.user.messages_list.long": "List messages for the current user, with optional type and status filters.",
"cmd.user.messages_read.short": "Mark messages as read",
"cmd.user.messages_read.long": "Mark specified messages as read. Use --ids=-1 to mark all unread messages as read.",
"cmd.user.messages_delete.short": "Delete messages",
"cmd.user.messages_delete.long": "Delete specified messages. Use --ids=-1 to delete all messages of the given type.",
"flag.user.messages_type": "Message type: notification or atme (default: all)",
"flag.user.messages_status": "Read status: 1=unread, 2=read (default: all)",
"flag.user.messages_ids": "Comma-separated message IDs (use -1 for all)",
"cmd.user.messages_create.short": "Create a message (@me notification)",
"cmd.user.messages_create.long": "Create a message notification for specified users. Requires --receivers (comma-separated logins), --atmeable-type (Journal/Issue/PullRequest), and --atmeable-id.",
"cmd.user.platform_settings.short": "Get platform message settings",
"cmd.user.platform_settings.long": "Get the platform-wide message setting templates, showing all configurable notification categories.",
"cmd.user.user_settings.short": "Get user message settings",
"cmd.user.user_settings.long": "Get the current user's notification and email settings for all message categories.",
"flag.user.messages_receivers": "Comma-separated receiver login names",
"flag.user.messages_atmeable_type": "AT target type: Journal, Issue, or PullRequest",
"flag.user.messages_atmeable_id": "AT target object ID",
"cmd.user.update_settings.short": "Update user message settings",
"cmd.user.update_settings.long": "Update user notification and email settings, toggling each category on or off.",
"flag.user.settings_notification": "Comma-separated categories to enable for in-app notifications (e.g. CreateOrAssign::IssueAssigned,ManageProject::Issue)",
"flag.user.settings_email": "Comma-separated categories to enable for email notifications",
"flag.user.settings_notification_off": "Comma-separated categories to disable for in-app notifications",
"flag.user.settings_email_off": "Comma-separated categories to disable for email notifications",
"cmd.user.pinned_list.short": "List pinned projects",
"cmd.user.pinned_list.long": "List the user's pinned/starred projects with basic info and sort position.",
"cmd.user.pinned_update.short": "Update pinned projects",
"cmd.user.pinned_update.long": "Batch-set the user's pinned/starred projects by passing a list of project IDs.",
"flag.user.pinned_project_ids": "Comma-separated project IDs to pin",
"cmd.user.pinned_sort.short": "Reorder a pinned project",
"cmd.user.pinned_sort.long": "Adjust the display order of a pinned project. Higher position = higher rank.",
"flag.user.pinned_id": "Pinned project ID",
"flag.user.pinned_position": "Sort position (higher number = higher rank)",
"cmd.user.feedback.short": "Submit feedback",
"cmd.user.feedback.long": "Submit feedback or suggestions to the GitLink platform.",
"flag.user.feedback_content": "Feedback content",
"cmd.user.transfer_list.short": "List project transfer requests",
"cmd.user.transfer_list.long": "List pending project transfer requests for the specified user, with optional pagination.",
"cmd.user.transfer_accept.short": "Accept project transfer",
"cmd.user.transfer_accept.long": "Accept a project transfer request initiated by the specified user.",
"flag.user.transfer_id": "Transfer request ID",
"cmd.user.transfer_refuse.short": "Refuse project transfer",
"cmd.user.transfer_refuse.long": "Refuse a project transfer request initiated by the specified user.",
"cmd.user.send_email_code.short": "Send email verification code",
"cmd.user.send_email_code.long": "Send a verification code to the specified email for email change.",
"flag.user.email_code_type": "Verification code type (10: update email)",
"flag.user.email": "Target email address",
"flag.user.email_md5": "Email MD5 hash value",
"cmd.user.verify_email_code.short": "Verify email code",
"cmd.user.verify_email_code.long": "Verify the email verification code received.",
"flag.user.verify_code": "Verification code",
"cmd.user.check_password.short": "Verify user password",
"cmd.user.check_password.long": "Verify the current user login password is correct.",
"flag.user.password": "User password",
"cmd.user.applied_list.short": "List project applications",
"cmd.user.applied_list.long": "List pending project join applications (paginated).",
"flag.user.applied_page": "Page number",
"flag.user.applied_per_page": "Items per page",
"cmd.user.applied_accept.short": "Accept project application",
"cmd.user.applied_accept.long": "Accept the specified user project join application.",
"flag.user.applied_id": "Application ID",
"cmd.user.applied_refuse.short": "Refuse project application",
"cmd.user.applied_refuse.long": "Refuse the specified user project join application.",
"cmd.user.check_email.short": "Check email availability",
"cmd.user.check_email.long": "Check if the specified email is already in use.",
"cmd.user.update_email.short": "Change email",
"cmd.user.update_email.long": "Change the user bound email (requires password and email verification code).",
"flag.user.email_code": "Email verification code",
"cmd.user.update_phone.short": "Change phone number",
"cmd.user.update_phone.long": "Change the user bound phone number (requires SMS code).",
"flag.user.phone": "Target phone number",
"flag.user.phone_code": "SMS verification code",
"cmd.user.change_password.short": "Change password",
"cmd.user.change_password.long": "Change the current user login password.",
"flag.user.old_password": "Current password",
"flag.user.new_password": "New password",
"flag.user.new_password_repeat": "Confirm new password",
"cmd.user.check_delete.short": "Check if account can be deleted",
"cmd.user.check_delete.long": "Check if the current user meets deletion criteria (no orgs/projects).",
"cmd.user.delete_account.short": "Delete account",
"cmd.user.delete_account.long": "Permanently delete the user account (irreversible). Confirm before executing.",
"flag.user.delete_memo": "Deletion reason"
}

View File

@ -94,6 +94,12 @@
"cmd.search.short": "搜索操作",
"cmd.search.users.short": "搜索用户",
"cmd.user.info.short": "显示用户资料",
"cmd.user.keys.short": "列出 SSH 公钥",
"cmd.user.key_add.short": "添加 SSH 公钥",
"cmd.user.key_delete.short": "删除 SSH 公钥",
"flag.user.key_title": "公钥标题(名称)",
"flag.user.key_content": "SSH 公钥内容",
"flag.user.key_id": "公钥 ID",
"cmd.user.me.short": "显示当前认证用户",
"cmd.user.short": "用户操作",
"cmd.version.short": "打印版本信息",
@ -259,6 +265,11 @@
"prompt.auth.password": "密码:",
"prompt.auth.token": "粘贴你的访问 Token",
"prompt.auth.username": "用户名/邮箱/手机号:",
"prompt.user.password": "密码:",
"prompt.user.old_password": "当前密码:",
"prompt.user.new_password": "新密码:",
"prompt.user.new_password_repeat": "确认新密码:",
"prompt.user.key_content": "SSH 公钥:",
"success.auth.logged_in_as": "✓ 已登录为 {login}",
"success.auth.logged_in_via_env": "✓ 已通过 {env} 环境变量登录",
"success.auth.logged_out": "✓ 已退出登录",
@ -267,5 +278,105 @@
"success.config.set": "✓ 已设置 {key} = {value}",
"warning.auth.not_logged_in": "✗ 未登录",
"warning.auth.token_unverified": "✓ Token 已保存(但无法验证:{message}",
"warning.auth.user_unavailable": "✓ Token 已保存(用户信息不可用)"
}
"warning.auth.user_unavailable": "✓ Token 已保存(用户信息不可用)",
"cmd.user.update.short": "更新用户信息",
"cmd.user.update.long": "更新用户的昵称、性别、省份、城市、简介和单位等扩展信息。",
"cmd.user.projects.short": "列出用户项目",
"cmd.user.projects.long": "列出指定用户的项目列表,支持分类、排序和搜索筛选。",
"flag.user.nickname": "用户昵称",
"flag.user.gender": "用户性别(整数)",
"flag.user.province": "用户所在省份",
"flag.user.city": "用户所在城市",
"flag.user.description": "用户简介",
"flag.user.custom_department": "用户所在单位",
"flag.user.projects_category": "项目分类all/join/created/manage/only_watched/watched/forked",
"flag.user.projects_is_public": "是否为公有项目",
"flag.user.projects_project_type": "项目类型common/mirror/sync_mirror",
"flag.user.projects_search": "搜索关键词",
"cmd.user.current_info.short": "获取当前用户详细信息",
"cmd.user.current_info.long": "通过 /api/users/get_user_info.json 获取当前认证用户的详细资料。",
"flag.user.projects_start_at": "开始时间戳(仅对 watched/only_watched/forked 分类有效)",
"flag.user.projects_end_at": "结束时间戳(仅对 watched/only_watched/forked 分类有效)",
"cmd.user.messages_list.short": "列出用户消息",
"cmd.user.messages_list.long": "列出当前用户的消息,支持按类型和已读状态筛选。",
"cmd.user.messages_read.short": "标记消息为已读",
"cmd.user.messages_read.long": "将指定消息标记为已读。使用 --ids=-1 可将所有未读消息标记为已读。",
"cmd.user.messages_delete.short": "删除消息",
"cmd.user.messages_delete.long": "删除指定消息。使用 --ids=-1 可删除指定类型的所有消息。",
"flag.user.messages_type": "消息类型notification系统消息或 atme@我消息),不传为全部",
"flag.user.messages_status": "已读状态1=未读2=已读(不传为全部)",
"flag.user.messages_ids": "消息ID列表逗号分隔使用 -1 表示全部)",
"cmd.user.messages_create.short": "创建消息(@我通知)",
"cmd.user.messages_create.long": "为指定用户创建@我消息通知。需要 --receivers逗号分隔的用户名、--atmeable-typeJournal/Issue/PullRequest和 --atmeable-id。",
"cmd.user.platform_settings.short": "获取平台消息设置",
"cmd.user.platform_settings.long": "获取平台级别的消息设置模板,展示所有可配置的通知分类。",
"cmd.user.user_settings.short": "获取用户消息设置",
"cmd.user.user_settings.long": "获取当前用户所有消息分类的站内信和邮件设置。",
"flag.user.messages_receivers": "接收消息的用户名列表,逗号分隔",
"flag.user.messages_atmeable_type": "@目标类型Journal评论、Issue疑修、PullRequest合并请求",
"flag.user.messages_atmeable_id": "@目标对象ID",
"cmd.user.update_settings.short": "更新用户消息设置",
"cmd.user.update_settings.long": "更新用户的站内信和邮件通知设置,支持批量设置各分类的开关状态。",
"flag.user.settings_notification": "站内信设置,逗号分隔的分类列表(如 CreateOrAssign::IssueAssigned,ManageProject::Issue设为 true",
"flag.user.settings_email": "邮件设置,逗号分隔的分类列表,设为 true",
"flag.user.settings_notification_off": "站内信设置,逗号分隔的分类列表,设为 false",
"flag.user.settings_email_off": "邮件设置,逗号分隔的分类列表,设为 false",
"cmd.user.pinned_list.short": "列出用户星标项目",
"cmd.user.pinned_list.long": "列出用户精选/星标的项目列表,包含项目基本信息和排序位置。",
"cmd.user.pinned_update.short": "更新用户星标项目",
"cmd.user.pinned_update.long": "批量设置用户的星标/精选项目,传入项目 ID 列表。",
"flag.user.pinned_project_ids": "要设为星标的项目 ID 列表,逗号分隔",
"cmd.user.pinned_sort.short": "调整星标项目排序",
"cmd.user.pinned_sort.long": "调整指定星标项目的显示顺序,数字越大排名越靠前。",
"flag.user.pinned_id": "星标项目 ID",
"flag.user.pinned_position": "排序位置(数字越大越靠前)",
"cmd.user.feedback.short": "提交反馈建议",
"cmd.user.feedback.long": "向 GitLink 平台提交反馈建议或意见。",
"flag.user.feedback_content": "反馈内容",
"cmd.user.transfer_list.short": "列出项目迁移请求",
"cmd.user.transfer_list.long": "列出指定用户的待接受项目迁移请求,支持分页。",
"cmd.user.transfer_accept.short": "接受项目迁移",
"cmd.user.transfer_accept.long": "接受指定用户发起的项目迁移请求。",
"flag.user.transfer_id": "迁移请求 ID",
"cmd.user.transfer_refuse.short": "拒绝项目迁移",
"cmd.user.transfer_refuse.long": "拒绝指定用户发起的项目迁移请求。",
"cmd.user.send_email_code.short": "发送邮箱验证码",
"cmd.user.send_email_code.long": "向指定邮箱发送验证码,用于邮箱变更验证。",
"flag.user.email_code_type": "验证码类型10: 更新邮箱)",
"flag.user.email": "目标邮箱地址",
"flag.user.email_md5": "邮箱 MD5 加密值",
"cmd.user.verify_email_code.short": "验证邮箱验证码",
"cmd.user.verify_email_code.long": "验证用户收到的邮箱验证码是否正确。",
"flag.user.verify_code": "验证码",
"cmd.user.check_password.short": "验证用户密码",
"cmd.user.check_password.long": "验证当前用户的登录密码是否正确。",
"flag.user.password": "用户密码",
"cmd.user.applied_list.short": "列出项目申请",
"cmd.user.applied_list.long": "列出待处理的项目加入申请(分页)。",
"flag.user.applied_page": "页码",
"flag.user.applied_per_page": "每页个数",
"cmd.user.applied_accept.short": "接受项目申请",
"cmd.user.applied_accept.long": "接受指定用户的项目加入申请。",
"flag.user.applied_id": "申请 ID",
"cmd.user.applied_refuse.short": "拒绝项目申请",
"cmd.user.applied_refuse.long": "拒绝指定用户的项目加入申请。",
"cmd.user.check_email.short": "验证邮箱可用性",
"cmd.user.check_email.long": "检查指定邮箱是否已被占用。",
"cmd.user.update_email.short": "更改邮箱",
"cmd.user.update_email.long": "更改用户绑定的邮箱地址(需先验证密码和邮箱验证码)。",
"flag.user.email_code": "邮箱验证码",
"cmd.user.update_phone.short": "更改手机号",
"cmd.user.update_phone.long": "更改用户绑定的手机号(需手机验证码)。",
"flag.user.phone": "目标手机号",
"flag.user.phone_code": "手机验证码",
"cmd.user.change_password.short": "更改密码",
"cmd.user.change_password.long": "修改当前用户的登录密码。",
"flag.user.old_password": "当前密码",
"flag.user.new_password": "新密码",
"flag.user.new_password_repeat": "新密码确认",
"cmd.user.check_delete.short": "检测账号是否可注销",
"cmd.user.check_delete.long": "检测当前用户是否满足注销条件(无组织/项目)。",
"cmd.user.delete_account.short": "注销账号",
"cmd.user.delete_account.long": "永久删除用户账号(不可恢复)。执行前务必二次确认。",
"flag.user.delete_memo": "删除原因"
}

View File

@ -0,0 +1,57 @@
package common
import (
"bufio"
"fmt"
"io"
"os"
"strings"
"golang.org/x/term"
)
// ReadSecret reads a sensitive value (password, key, etc.) interactively.
// If the value is already provided via flag (non-empty), it is returned as-is.
// Otherwise it prompts on the terminal, hiding input when possible.
func ReadSecret(flagValue, prompt string) (string, error) {
if flagValue != "" {
return flagValue, nil
}
return readSecretFromTerminal(os.Stdin, os.Stderr, prompt)
}
// ReadLine reads a non-sensitive value interactively.
// If the value is already provided via flag (non-empty), it is returned as-is.
func ReadLine(flagValue, prompt string) (string, error) {
if flagValue != "" {
return flagValue, nil
}
reader := bufio.NewReader(os.Stdin)
fmt.Fprint(os.Stderr, prompt)
line, err := reader.ReadString('\n')
if err != nil && err != io.EOF {
return "", err
}
return strings.TrimRight(line, "\r\n"), nil
}
func readSecretFromTerminal(in io.Reader, out io.Writer, prompt string) (string, error) {
fmt.Fprint(out, prompt)
if file, ok := in.(*os.File); ok {
fd := int(file.Fd())
if term.IsTerminal(fd) {
buf, err := term.ReadPassword(fd)
if err != nil {
return "", err
}
fmt.Fprintln(out)
return string(buf), nil
}
}
reader := bufio.NewReader(in)
line, err := reader.ReadString('\n')
if err != nil && err != io.EOF {
return "", err
}
return strings.TrimRight(line, "\r\n"), nil
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
---
name: gitlink-user
version: 1.0.0
description: "用户操作:查看当前用户、用户详情。当用户需要查看 GitLink 用户信息时触发。"
description: "用户操作:查看当前用户、用户详情、SSH 公钥管理、关注/取关、更新资料、项目列表、消息设置、星标项目、反馈建议、项目迁移、邮箱验证、密码验证、项目申请、邮箱变更、手机变更、更改密码、注销、活动统计、贡献热力图、开发能力、角色定位、专业定位。当用户需要查看或管理 GitLink 用户信息时触发。"
metadata:
requires:
bins: ["gitlink-cli"]
@ -21,7 +21,44 @@ metadata:
| Shortcut | 说明 | 需要认证 |
|----------|------|----------|
| `user +me` | 当前登录用户 | 是 |
| `user +current-info` | 当前用户详细信息 | 是 |
| `user +info` | 查看用户详情 | 否 |
| `user +keys` | 列出当前用户的 SSH 公钥 | 是 |
| `user +key-add` | 添加 SSH 公钥 | 是 |
| `user +key-delete` | 删除 SSH 公钥 | 是 |
| `user +activity` | 用户近期活动统计 | 是 |
| `user +headmaps` | 用户贡献度统计(热力图) | 是 |
| `user +develop` | 用户开发能力统计 | 是 |
| `user +role` | 用户角色定位统计 | 是 |
| `user +major` | 用户专业定位统计 | 是 |
| `user +update` | 更新用户资料 | 是 |
| `user +projects` | 用户项目列表 | 是 |
| `user +messages-list` | 列出用户消息 | 是 |
| `user +messages-read` | 标记消息为已读 | 是 |
| `user +messages-delete` | 删除消息 | 是 |
| `user +messages-create` | 创建@我消息通知 | 是 |
| `user +platform-settings` | 获取平台消息设置模板 | 是 |
| `user +user-settings` | 获取用户消息设置 | 是 |
| `user +update-settings` | 更新用户消息设置(站内信/邮件) | 是 |
| `user +pinned-list` | 列出用户星标项目 | 是 |
| `user +pinned-update` | 批量更新星标项目 | 是 |
| `user +pinned-sort` | 调整星标项目排序 | 是 |
| `user +feedback` | 提交反馈建议 | 是 |
| `user +transfer-list` | 列出项目迁移请求 | 是 |
| `user +transfer-accept` | 接受项目迁移 | 是 |
| `user +transfer-refuse` | 拒绝项目迁移 | 是 |
| `user +send-email-code` | 发送邮箱验证码 | 是 |
| `user +verify-email-code` | 验证邮箱验证码 | 是 |
| `user +check-password` | 验证用户密码 | 是 |
| `user +applied-list` | 列出项目申请 | 是 |
| `user +applied-accept` | 接受项目申请 | 是 |
| `user +applied-refuse` | 拒绝项目申请 | 是 |
| `user +check-email` | 验证邮箱可用性 | 是 |
| `user +update-email` | 更改邮箱 | 是 |
| `user +update-phone` | 更改手机号 | 是 |
| `user +change-password` | 更改密码 | 是 |
| `user +check-delete` | 检测账号是否可注销 | 是 |
| `user +delete-account` | 注销账号(不可恢复) | 是 |
## 使用示例
@ -29,10 +66,144 @@ metadata:
# 查看当前用户
gitlink-cli user +me
# 获取当前用户详细信息
gitlink-cli user +current-info
# 查看其他用户
gitlink-cli user +info --login zhangsan
# 用户近期活动统计
gitlink-cli user +activity --login zhangsan
# 用户贡献热力图
gitlink-cli user +headmaps --login zhangsan
# 用户开发能力统计
gitlink-cli user +develop --login zhangsan
# 用户角色定位
gitlink-cli user +role --login zhangsan
# 用户专业定位
gitlink-cli user +major --login zhangsan
# 列出 SSH 公钥
gitlink-cli user +keys
# 添加 SSH 公钥
gitlink-cli user +key-add --title "my-laptop" --key "ssh-rsa AAAA... user@host"
# 删除 SSH 公钥(根据 ID
gitlink-cli user +key-delete --id 123
# 更新用户资料
gitlink-cli user +update --login yystopf --nickname "新昵称" --gender 0 --province "广东" --city "深圳" --description "个性签名" --custom-department "某单位"
# 列出用户项目
gitlink-cli user +projects --login zhangsan --page 1 --limit 15 --category created
# 搜索用户项目
gitlink-cli user +projects --login zhangsan --search "关键词" --sort-by updated_at --sort-direction desc
# 列出用户消息
gitlink-cli user +messages-list --login alice --type notification --status 1
# 标记消息已读(全部)
gitlink-cli user +messages-read --login alice --type notification --ids -1
# 标记指定消息已读
gitlink-cli user +messages-read --login alice --type atme --ids 101,102,103
# 删除消息
gitlink-cli user +messages-delete --login alice --type atme --ids 201,202
# 创建@我消息通知
gitlink-cli user +messages-create --login alice --receivers bob,carol --atmeable-type Issue --atmeable-id 123
# 获取平台消息设置模板
gitlink-cli user +platform-settings
# 获取用户消息设置
gitlink-cli user +user-settings --login alice
# 更新用户消息设置(开启站内信、关闭邮件)
gitlink-cli user +update-settings --login alice \
--notification "CreateOrAssign::IssueAssigned,ManageProject::Issue" \
--email "Normal::Permission" \
--notification-off "ManageProject::Member" \
--email-off "Normal::Organization"
# 列出用户星标项目
gitlink-cli user +pinned-list --login alice
# 批量更新星标项目
gitlink-cli user +pinned-update --login alice --project-ids 17,23,42
# 调整星标项目排序(数字越大越靠前)
gitlink-cli user +pinned-sort --login alice --pinned-id 5 --position 10
# 提交反馈建议
gitlink-cli user +feedback --login alice --content "希望增加批量操作功能"
# 接受项目迁移
gitlink-cli user +transfer-accept --login alice --transfer-id 42
# 拒绝项目迁移
gitlink-cli user +transfer-refuse --login alice --transfer-id 42
# 发送邮箱验证码(用于更新邮箱)
gitlink-cli user +send-email-code --login alice --code-type 10 --email new@example.com --email-md5 abc123md5hash
# 验证邮箱验证码
gitlink-cli user +verify-email-code --login alice --code-type 10 --email new@example.com --code 123456
# 验证用户密码
gitlink-cli user +check-password --login alice --password mysecretpass
# 列出项目申请(支持分页)
gitlink-cli user +applied-list --login alice --page 1 --per-page 10
# 接受项目申请
gitlink-cli user +applied-accept --login alice --applied-id 7
# 拒绝项目申请
gitlink-cli user +applied-refuse --login alice --applied-id 7
# 检查邮箱是否可用
gitlink-cli user +check-email --login alice --email new@example.com
# 更改邮箱(需先发送验证码)
gitlink-cli user +update-email --login alice --password *** --email new@example.com --code 123456
# 更改手机号(需手机验证码)
gitlink-cli user +update-phone --login alice --phone 13800138000 --code 654321 --password ***
# 更改密码
gitlink-cli user +change-password --login alice --old-password *** --new-password *** --new-password-repeat newpass456
# 检测账号是否可注销
gitlink-cli user +check-delete --login alice
# 注销账号(⚠️ 不可恢复)
gitlink-cli user +delete-account --login alice --password *** --memo "不再使用"
```
## 消息设置分类
更新消息设置(`+update-settings`)时,`--notification` / `--email` / `--notification-off` / `--email-off` 支持以下分类 key
| 分类 Key | 说明 |
|----------|------|
| `CreateOrAssign::IssueAssigned` | 创建或指派给我的疑修 |
| `CreateOrAssign::PullRequestAssigned` | 创建或指派给我的合并请求 |
| `ManageProject::Issue` | 我管理的项目的疑修 |
| `ManageProject::PullRequest` | 我管理的项目的合并请求 |
| `ManageProject::Member` | 我管理的项目的成员变更 |
| `ManageProject::SettingChanged` | 我管理的项目的设置变更 |
| `Normal::Organization` | 组织相关通知 |
| `Normal::Project` | 项目相关通知 |
| `Normal::Permission` | 权限变更通知 |
## Raw API 补充
```bash