@lionad/port-key-skills 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # 更新日志
2
+
3
+ ## v0.6.0
4
+
5
+ - chore: sync version
6
+
7
+ ## v0.5.0
8
+
9
+ - 增加 @lionad/port-key-skills
package/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 Lionad
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # PortKey Skills
2
+
3
+ 本目录包含基于 `SKILL.md` 定义的 Agent Skills。
4
+
5
+ ## 目录结构
6
+
7
+ 所有技能按以下结构组织:
8
+
9
+ ```
10
+ skills/<skill-name>/SKILL.md
11
+ ```
12
+
13
+ ## 使用方式
14
+
15
+ 如果你使用 `npx skills` 生态工具,可以通过 GitHub 仓库路径安装或列出技能:
16
+
17
+ ```bash
18
+ npx -y skills add https://github.com/Lionad-Morotar/port-key/tree/main/packages/skills --list
19
+ npx -y skills add https://github.com/Lionad-Morotar/port-key/tree/main/packages/skills --skill smart-port-allocation
20
+ ```
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@lionad/port-key-skills",
3
+ "version": "0.6.0",
4
+ "description": "Agent skills for PortKey",
5
+ "files": [
6
+ "skills",
7
+ "CHANGELOG.md",
8
+ "README.md",
9
+ "LICENSE"
10
+ ],
11
+ "author": "Lionad",
12
+ "license": "ISC",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/Lionad-Morotar/port-key.git"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/Lionad-Morotar/port-key/issues"
19
+ },
20
+ "homepage": "https://github.com/Lionad-Morotar/port-key#readme",
21
+ "engines": {
22
+ "node": ">=16"
23
+ },
24
+ "publishConfig": {
25
+ "registry": "https://registry.npmjs.org/"
26
+ },
27
+ "scripts": {
28
+ "build": "echo 'skip build steps in packages/skills'",
29
+ "test": "echo 'skip test steps in packages/skills'"
30
+ }
31
+ }
@@ -0,0 +1,159 @@
1
+ ---
2
+ name: smart-port-allocation
3
+ description: 根据项目名称通过键盘映射算法生成可记忆的端口号,解决本地开发多项目端口冲突问题;支持微服务架构端口分配、前后端组件端口规划
4
+ ---
5
+
6
+ # 智能端口分配助手
7
+
8
+ ## 任务目标
9
+ - 本 Skill 用于:根据项目名称自动生成可记忆且不易冲突的端口号
10
+ - 能力包含:键盘映射算法、端口合法性验证、候选端口智能选择、多端口策略支持
11
+ - 触发条件:启动本地多个服务、配置项目前后端端口、微服务架构端口分配
12
+
13
+ ## 前置准备
14
+ - 无需安装额外依赖,使用 npx 直接调用 port-key 工具
15
+ - 确保系统已安装 Node.js 和 npm(port-key 通过 npx 自动下载和执行)
16
+
17
+ ## 操作步骤
18
+ - 标准流程:
19
+ 1. **处理项目名称**
20
+ - **短名称规则**:如果项目名称较短(1-2 个单词或 1-8 个字母),直接使用完整名称
21
+ - 示例:`"dashboard"` → `"dashboard"`
22
+ - 示例:`"myapp"` → `"myapp"`
23
+ - **长名称规则**:如果项目名称较长(多个单词或超过 8 个字母),提取每个单词的首字母
24
+ - 示例:`"我爱我家"` → `"wawj"`
25
+ - 示例:`"user authentication service"` → `"uas"`
26
+ - 示例:`"ecommerce payment gateway"` → `"epg"`
27
+ - 示例:`"enterprise resource planning system"` → `"erps"`
28
+ - **混合语言支持**:自动识别中英文,提取拼音或英文字母的首字母
29
+
30
+ 2. **生成单个项目端口**
31
+ - 使用 npx 调用 port-key 工具
32
+ - 示例:`npx -y @lionad/port-key "myproject"` → 默认配置下输出 `7604`
33
+ - 智能体将解析返回结果,向用户说明端口号及其含义
34
+
35
+ 3. **处理多组件场景**
36
+ - 对于需要多个端口的项目(前端、后端、数据库等),使用以下两种策略之一:
37
+ - **角色前缀法**:将角色放到名称开头,确保角色参与前缀映射(更容易产生不同端口)
38
+ - 前端:`fe-<project>`
39
+ - 后端:`api-<project>`
40
+ - 数据库:`db-<project>`
41
+ - **顺序分配法**:使用基础端口,然后连续分配
42
+ - Web 服务:基础端口
43
+ - 后端 API:基础端口 + 1
44
+ - 数据库:基础端口 + 2
45
+
46
+ 4. **端口冲突处理**
47
+ - 检查生成的端口是否与本地运行服务冲突
48
+ - 如有冲突,将冲突端口加入 `~/.port-key/config.json` 的 `blockedPorts` 后重试(或临时设置 `PORTKEY_HOME` 指向一个独立目录)
49
+
50
+ - 可选分支:
51
+ - 当项目名称很短(1-3 字母):工具自动启用零填充策略生成指定位数端口
52
+ - 当项目名称很长(多个单词):自动提取首字母(如 "我爱我家" → "wawj")
53
+ - 当需要特定端口范围:通过 `~/.port-key/config.json` 配置 `minPort`、`maxPort`
54
+ - 当需要屏蔽某些端口:通过 `~/.port-key/config.json` 配置 `blockedPorts`
55
+
56
+ ## 资源索引
57
+ - 领域参考:见 [references/port-key.md](references/port-key.md)(何时读取:需要了解 port-key 工具的详细参数、使用方法或输出格式时)
58
+ - 领域参考:见 [references/port-best-practices.md](references/port-best-practices.md)(何时读取:需要端口分配策略建议或避免冲突的最佳实践时)
59
+
60
+ ## 注意事项
61
+ - 端口范围必须在 1024-65535 之间(系统端口 0-1023 被屏蔽)
62
+ - 生成的端口号仅作为建议,实际使用前请验证端口是否可用
63
+ - 端口分配策略应保持团队内部一致,便于记忆和管理
64
+ - 多项目开发时建议记录端口分配情况,避免重复
65
+ - 使用 `npx -y` 可自动确认下载,避免交互式提示
66
+ - **长项目名称处理**:智能体会自动提取首字母,也可手动指定简短名称(如将 "用户认证服务" 指定为 "uas")
67
+ - **首字母规则**:英文单词取首字母,中文取拼音首字母,保持可读性和记忆性
68
+
69
+ ## 使用示例
70
+
71
+ ### 示例 1:单个项目端口分配(短名称)
72
+ **场景**:启动一个名为 "dashboard" 的新项目
73
+ **执行方式**:使用 npx 调用工具
74
+ ```bash
75
+ npx -y @lionad/port-key "dashboard"
76
+ ```
77
+ **输出示例**:
78
+ ```
79
+ 3126
80
+ ```
81
+ **智能体说明**:默认配置下,项目名称 "dashboard" 通过键盘映射生成端口号 3126。工具只做端口范围与屏蔽列表校验,不检测端口是否被占用。
82
+
83
+ ### 示例 1.1:单个项目端口分配(长名称 - 自动提取首字母)
84
+ **场景**:启动一个名为 "用户认证服务" 的新项目
85
+ **智能体处理**:自动提取首字母 "uas"(User Authentication Service)
86
+ **执行方式**:
87
+ ```bash
88
+ npx -y @lionad/port-key "uas"
89
+ ```
90
+ **输出示例**:
91
+ ```
92
+ 7120
93
+ ```
94
+ **智能体说明**:项目名称 "用户认证服务" 较长,已提取首字母 "uas" 生成端口号 7120(短输入默认会尾部补 0 到 4 位)。
95
+
96
+ ### 示例 2:多组件项目端口分配
97
+ **场景**:全栈项目需要前端、后端、数据库三个端口
98
+ **执行方式**:使用角色前缀策略(默认配置下更容易生成不同端口)
99
+ ```bash
100
+ # 1. 生成基础端口
101
+ npx -y @lionad/port-key "myapp"
102
+ # 默认输出:7610
103
+
104
+ # 2. 前端:角色前缀
105
+ npx -y @lionad/port-key "fe-myapp"
106
+ # 示例输出:4376
107
+
108
+ # 3. 后端:角色前缀
109
+ npx -y @lionad/port-key "api-myapp"
110
+ # 示例输出:1087
111
+
112
+ # 4. 数据库:角色前缀
113
+ npx -y @lionad/port-key "db-myapp"
114
+ # 示例输出:3576
115
+ ```
116
+
117
+ ### 示例 3:避免端口冲突
118
+ **场景**:已知端口 3000、3001 已被占用
119
+ **执行方式**:将占用端口加入配置文件的屏蔽列表,然后重新生成
120
+ ```bash
121
+ # ~/.port-key/config.json(示例)
122
+ # { "blockedPorts": [3000, 3001, 8080] }
123
+
124
+ npx -y @lionad/port-key "blog"
125
+ ```
126
+ **智能体说明**:工具不会检测端口是否被占用;“已占用”需要由智能体用系统命令检查,并把冲突端口加入 blockedPorts 后再生成。
127
+
128
+ ### 示例 4:指定位数和语言
129
+ **场景**:需要 5 位端口号,且希望显示英文输出
130
+ **执行方式**:使用 `--digits` 和 `--lang` 参数
131
+ ```bash
132
+ npx -y @lionad/port-key "myproject" --digits 5 --lang en
133
+ ```
134
+
135
+ ### 示例 5:长项目名称处理(中文)
136
+ **场景**:处理中文项目名称 "我爱我家"
137
+ **智能体处理**:自动提取拼音首字母 "wawj"
138
+ **执行方式**:
139
+ ```bash
140
+ npx -y @lionad/port-key "wawj"
141
+ ```
142
+ **输出示例**:
143
+ ```
144
+ 2127
145
+ ```
146
+ **智能体说明**:默认配置下,项目名称 "我爱我家"(Wǒ Ài Wǒ Jiā)已提取首字母 "wawj",生成端口号 2127。
147
+
148
+ ### 示例 6:长项目名称处理(英文)
149
+ **场景**:处理英文长项目名称 "Enterprise Resource Planning System"
150
+ **智能体处理**:自动提取首字母 "erps"
151
+ **执行方式**:
152
+ ```bash
153
+ npx -y @lionad/port-key "erps"
154
+ ```
155
+ **输出示例**:
156
+ ```
157
+ 3402
158
+ ```
159
+ **智能体说明**:默认配置下,项目名称 "Enterprise Resource Planning System" 已提取首字母 "erps",生成端口号 3402。
@@ -0,0 +1,229 @@
1
+ # 端口分配最佳实践
2
+
3
+ ## 目录
4
+ - [端口分类与规范](#端口分类与规范)
5
+ - [本地开发端口分配策略](#本地开发端口分配策略)
6
+ - [避免端口冲突的方法](#避免端口冲突的方法)
7
+ - [团队协作与文档管理](#团队协作与文档管理)
8
+ - [常见问题排查](#常见问题排查)
9
+
10
+ ## 概览
11
+ 本文档提供端口分配的最佳实践指南,帮助开发者在本地开发和团队协作中有效管理端口资源,避免端口冲突,提升开发效率。
12
+
13
+ ## 端口分类与规范
14
+
15
+ ### 端口范围划分
16
+ - **系统端口(0-1023)**:由 IETF 分配,需要 root 权限,严格禁止使用
17
+ - **用户端口(1024-49151)**:由 IANA 分配,注册服务使用,谨慎使用
18
+ - **动态/私有端口(49152-65535)**:未分配,临时使用最安全
19
+
20
+ ### 推荐端口范围
21
+ - **常规开发**:`3000-3999` 或 `8000-8999`
22
+ - **微服务集群**:`5000-5999` 或 `9000-9999`
23
+ - **测试环境**:`10000-19999`
24
+ - **注意(PortKey 默认)**:PortKey 默认会屏蔽一批常见端口(如 3000、3001、5173、8080 等);若团队强制使用某些端口段,建议在 `~/.port-key/config.json` 中统一 `blockedPorts/minPort/maxPort`。
25
+
26
+ ## 本地开发端口分配策略
27
+
28
+ ### 单项目场景
29
+ **原则**:一个项目使用一个主端口,根据项目特性选择范围
30
+
31
+ - **前端项目**:推荐 `3000-3999`(如 3000, 3173, 3333)
32
+ - **后端服务**:推荐 `8000-8999`(如 8000, 8080, 8765)
33
+ - **数据库**:使用标准端口或 `5000-5999`(如 5432, 5701)
34
+
35
+ ### 多组件项目场景
36
+ **策略 A:角色前缀法(推荐)**
37
+ 将角色放到名称开头,确保角色参与端口映射的前缀候选,减少“多个组件映射到同一端口”的概率。
38
+
39
+ ```
40
+ 示例项目 "shop"
41
+ - 基础端口:2690(shop)
42
+ - 前端:4326(fe-shop)
43
+ - 后端:1082(api-shop)
44
+ - 数据库:3526(db-shop)
45
+ ```
46
+
47
+ **策略 B:顺序分配法**
48
+ 从基础端口开始连续分配
49
+
50
+ ```
51
+ 示例项目 "shop"
52
+ - 基础端口:2690
53
+ - 前端:2690
54
+ - 后端:2691
55
+ - 数据库:2692
56
+ ```
57
+
58
+ **说明**:
59
+ - PortKey 默认会优先取 4 位候选;当项目名本体已经足够生成 4 位候选时,简单追加后缀(如 `<project>-db`)可能不会影响“最先被选中的候选”,导致多个组件仍然得到同一个端口。
60
+ - 如需使用“角色后缀法”,建议结合 `preferDigitCount: 5`(配置文件)或直接使用“角色前缀法”。
61
+
62
+ ### 微服务架构场景
63
+ **原则**:使用命名约束 + 范围隔离
64
+
65
+ 1. **按功能模块划分端口段**
66
+ ```
67
+ 用户服务:10000-10099
68
+ 订单服务:10100-10199
69
+ 支付服务:10200-10299
70
+ ```
71
+
72
+ 2. **使用项目前缀 + 功能标识**
73
+ ```
74
+ user-auth:10001
75
+ user-profile:10002
76
+ order-create:10101
77
+ order-query:10102
78
+ ```
79
+
80
+ 3. **预留端口段**
81
+ - 预留 20% 的端口空间用于扩展
82
+ - 使用高位端口作为备用(如 19990-19999)
83
+
84
+ ## 避免端口冲突的方法
85
+
86
+ ### 冲突预防
87
+ 1. **使用端口映射工具**
88
+ - 使用 `smart-port-allocation` Skill 生成基于项目名称的唯一端口
89
+ - 端口号与项目名称绑定,可预测且更少随机冲突(仍可能发生碰撞,需配合屏蔽列表/范围管理)
90
+
91
+ 2. **端口范围隔离**
92
+ - 不同类型服务使用不同端口段
93
+ - 开发/测试/生产环境使用不同范围
94
+
95
+ 3. **端口记录与追踪**
96
+ - 维护端口使用清单(见下文团队协作章节)
97
+
98
+ ### 冲突检测
99
+ 1. **启动前检查**
100
+ ```bash
101
+ # 检查端口是否被占用(Linux/Mac)
102
+ lsof -i :<port>
103
+
104
+ # 检查端口是否被占用(Windows)
105
+ netstat -ano | findstr :<port>
106
+ ```
107
+
108
+ 2. **定期审计**
109
+ - 定期扫描常用端口段(3000-3999, 8000-8999)
110
+ - 识别僵尸进程和未释放的端口
111
+
112
+ 3. **使用智能工具**
113
+ - 集成端口检测到启动脚本(PortKey 本身不检测端口占用)
114
+ - 冲突时将端口加入 `~/.port-key/config.json` 的 `blockedPorts`,再重新生成
115
+
116
+ ### 冲突解决
117
+ 1. **短期方案**:临时调整端口,记录变更
118
+ 2. **长期方案**:重新规划端口分配策略,统一调整
119
+ 3. **根本方案**:使用容器化技术(Docker)隔离端口空间
120
+
121
+ ## 团队协作与文档管理
122
+
123
+ ### 端口使用文档模板
124
+ 创建 `PORTS.md` 文件记录端口分配情况:
125
+
126
+ ```markdown
127
+ # 项目端口分配清单
128
+
129
+ ## 项目概述
130
+ - 示例项目:shop
131
+ - 端口策略:角色前缀法(`fe-` / `api-` / `db-`)
132
+
133
+ ## 端口分配表
134
+
135
+ | 服务名称 | 端口 | 说明 | 负责人 |
136
+ |---------|-----|------|--------|
137
+ | 前端商城 | 4326 | Vue3 应用 | 张三 |
138
+ | 后端 API | 1082 | Node.js 服务 | 李四 |
139
+ | 数据库 | 3526 | MongoDB | 王五 |
140
+ | 缓存服务 | 4338 | Redis | 王五 |
141
+
142
+ ## 端口范围
143
+ - 角色前缀法下端口可能分散,建议记录“具体端口”而不是强行划分连续端口段
144
+ - 若使用顺序分配法,可将同一项目的一组端口规划为连续段(如 2690-2699)
145
+
146
+ ## 注意事项
147
+ - 避免使用 3000, 8080 等常见端口
148
+ - 新服务优先使用未分配端口
149
+ - 端口变更需更新此文档
150
+ ```
151
+
152
+ ### 端口分配流程
153
+ 1. **新项目启动**
154
+ - 使用 `smart-port-allocation` Skill 生成端口
155
+ - 检查端口是否可用
156
+ - 更新 `PORTS.md` 文档
157
+
158
+ 2. **项目交接**
159
+ - 移交 `PORTS.md` 文档
160
+ - 说明端口分配策略和注意事项
161
+ - 交接后验证端口可用性
162
+
163
+ 3. **定期审计**
164
+ - 每季度检查端口使用情况
165
+ - 清理僵尸项目端口
166
+ - 优化端口分配策略
167
+
168
+ ## 常见问题排查
169
+
170
+ ### 问题 1:端口被占用
171
+ **症状**:启动服务时提示 "Address already in use"
172
+
173
+ **排查步骤**:
174
+ 1. 使用 `lsof -i :<port>` 查看占用进程
175
+ 2. 判断占用进程类型:
176
+ - 如果是同一服务的旧实例:kill 进程重新启动
177
+ - 如果是其他服务:选择新端口或调整其他服务
178
+ 3. 更新端口文档记录
179
+
180
+ ### 问题 2:端口映射不一致
181
+ **症状**:不同机器上同一项目使用不同端口
182
+
183
+ **原因**:
184
+ - 未使用标准化端口分配工具
185
+ - 团队成员各自随机选择端口
186
+ - 使用了不同的用户配置(如 preferDigitCount、blockedPorts、minPort/maxPort)
187
+
188
+ **解决方案**:
189
+ 1. 统一使用 `smart-port-allocation` Skill
190
+ 2. 将端口配置写入项目 `package.json` 或 `.env` 文件
191
+ 3. 纳入代码审查,确保端口配置正确
192
+ 4. 团队统一 `~/.port-key/config.json` 的关键配置(或在启动脚本中用 `PORTKEY_HOME` 指定同一份配置)
193
+
194
+ ### 问题 3:端口范围耗尽
195
+ **症状**:可用端口用完,无法为新服务分配端口
196
+
197
+ **解决方案**:
198
+ 1. 审计现有端口使用情况,清理僵尸服务
199
+ 2. 扩展端口范围(如从 3000-3999 扩展到 3000-4999)
200
+ 3. 使用容器化技术,通过端口映射复用端口
201
+
202
+ ### 问题 4:跨平台端口兼容性
203
+ **症状**:Windows 和 Linux/macOS 端口行为不一致
204
+
205
+ **解决方案**:
206
+ 1. 避免使用系统端口(0-1023)
207
+ 2. 使用 1024-65535 范围内的端口
208
+ 3. 在 CI/CD 中验证端口配置
209
+
210
+ ## 总结
211
+
212
+ ### 关键原则
213
+ 1. **可预测性**:端口分配应有规律可循,便于记忆
214
+ 2. **唯一性**:同一端口不应被多个服务占用
215
+ 3. **文档化**:所有端口分配都应记录在案
216
+ 4. **团队一致**:团队内部应使用统一的分配策略
217
+ 5. **自动化**:使用工具生成端口,减少人为错误
218
+
219
+ ### 推荐工作流
220
+ 1. 新项目启动 → 使用 Skill 生成端口
221
+ 2. 验证端口可用性 → 更新 PORTS.md
222
+ 3. 定期审计 → 优化端口分配策略
223
+ 4. 团队协作 → 保持文档同步
224
+
225
+ ### 工具推荐
226
+ - **智能端口分配**:`smart-port-allocation` Skill
227
+ - **端口检测**:`lsof`, `netstat`
228
+ - **进程管理**:`kill`, `taskkill`
229
+ - **容器隔离**:Docker, Docker Compose
@@ -0,0 +1,327 @@
1
+ # PortKey 工具使用指南
2
+
3
+ ## 目录
4
+ - [工具简介](#工具简介)
5
+ - [安装与执行](#安装与执行)
6
+ - [核心参数说明](#核心参数说明)
7
+ - [使用示例](#使用示例)
8
+ - [输出格式](#输出格式)
9
+ - [高级用法](#高级用法)
10
+ - [常见问题](#常见问题)
11
+
12
+ ## 工具简介
13
+
14
+ PortKey 是一个基于键盘映射的端口生成工具,通过将项目名称的字母映射为数字,生成可记忆且不易冲突的端口号。
15
+
16
+ ### 核心原理
17
+ - 使用标准 QWERTY 键盘布局,将字母映射到数字
18
+ - 根据字母在键盘上的行列位置确定对应数字
19
+ - 自动处理端口合法性验证(端口范围与屏蔽列表)
20
+ - **名称处理**:长项目名称/中文名称的首字母提取由智能体或调用方完成
21
+
22
+ ### 键盘映射规则
23
+ ```
24
+ 1: qaz 2: wsx 3: edc 4: rfv 5: tgb
25
+ 6: yhn 7: ujm 8: ik 9: ol 0: p
26
+ ```
27
+
28
+ 示例:
29
+ - `cfetch` → `c(3) f(4) e(3) t(5) c(3) h(6)` → `343536` → 默认输出 `3435`(取 4 位候选)
30
+
31
+ ### 项目名称处理规则
32
+ - **短名称**(1-2 个单词或 ≤8 个字母):直接使用
33
+ - `"dashboard"` → `"dashboard"`
34
+ - `"myapp"` → `"myapp"`
35
+ - **长名称**(多个单词或 >8 个字母):提取首字母
36
+ - `"我爱我家"`(Wǒ Ài Wǒ Jiā)→ `"wawj"`
37
+ - `"user authentication service"` → `"uas"`
38
+ - `"enterprise resource planning system"` → `"erps"`
39
+ - `"ecommerce payment gateway"` → `"epg"`
40
+ - **混合语言**:自动识别中英文,提取拼音或英文字母首字母
41
+
42
+ ## 安装与执行
43
+
44
+ ### 使用 npx(推荐)
45
+ 无需预安装,直接使用 npx 自动下载和执行:
46
+
47
+ ```bash
48
+ npx -y @lionad/port-key <project-name>
49
+ ```
50
+
51
+ ### 参数说明
52
+ - `-y`: 自动确认,跳过下载确认提示
53
+ - `@lionad/port-key`: npm 包名
54
+
55
+ ## 核心参数说明
56
+
57
+ ### 必需参数
58
+ - **project-name**: 项目名称(必填)
59
+ - 支持字母和数字
60
+ - 自动转换为小写
61
+ - 推荐使用简短名称(1-8 个字母)以获得最佳效果
62
+ - 示例:`"myproject"`, `"dashboard"`, `"shop"`, `"wawj"`("我爱我家"的首字母)
63
+ - **注意**:PortKey 工具本身不处理中文或长名称,首字母提取由智能体完成
64
+
65
+ ### 可选参数
66
+
67
+ #### `--digits <count>` 或 `-d <count>`
68
+ 设置端口号的位数
69
+
70
+ - **可选值**: 4, 5
71
+ - **默认值**: 4
72
+ - **说明**: 优先生成指定位数的端口号
73
+
74
+ 示例:
75
+ ```bash
76
+ npx -y @lionad/port-key "myproject" --digits 4 # 生成 4 位端口
77
+ npx -y @lionad/port-key "myproject" --digits 5 # 生成 5 位端口
78
+ ```
79
+
80
+ #### `--lang <code>`
81
+ 设置输出语言
82
+
83
+ - **可选值**: `en`, `cn`
84
+ - **默认值**: `cn`
85
+ - **说明**: 控制日志消息的语言
86
+
87
+ 示例:
88
+ ```bash
89
+ npx -y @lionad/port-key "myproject" --lang en
90
+ npx -y @lionad/port-key "myproject" --lang cn
91
+ ```
92
+
93
+ #### `--map <object>`
94
+ 自定义键盘映射
95
+
96
+ - **格式**: JSON 或 JS 对象字面量
97
+ - **默认值**: 标准 QWERTY 映射
98
+ - **说明**: 自定义字母到数字的映射关系
99
+
100
+ 示例:
101
+ ```bash
102
+ npx -y @lionad/port-key "myproject" --map '{"1":"abc","2":"def"}'
103
+ ```
104
+
105
+ ## 使用示例
106
+
107
+ ### 基础用法
108
+ ```bash
109
+ # 生成默认 4 位端口
110
+ npx -y @lionad/port-key "myproject"
111
+ # 输出: 7604
112
+
113
+ # 生成 5 位端口(myproject → digits 760497335;5 位候选 76049 超出 65535 被拒,选中 60497)
114
+ npx -y @lionad/port-key "myproject" --digits 5
115
+ # 输出: 60497
116
+ ```
117
+
118
+ ### 首字母提取示例(智能体处理)
119
+ ```bash
120
+ # 长项目名称:用户认证服务 → 提取 "uas"
121
+ npx -y @lionad/port-key "uas"
122
+ # 输出: 7120
123
+
124
+ # 长项目名称:我爱我家 → 提取 "wawj"
125
+ npx -y @lionad/port-key "wawj"
126
+ # 输出: 2127
127
+
128
+ # 长项目名称:Enterprise Resource Planning System → 提取 "erps"
129
+ npx -y @lionad/port-key "erps"
130
+ # 输出: 3402
131
+ ```
132
+ **注意**:首字母提取由智能体完成,PortKey 工具只接收处理后的简短名称。
133
+
134
+ ### 端口范围与屏蔽列表(通过配置文件)
135
+ PortKey CLI 不提供 `--min-port/--max-port/--blocked-ports` 参数;如需限制范围或屏蔽端口,请使用用户配置文件(见下文“配置文件”)。
136
+
137
+ ### 多组件项目
138
+ ```bash
139
+ # 1. 生成基础端口
140
+ npx -y @lionad/port-key "myapp"
141
+ # 输出: 7610
142
+
143
+ # 2. 前端服务(角色前缀更容易生成不同端口)
144
+ npx -y @lionad/port-key "fe-myapp"
145
+ # 输出: 4376
146
+
147
+ # 3. 后端服务
148
+ npx -y @lionad/port-key "api-myapp"
149
+ # 输出: 1087
150
+
151
+ # 4. 数据库
152
+ npx -y @lionad/port-key "db-myapp"
153
+ # 输出: 3576
154
+ ```
155
+
156
+ ### 处理短项目名
157
+ ```bash
158
+ # 短项目名会自动填充零
159
+ npx -y @lionad/port-key "air" --digits 4
160
+ # 输出: 1840
161
+
162
+ # 长项目名截取指定位数
163
+ npx -y @lionad/port-key "dashboard" --digits 4
164
+ # 输出: 3126
165
+ ```
166
+
167
+ ### 处理长项目名(配合智能体)
168
+ ```bash
169
+ # 智能体将长名称转换为首字母后调用
170
+ # 例如:"用户认证服务" → "uas"
171
+ npx -y @lionad/port-key "uas"
172
+ # 输出: 7120
173
+
174
+ # 例如:"电子商务支付网关" → "epg"
175
+ npx -y @lionad/port-key "epg"
176
+ # 输出: 3050
177
+
178
+ # 例如:"Customer Relationship Management System" → "crms"
179
+ npx -y @lionad/port-key "crms"
180
+ # 输出: 3472
181
+ ```
182
+
183
+ ## 输出格式
184
+
185
+ ### 标准输出
186
+ 默认情况下,PortKey 输出生成的端口号(纯数字):
187
+
188
+ ```bash
189
+ $ npx -y @lionad/port-key "myproject"
190
+ # 输出 7604
191
+ ```
192
+
193
+ 首次运行且本机没有配置文件时,CLI 可能会在 stderr 打印一段提示信息;stdout 仍然只输出端口号,脚本中建议用命令替换读取 stdout(如 `PORT=$(...)`)。
194
+
195
+ ### 详细输出(MCP 模式)
196
+ 当作为 MCP server 使用时(`@lionad/port-key-mcp`),会返回 JSON 格式的详细信息:
197
+
198
+ ```json
199
+ {
200
+ "digits": "760497335",
201
+ "port": 7604,
202
+ "rejectedCandidates": []
203
+ }
204
+ ```
205
+
206
+ 字段说明:
207
+ - `digits`: 映射后的数字序列
208
+ - `port`: 最终选择的端口号
209
+ - `rejectedCandidates`: 被拒绝的候选端口列表(如有)
210
+
211
+ ## 高级用法
212
+
213
+ ### 配置文件
214
+ PortKey 会从 `~/.port-key/config.json` 读取用户配置:
215
+
216
+ ```json
217
+ {
218
+ "preferDigitCount": 5,
219
+ "paddingZero": true,
220
+ "blockedPorts": [3000, 3001, 6666],
221
+ "minPort": 1024,
222
+ "maxPort": 49151
223
+ }
224
+ ```
225
+
226
+ 也可以通过环境变量 `PORTKEY_HOME` 指定配置目录(目录下仍使用 `.port-key/config.json`)。
227
+
228
+ ### MCP Server 集成
229
+ 将 PortKey 作为 MCP server 使用:
230
+
231
+ ```json
232
+ {
233
+ "mcpServers": {
234
+ "port-key": {
235
+ "command": "npx",
236
+ "args": ["@lionad/port-key-mcp"]
237
+ }
238
+ }
239
+ }
240
+ ```
241
+
242
+ ### 批量生成端口
243
+ 在 Shell 脚本中批量生成端口:
244
+
245
+ ```bash
246
+ #!/bin/bash
247
+ projects=("project-a" "project-b" "project-c")
248
+
249
+ for project in "${projects[@]}"; do
250
+ port=$(npx -y @lionad/port-key "$project")
251
+ echo "$project: $port"
252
+ done
253
+ ```
254
+
255
+ ### 集成到启动脚本
256
+ 将端口生成集成到项目启动脚本:
257
+
258
+ ```bash
259
+ #!/bin/bash
260
+ PROJECT_NAME="myapp"
261
+
262
+ # 生成端口
263
+ PORT=$(npx -y @lionad/port-key "$PROJECT_NAME")
264
+
265
+ # 启动服务
266
+ export PORT=$PORT
267
+ npm start
268
+ ```
269
+
270
+ ## 常见问题
271
+
272
+ ### Q1: 为什么生成的端口不在期望的范围内?
273
+ **A**: 检查以下几点:
274
+ 1. 检查 `~/.port-key/config.json` 中的 `minPort/maxPort` 配置(如有)
275
+ 2. 检查 `blockedPorts` 是否屏蔽了范围内的端口
276
+ 3. 确认期望范围在 1024-65535 之间(0-1023 始终被屏蔽)
277
+
278
+ ### Q2: 短项目名生成的端口位数不足?
279
+ **A**: 使用 `--digits` 参数指定位数,工具会自动填充零:
280
+ ```bash
281
+ npx -y @lionad/port-key "air" --digits 4
282
+ ```
283
+
284
+ ### Q3: 长项目名称如何处理?
285
+ **A**: 智能体会自动处理长项目名称:
286
+ - **中文长名称**:提取拼音首字母,如 "我爱我家" → "wawj"
287
+ - **英文长名称**:提取单词首字母,如 "User Authentication Service" → "uas"
288
+ - 也可以手动指定简短名称,如使用 "uas" 代替 "用户认证服务"
289
+ - 首字母提取后,由智能体调用 PortKey 生成端口
290
+
291
+ ### Q4: 如何验证生成的端口是否可用?
292
+ **A**: 使用以下命令检查端口占用:
293
+ ```bash
294
+ # Linux/Mac
295
+ lsof -i :<port>
296
+
297
+ # Windows
298
+ netstat -ano | findstr :<port>
299
+ ```
300
+
301
+ ### Q5: 能否自定义键盘映射?
302
+ **A**: 可以使用 `--map` 参数自定义:
303
+ ```bash
304
+ npx -y @lionad/port-key "myproject" --map '{"1":"abc","2":"def"}'
305
+ ```
306
+
307
+ ### Q6: 多组件项目如何分配端口?
308
+ **A**: 推荐两种方式:
309
+ 1. **角色前缀法**:`fe-myapp`, `api-myapp`, `db-myapp`
310
+ 2. **顺序分配法**:基础端口、基础+1、基础+2
311
+
312
+ 详细策略见 [port-best-practices.md](port-best-practices.md)
313
+
314
+ ### Q7: 生成的端口与现有服务冲突怎么办?
315
+ **A**: PortKey 不检测端口占用;请先用系统命令确认冲突端口,然后将冲突端口加入 `~/.port-key/config.json` 的 `blockedPorts` 后重试(或换用不同的项目名/角色前缀)。
316
+
317
+ ### Q8: 如何在团队中统一端口分配?
318
+ **A**: 建议遵循以下步骤:
319
+ 1. 使用相同的工具和参数
320
+ 2. 在文档记录端口分配
321
+ 3. 使用版本管理端口配置
322
+ 4. 定期审计端口使用情况
323
+ 5. **统一首字母规则**:团队内部统一长项目名称的首字母提取规则
324
+
325
+ ## 相关文档
326
+ - [端口分配最佳实践](port-best-practices.md):详细的端口分配策略和团队协作指南
327
+ - PortKey GitHub:https://github.com/Lionad-Morotar/port-key