@itpay/cli 2.0.14 → 2.0.15
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/README.md +5 -4
- package/dist/src/commands/guidance.js +6 -5
- package/dist/src/commands/install.js +2 -2
- package/dist/src/commands/readyz.js +6 -2
- package/dist/src/main.js +18 -12
- package/dist/src/state/config.js +41 -7
- package/docs/agent/buyer/identity-and-sessions.json +10 -10
- package/docs/agent/buyer/install-and-setup.json +4 -5
- package/docs/agent/buyer/quickstart.json +3 -2
- package/docs/cli-reference/commands/cart/remove.md +1 -1
- package/docs/cli-reference/commands/device.md +1 -1
- package/docs/cli-reference/commands/install.md +2 -2
- package/docs/cli-reference/commands/readyz.md +35 -8
- package/docs/skill-bundle-rollout/01-mcp-authentication.md +256 -0
- package/docs/skill-bundle-rollout/02-platform-bundle-repositories.md +282 -0
- package/docs/skill-bundle-rollout/03-platform-publishing.md +270 -0
- package/docs/skill-bundle-rollout/README.md +98 -0
- package/package.json +1 -1
- package/skills/itpay/SKILL.md +3 -3
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# 核心任务一:MCP 专用认证系统
|
|
2
|
+
|
|
3
|
+
状态:待实施
|
|
4
|
+
|
|
5
|
+
## 1. Current State
|
|
6
|
+
|
|
7
|
+
### CLI Device Authority
|
|
8
|
+
|
|
9
|
+
当前 `src/state/device_authority.ts`:
|
|
10
|
+
|
|
11
|
+
- 每个本地安装生成一把 Ed25519 私钥。
|
|
12
|
+
- 私钥和 Device 状态存放在 `~/.itpay-v3/device`,owner-only 权限。
|
|
13
|
+
- 一个 production Device registration 下按 `agent_type` 建立 Agent Instance。
|
|
14
|
+
- CLI 通过 challenge 签名取得短期 Device session。
|
|
15
|
+
- 受保护请求使用 `Authorization: ItPayDevice ...` 加请求签名。
|
|
16
|
+
- session 失效只续期一次;已撤销的 v2 registration 不会静默替换。
|
|
17
|
+
|
|
18
|
+
这套系统回答的是“哪个本地 Agent 设备在调用”,不是“哪个付费用户连接了 MCP”。
|
|
19
|
+
|
|
20
|
+
### Buyer Bearer
|
|
21
|
+
|
|
22
|
+
`src/state/config.ts` 可以从 `ITPAY_BEARER_TOKEN` 读取账号 Bearer token,供 `orders` 等账号范围命令使用。它是外部注入能力,不是平台 OAuth 连接系统,不应直接扩展成把 token 写进 Skill bundle。
|
|
23
|
+
|
|
24
|
+
### 问题
|
|
25
|
+
|
|
26
|
+
云端 Chat 平台不能稳定访问用户电脑上的 `~/.itpay-v3`。即使 Skill 在沙箱里写出同名目录,那也是平台执行容器的临时身份,不是用户本机身份,也不能作为订阅、订单或支付权限的长期主键。
|
|
27
|
+
|
|
28
|
+
## 2. Target Behavior
|
|
29
|
+
|
|
30
|
+
新增远程 MCP OAuth 通道:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
Platform -> OAuth authorize -> ItPay login/consent
|
|
34
|
+
<- authorization code
|
|
35
|
+
Platform -> token endpoint (code + PKCE)
|
|
36
|
+
<- access token + refresh token
|
|
37
|
+
Platform -> MCP tool + Bearer access token
|
|
38
|
+
MCP -> validate issuer/audience/scope/expiry
|
|
39
|
+
MCP -> principal.user_id
|
|
40
|
+
Backend -> account/entitlement/order authorization
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
完成后:
|
|
44
|
+
|
|
45
|
+
- MCP 通过 ItPay 用户身份追踪收费、套餐、订单与权限。
|
|
46
|
+
- CLI 继续通过 Device Authority 追踪本地 Agent 设备和 Agent Instance。
|
|
47
|
+
- 用户可以显式把 Device 关联到同一 ItPay account,但关联不改变认证方式。
|
|
48
|
+
- 两套 token 具有不同 issuer/audience、Header scheme、存储位置和撤销域。
|
|
49
|
+
- 后端授权逻辑接收统一 principal,但不混淆 principal 类型。
|
|
50
|
+
|
|
51
|
+
不应该改变:
|
|
52
|
+
|
|
53
|
+
- 现有 CLI 私钥位置、Device 注册协议、签名格式和一次性 session 恢复规则。
|
|
54
|
+
- 默认 `https://app.itpay.ai`,且仅允许准确 `https://dev.itpay.ai` 测试 override 的官方 Backend 规则。
|
|
55
|
+
- Checkout 外部人类确认和服务端支付状态权威性。
|
|
56
|
+
|
|
57
|
+
## 3. Scope
|
|
58
|
+
|
|
59
|
+
### In scope
|
|
60
|
+
|
|
61
|
+
- ItPay OAuth Authorization Server 所需的 authorize、token、refresh、revoke 和 metadata。
|
|
62
|
+
- MCP resource server 的 Bearer token 验证。
|
|
63
|
+
- PKCE、state、精确 redirect URI、scope、audience、过期和撤销。
|
|
64
|
+
- OAuth subject 到现有 ItPay `user_id` 的映射。
|
|
65
|
+
- 平台 OAuth client/connection 记录。
|
|
66
|
+
- MCP 工具级 scope 与敏感写操作确认策略。
|
|
67
|
+
- CLI Device 与用户账号的可选显式关联。
|
|
68
|
+
- 审计日志、最小化返回、测试账号和平台审核所需演示凭据。
|
|
69
|
+
|
|
70
|
+
### Out of scope
|
|
71
|
+
|
|
72
|
+
- 重写 CLI Device Authority。
|
|
73
|
+
- 让 MCP 读取或迁移本地 Device 私钥。
|
|
74
|
+
- 让平台 Access Token 代替支付确认。
|
|
75
|
+
- 在聊天内容中采集支付卡、支付密码、验证码、钱包私钥。
|
|
76
|
+
- 为每个平台建立独立 ItPay 用户表。
|
|
77
|
+
|
|
78
|
+
## 4. 认证边界
|
|
79
|
+
|
|
80
|
+
### Principal 类型
|
|
81
|
+
|
|
82
|
+
后端至少明确区分:
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
type Principal =
|
|
86
|
+
| { kind: "device"; deviceId: string; agentInstanceId: string; agentType: string }
|
|
87
|
+
| { kind: "user"; userId: string; oauthClientId: string; scopes: string[] };
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
不要求实际代码使用这个 TypeScript 类型,但授权层必须保留等价区分。禁止根据“有 Authorization Header”就把两者当成同一种账号。
|
|
91
|
+
|
|
92
|
+
### Header 与 audience
|
|
93
|
+
|
|
94
|
+
| 通道 | Header | audience | 用途 |
|
|
95
|
+
| --- | --- | --- | --- |
|
|
96
|
+
| CLI | `Authorization: ItPayDevice <session>` + 签名 Headers | Device API | 本地设备、Agent Instance、设备额度与执行 |
|
|
97
|
+
| MCP | `Authorization: Bearer <oauth_access_token>` | ItPay MCP resource | 用户账号、套餐、订单和 MCP 工具 |
|
|
98
|
+
|
|
99
|
+
Bearer token 不能被 CLI Device middleware 接受;Device session 不能被 MCP middleware 接受。鉴权失败返回 401,授权不足返回 403,不做静默降级。
|
|
100
|
+
|
|
101
|
+
### 服务端身份关系
|
|
102
|
+
|
|
103
|
+
建议关系而非第二套用户系统:
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
itpay_users
|
|
107
|
+
id
|
|
108
|
+
|
|
109
|
+
oauth_clients
|
|
110
|
+
client_id
|
|
111
|
+
platform
|
|
112
|
+
redirect_uris
|
|
113
|
+
status
|
|
114
|
+
|
|
115
|
+
oauth_grants
|
|
116
|
+
user_id -> itpay_users.id
|
|
117
|
+
client_id -> oauth_clients.client_id
|
|
118
|
+
scopes
|
|
119
|
+
revoked_at
|
|
120
|
+
|
|
121
|
+
agent_devices
|
|
122
|
+
optional_linked_user_id -> itpay_users.id
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Access token 的 `sub` 是稳定、不可猜测的 ItPay 用户 subject。若需要减少跨客户端关联,应使用 pairwise subject,并在服务端映射回同一 `user_id`;不要把 email、ChatGPT 用户名或平台会话 ID 当主键。
|
|
126
|
+
|
|
127
|
+
## 5. Implementation Steps
|
|
128
|
+
|
|
129
|
+
### Step 1:冻结现有 CLI 认证合同
|
|
130
|
+
|
|
131
|
+
依赖:无。
|
|
132
|
+
|
|
133
|
+
- 为现有 Device enrollment、session、请求签名、401 单次恢复补齐合同测试。
|
|
134
|
+
- 记录 Device API 可访问的路由集合。
|
|
135
|
+
- 确认 MCP 改动不会修改 `src/state/device_authority.ts` 的持久化 schema。
|
|
136
|
+
|
|
137
|
+
完成条件:加入 MCP 中间件前后,现有 CLI 测试结果和本地身份文件保持一致。
|
|
138
|
+
|
|
139
|
+
### Step 2:定义 OAuth issuer 和 MCP resource
|
|
140
|
+
|
|
141
|
+
依赖:Step 1。
|
|
142
|
+
|
|
143
|
+
- 选择正式 issuer,例如 `https://auth.itpay.ai`;若沿用 `app.itpay.ai`,也必须保持独立 OAuth 路径和密钥用途。
|
|
144
|
+
- 发布标准 Authorization Server metadata 和 MCP Protected Resource metadata。
|
|
145
|
+
- 明确 production MCP URL、resource audience、redirect URI 注册规则和允许的平台 client。
|
|
146
|
+
- Authorization Code 必须使用 PKCE;禁止 implicit flow 和 Resource Owner Password flow。
|
|
147
|
+
|
|
148
|
+
完成条件:平台可以发现授权端点,redirect URI 不能通配,code 只能使用一次且短期有效。
|
|
149
|
+
|
|
150
|
+
### Step 3:实现登录、同意和 token 生命周期
|
|
151
|
+
|
|
152
|
+
依赖:Step 2。
|
|
153
|
+
|
|
154
|
+
- 用户在 ItPay 页面完成登录;平台不能代收 ItPay 密码。
|
|
155
|
+
- consent 页面展示 client、scope、数据用途和撤销入口。
|
|
156
|
+
- access token 短期有效;refresh token 轮换并检测重放。
|
|
157
|
+
- 支持单 grant 撤销、全设备/全连接撤销和用户主动断开平台。
|
|
158
|
+
- 密钥轮换保留合理验证窗口;日志不记录原始 token 或 authorization code。
|
|
159
|
+
|
|
160
|
+
完成条件:登录、刷新、过期、撤销、重放和错误 redirect URI 均有自动测试。
|
|
161
|
+
|
|
162
|
+
### Step 4:在 MCP 服务建立认证和工具授权
|
|
163
|
+
|
|
164
|
+
依赖:Step 3。
|
|
165
|
+
|
|
166
|
+
- MCP 入口只接受匹配 issuer、audience、签名、有效期和未撤销 grant 的 Bearer token。
|
|
167
|
+
- 每个工具声明并验证最小 scope。
|
|
168
|
+
- 只读工具与创建 Checkout、退款等写工具分开。
|
|
169
|
+
- 敏感写工具保留平台确认和 ItPay 服务端幂等键。
|
|
170
|
+
- 工具响应去掉 token、内部用户 ID、Device ID、调试 payload 和不必要个人数据。
|
|
171
|
+
|
|
172
|
+
建议第一版 scope:
|
|
173
|
+
|
|
174
|
+
| Scope | 能力 |
|
|
175
|
+
| --- | --- |
|
|
176
|
+
| `catalog:read` | 浏览公开目录 |
|
|
177
|
+
| `checkout:write` | 创建或恢复当前用户的 Checkout handoff |
|
|
178
|
+
| `orders:read` | 读取当前用户订单摘要 |
|
|
179
|
+
| `refunds:write` | 按既有退款政策发起退款请求 |
|
|
180
|
+
|
|
181
|
+
不要第一版就增加通配 scope。
|
|
182
|
+
|
|
183
|
+
完成条件:越权工具返回 403;不能通过参数替换其他用户 ID;写操作保持幂等。
|
|
184
|
+
|
|
185
|
+
### Step 5:关联账号而不合并凭据
|
|
186
|
+
|
|
187
|
+
依赖:Step 3、Step 4。
|
|
188
|
+
|
|
189
|
+
- MCP OAuth grant 直接绑定 ItPay `user_id`。
|
|
190
|
+
- 本地 Device 若需要账号能力,通过网页显式关联到同一 `user_id`。
|
|
191
|
+
- 关联只写服务端关系,不把 OAuth refresh token 写入 `~/.itpay-v3/device`,也不把 Device 私钥传到服务端或 MCP。
|
|
192
|
+
- 解除关联不删除 Device 身份;撤销 OAuth 不删除 Device registration。
|
|
193
|
+
|
|
194
|
+
完成条件:分别撤销任一通道不会破坏另一通道;同一用户的订单权限由服务端政策决定。
|
|
195
|
+
|
|
196
|
+
### Step 6:平台审核材料与运维
|
|
197
|
+
|
|
198
|
+
依赖:Step 4。
|
|
199
|
+
|
|
200
|
+
- 建立无 MFA、无短信/邮件确认、无内网依赖的审核测试账号,仅含固定测试数据和限额。
|
|
201
|
+
- 准备 privacy policy、terms、support、数据删除和撤销说明。
|
|
202
|
+
- 记录 client、user、tool、scope、结果和 request ID;不记录 secret。
|
|
203
|
+
- 对 token 签发、失败登录、撤销、敏感工具建立告警。
|
|
204
|
+
|
|
205
|
+
完成条件:审核者可以独立完成正向和负向测试;运营可以按 user/client 撤销连接。
|
|
206
|
+
|
|
207
|
+
## 6. API / Data / Type Changes
|
|
208
|
+
|
|
209
|
+
预计涉及,具体路由名在服务端仓库调研后确定:
|
|
210
|
+
|
|
211
|
+
- OAuth metadata、authorize、token、revoke 端点。
|
|
212
|
+
- MCP protected resource metadata。
|
|
213
|
+
- OAuth client、grant、refresh-token family、consent/audit 数据。
|
|
214
|
+
- 统一但保留 `device`/`user` 区分的 principal 类型。
|
|
215
|
+
- MCP tool scope 和平台 action annotation。
|
|
216
|
+
|
|
217
|
+
CLI 公共命令和 `~/.itpay-v3/device` schema:无计划变更。
|
|
218
|
+
|
|
219
|
+
## 7. Tests / Verification
|
|
220
|
+
|
|
221
|
+
### 单元测试
|
|
222
|
+
|
|
223
|
+
- PKCE verifier、redirect URI、state、code 单次消费。
|
|
224
|
+
- issuer/audience/scope/expiry/signature/revocation。
|
|
225
|
+
- refresh rotation 和旧 token 重放。
|
|
226
|
+
- Device/Bearer scheme 互相拒绝。
|
|
227
|
+
|
|
228
|
+
### 集成测试
|
|
229
|
+
|
|
230
|
+
- 完整 OAuth 登录、MCP 调用、刷新、撤销。
|
|
231
|
+
- 同一 ItPay 用户从两个平台 client 登录。
|
|
232
|
+
- MCP OAuth 登录后,本地 CLI Device ID 和私钥 hash 不变。
|
|
233
|
+
- Device 撤销后 MCP grant 仍按自身状态工作;反向亦然。
|
|
234
|
+
- 订单、Checkout、退款的跨用户越权测试。
|
|
235
|
+
|
|
236
|
+
### 手动验证
|
|
237
|
+
|
|
238
|
+
- ChatGPT Connect/Disconnect。
|
|
239
|
+
- 另一个支持远程 MCP OAuth 的平台连接。
|
|
240
|
+
- 本地 CLI 同时运行并完成 `readyz`、目录、Checkout 恢复。
|
|
241
|
+
|
|
242
|
+
## 8. Risks / Uncertainties
|
|
243
|
+
|
|
244
|
+
- MCP 服务端代码不在当前 CLI 仓库,本文件定义合同,实施前必须在对应服务端仓库重新追踪现有用户/session 模块。
|
|
245
|
+
- 各平台对动态 client registration、redirect URI 和 token metadata 的细节可能不同;以平台实际连接测试为准。
|
|
246
|
+
- OpenAI 对金融交易和 PCI 数据有额外限制。MCP 只编排外部 Checkout,不把 OAuth 登录等同于付款授权。
|
|
247
|
+
- `ITPAY_BEARER_TOKEN` 的长期定位需要服务端确认;第一版不删除、不重命名,也不让 MCP 依赖该环境变量。
|
|
248
|
+
|
|
249
|
+
## 9. Checkpoint
|
|
250
|
+
|
|
251
|
+
本任务不需要改动当前 CLI 身份即可开始。实施时只有以下情况停下确认:
|
|
252
|
+
|
|
253
|
+
- 现有服务端没有可复用的 ItPay 用户主表;
|
|
254
|
+
- 必须改变 Device principal 或 quota 归属;
|
|
255
|
+
- 需要引入新的支付授权行为;
|
|
256
|
+
- 平台要求与这里冲突的 token 传递方式。
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# 核心任务二:多平台 Bundle Skill 仓库与自动同步
|
|
2
|
+
|
|
3
|
+
状态:待实施
|
|
4
|
+
|
|
5
|
+
## 1. Current State
|
|
6
|
+
|
|
7
|
+
当前 CLI 主仓库:
|
|
8
|
+
|
|
9
|
+
- npm 包名为 `@itpay/cli`,当前版本由 `package.json` 管理。
|
|
10
|
+
- `npm run check` 执行类型检查、测试覆盖率和打包 smoke test。
|
|
11
|
+
- main 分支 CD 在验证后发布精确 npm 版本。
|
|
12
|
+
- npm 包已经包含 `bin/`、`dist/src/`、`docs/`、`skills/`、README 和 LICENSE。
|
|
13
|
+
- CLI 运行依赖 Node.js 18+,并依赖 `commander`、`qrcode`。
|
|
14
|
+
- `skills/itpay/SKILL.md` 是当前通用 Skill 合同,但没有四个平台各自的 manifest、目录结构和商店发布材料。
|
|
15
|
+
|
|
16
|
+
只复制 npm 包 tarball 并不等于自包含 bundle,因为 npm tarball 不包含生产 `node_modules`。真正的 bundle 必须在发布时装入精确生产依赖,或者未来另行构建单文件/原生可执行文件。
|
|
17
|
+
|
|
18
|
+
## 2. Target Behavior
|
|
19
|
+
|
|
20
|
+
建立四个独立平台仓库。每个仓库只维护:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
平台 manifest 和适配说明
|
|
24
|
+
平台专用 SKILL.md
|
|
25
|
+
由自动化生成的 vendor/itpay-cli bundle
|
|
26
|
+
bundle.lock.json
|
|
27
|
+
平台测试与发布材料
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
CLI 发布后:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
@itpay/cli@X.Y.Z 发布成功
|
|
34
|
+
-> 通知四个平台仓库
|
|
35
|
+
-> 下载精确 X.Y.Z 和 npm integrity
|
|
36
|
+
-> 安装精确 production dependencies
|
|
37
|
+
-> 生成 bundle 和 lock
|
|
38
|
+
-> 运行无全局 CLI smoke test
|
|
39
|
+
-> 创建同步 PR
|
|
40
|
+
-> 人工审查平台差异
|
|
41
|
+
-> 合并、打 tag、按平台上传/发布
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 3. Scope
|
|
45
|
+
|
|
46
|
+
### In scope
|
|
47
|
+
|
|
48
|
+
- 四个独立仓库和平台 manifest。
|
|
49
|
+
- 通用 CLI bundle 生成脚本。
|
|
50
|
+
- npm 版本、integrity、源 commit 的锁定记录。
|
|
51
|
+
- CLI 发布后的跨仓同步 PR。
|
|
52
|
+
- 无全局 CLI、无运行时 npm 下载的测试。
|
|
53
|
+
- macOS、Linux、Windows 平台适配验证。
|
|
54
|
+
- 平台审核包、release notes 和回滚规则。
|
|
55
|
+
|
|
56
|
+
### Out of scope
|
|
57
|
+
|
|
58
|
+
- 把 CLI 源码复制到四个仓库继续开发。
|
|
59
|
+
- 每个平台 fork 一套业务逻辑。
|
|
60
|
+
- 运行时自动执行 `npm install -g @itpay/cli@latest`。
|
|
61
|
+
- 在 CLI 发布时绕过平台审核自动公开商店版本。
|
|
62
|
+
- 第一阶段引入新的单文件打包器或原生二进制工具链。
|
|
63
|
+
|
|
64
|
+
## 4. 仓库布局
|
|
65
|
+
|
|
66
|
+
### OpenAI
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
itpay-skill-openai/
|
|
70
|
+
plugin metadata / submission assets
|
|
71
|
+
skills/itpay/SKILL.md
|
|
72
|
+
skills/itpay/scripts/itpay
|
|
73
|
+
skills/itpay/vendor/itpay-cli/
|
|
74
|
+
bundle.lock.json
|
|
75
|
+
tests/
|
|
76
|
+
submission/
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
ChatGPT 云端工作流优先调用远程 MCP;本地 Codex 在平台允许 shell 且 bundle 可执行时才能使用 bundled CLI。Skill 必须明确这个选择,不能在 ChatGPT 沙箱里把 `~/.itpay-v3` 当长期用户认证。
|
|
80
|
+
|
|
81
|
+
### Claude Code
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
itpay-skill-claude-code/
|
|
85
|
+
.claude-plugin/marketplace.json
|
|
86
|
+
plugins/itpay/
|
|
87
|
+
.claude-plugin/plugin.json
|
|
88
|
+
skills/itpay/SKILL.md
|
|
89
|
+
bin/itpay
|
|
90
|
+
vendor/itpay-cli/
|
|
91
|
+
.mcp.json # 远程 MCP 上线时加入
|
|
92
|
+
bundle.lock.json
|
|
93
|
+
README.md
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
一个 Claude 平台仓库同时承载 marketplace catalog 和 ItPay plugin,不另建第五个仓库。Claude Code 会把 plugin root 的 `bin/` 加入 Bash PATH。`bin/itpay` 只负责定位本仓库内 vendor 入口,不搜索或调用全局 `itpay`。
|
|
97
|
+
|
|
98
|
+
### Gemini CLI
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
itpay-skill-gemini-cli/
|
|
102
|
+
gemini-extension.json
|
|
103
|
+
skills/itpay/SKILL.md
|
|
104
|
+
bin/itpay
|
|
105
|
+
vendor/itpay-cli/
|
|
106
|
+
bundle.lock.json
|
|
107
|
+
README.md
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
manifest 位于绝对根目录。Skill 命令使用 `${extensionPath}` 定位 bundle,不依赖安装目录名称。
|
|
111
|
+
|
|
112
|
+
### WorkBuddy
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
itpay-skill-workbuddy/
|
|
116
|
+
SKILL.md
|
|
117
|
+
scripts/itpay
|
|
118
|
+
vendor/itpay-cli/
|
|
119
|
+
bundle.lock.json
|
|
120
|
+
README.md
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
最终压缩结构以 WorkBuddy 实际上传校验结果为准。当前官方文档确认可以上传本地技能包,但未公开社区 SkillHub 提交 schema,因此不要预先创造私有 manifest。
|
|
124
|
+
|
|
125
|
+
## 5. Bundle 合同
|
|
126
|
+
|
|
127
|
+
### 第一阶段产物
|
|
128
|
+
|
|
129
|
+
第一阶段使用“vendored Node bundle”,不增加打包器:
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
vendor/itpay-cli/package/ npm 包内容
|
|
133
|
+
vendor/itpay-cli/node_modules/ 仅 production dependencies
|
|
134
|
+
bin/itpay 平台薄启动器
|
|
135
|
+
bundle.lock.json 来源证明
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
运行时不得联网安装。宿主必须已有 Node.js 18+。如果某平台审核环境没有 Node,再单独启动“standalone executable”任务;不要在还没有失败证据时提前维护多架构二进制。
|
|
139
|
+
|
|
140
|
+
### `bundle.lock.json`
|
|
141
|
+
|
|
142
|
+
至少包含:
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"schemaVersion": 1,
|
|
147
|
+
"package": "@itpay/cli",
|
|
148
|
+
"version": "2.0.14",
|
|
149
|
+
"npmIntegrity": "sha512-...",
|
|
150
|
+
"sourceGitSha": "...",
|
|
151
|
+
"generatedAt": "2026-07-21T00:00:00Z",
|
|
152
|
+
"node": ">=18"
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
不要把 token、registry credential、构建机路径或本地身份写入 lock。
|
|
157
|
+
|
|
158
|
+
### 启动器规则
|
|
159
|
+
|
|
160
|
+
- 只调用 bundle 内的 CLI 入口。
|
|
161
|
+
- 正确转发全部参数、stdout、stderr 和 exit code。
|
|
162
|
+
- 不修改 `HOME`,使本地平台继续复用真实 `~/.itpay-v3`。
|
|
163
|
+
- 不回退到 PATH 中的另一个 `itpay`,避免同机双版本不确定性。
|
|
164
|
+
- `itpay --version` 必须等于 `bundle.lock.json.version`。
|
|
165
|
+
|
|
166
|
+
用户全局安装的 CLI 可以同时存在:终端里执行全局 `itpay` 使用全局版本;Skill 内必须调用平台 bundle 的绝对路径或 plugin PATH 中的启动器。两者共享同一 `~/.itpay-v3` Device schema,因此共享本地 Device 身份,但代码版本由调用路径明确决定。
|
|
167
|
+
|
|
168
|
+
## 6. Implementation Steps
|
|
169
|
+
|
|
170
|
+
### Step 1:建立 bundle 生成器
|
|
171
|
+
|
|
172
|
+
位置:优先放在 CLI 主仓库 `scripts/`,四个仓库调用同一已发布脚本或复制极小且固定的生成逻辑。
|
|
173
|
+
|
|
174
|
+
- 输入必须是精确 semver,拒绝 `latest`、范围和未发布版本。
|
|
175
|
+
- 从 npm registry 读取版本、dist.integrity 和 gitHead。
|
|
176
|
+
- 下载 tarball并验证 integrity。
|
|
177
|
+
- 安装 `--omit=dev --ignore-scripts` 的精确生产依赖。
|
|
178
|
+
- 删除 npm cache、测试临时文件和不需要的元数据。
|
|
179
|
+
- 生成 `bundle.lock.json`。
|
|
180
|
+
|
|
181
|
+
依赖:现有 npm 发布成功。
|
|
182
|
+
|
|
183
|
+
### Step 2:建立四个平台仓库
|
|
184
|
+
|
|
185
|
+
- 每个仓库只保留一个平台的 manifest、Skill、bundle、测试和发布说明。
|
|
186
|
+
- 平台专用 Skill 从当前 `skills/itpay/SKILL.md` 派生,但认证、路径和工具选择规则允许平台差异。
|
|
187
|
+
- 通用业务规则不得四处手工修改;同步器每次更新时生成或校验通用段落。
|
|
188
|
+
- 支付相关公共 Skill 默认只引导外部 Checkout;operator escape hatch 不作为推荐工作流。
|
|
189
|
+
|
|
190
|
+
依赖:Step 1。
|
|
191
|
+
|
|
192
|
+
### Step 3:加入仓库内验证
|
|
193
|
+
|
|
194
|
+
每个平台至少验证:
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
没有全局 itpay 命令
|
|
198
|
+
不允许测试过程访问 npm registry
|
|
199
|
+
bundle itpay --version == lock.version
|
|
200
|
+
bundle itpay skill show itpay --json 成功
|
|
201
|
+
平台 manifest 可被官方 validator/CLI 读取
|
|
202
|
+
启动器路径含空格时仍可运行
|
|
203
|
+
bundle 不包含凭据、.env、~/.itpay-v3 或 npm token
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
本地身份与网络业务测试使用临时 HOME;不得触碰开发者真实 `~/.itpay-v3`。
|
|
207
|
+
|
|
208
|
+
依赖:Step 2。
|
|
209
|
+
|
|
210
|
+
### Step 4:CLI 发布后创建同步 PR
|
|
211
|
+
|
|
212
|
+
修改 CLI 主仓库现有 npm CD:只有 npm publish 成功或确认该 commit 已发布后,才向平台仓库发送带以下字段的事件:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"version": "2.0.14",
|
|
217
|
+
"npm_integrity": "sha512-...",
|
|
218
|
+
"source_git_sha": "..."
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
平台仓库收到事件后:
|
|
223
|
+
|
|
224
|
+
- 重新生成 bundle;
|
|
225
|
+
- 更新 manifest 版本、lock、changelog;
|
|
226
|
+
- 跑全套测试;
|
|
227
|
+
- 创建 `sync @itpay/cli X.Y.Z` PR;
|
|
228
|
+
- PR 描述列出 CLI commit、integrity、平台测试和是否需要商店重新审核。
|
|
229
|
+
|
|
230
|
+
增加每日一次的版本漂移检查作为丢失事件的兜底,只报警或补 PR,不直接发布。
|
|
231
|
+
|
|
232
|
+
依赖:Step 3。
|
|
233
|
+
|
|
234
|
+
### Step 5:平台发布和回滚
|
|
235
|
+
|
|
236
|
+
- 合并同步 PR 后为平台仓库打与 manifest 一致的 tag。
|
|
237
|
+
- OpenAI、Claude 官方市场和 WorkBuddy 按各自审核流程上传;Gemini GitHub Release 可由 tag 自动生成。
|
|
238
|
+
- 保存每个平台已发布 CLI 版本矩阵。
|
|
239
|
+
- 回滚通过重新发布上一个已验证 bundle 对应的平台版本,不修改或删除用户 Device 身份。
|
|
240
|
+
|
|
241
|
+
依赖:Step 4。
|
|
242
|
+
|
|
243
|
+
## 7. API / Data / Type Changes
|
|
244
|
+
|
|
245
|
+
CLI 业务 API:无。
|
|
246
|
+
|
|
247
|
+
新增发布合同:
|
|
248
|
+
|
|
249
|
+
- `bundle.lock.json` schema。
|
|
250
|
+
- CLI release dispatch payload。
|
|
251
|
+
- 每个平台 manifest 和平台版本。
|
|
252
|
+
|
|
253
|
+
CLI 版本和平台包版本第一阶段保持相同,减少映射成本。若以后平台仅修改说明而 CLI 未变,再引入独立的 `pluginVersion`,同时保留 `cliVersion`;现在不提前增加双版本系统。
|
|
254
|
+
|
|
255
|
+
## 8. Tests / Verification
|
|
256
|
+
|
|
257
|
+
### 自动化
|
|
258
|
+
|
|
259
|
+
- bundle integrity、精确版本和依赖完整性。
|
|
260
|
+
- 无全局 CLI、离线 smoke、路径含空格、Windows 启动。
|
|
261
|
+
- Skill frontmatter/manifest 校验。
|
|
262
|
+
- secret scan 和危险文件清单。
|
|
263
|
+
- 发布矩阵与 npm 当前版本漂移检测。
|
|
264
|
+
|
|
265
|
+
### 手动
|
|
266
|
+
|
|
267
|
+
- 四个平台全新安装。
|
|
268
|
+
- 同机存在全局旧版 CLI 时,Skill 仍调用 bundle 版本。
|
|
269
|
+
- Skill 更新后 bundle 版本更新,但 `~/.itpay-v3/device` 未变化。
|
|
270
|
+
- 平台卸载 Skill 后不删除用户已有 CLI Device 身份;是否保留平台专用缓存按平台规则处理。
|
|
271
|
+
|
|
272
|
+
## 9. Risks / Uncertainties
|
|
273
|
+
|
|
274
|
+
- OpenAI Skill 沙箱是否提供满足要求的 Node 运行时不能作为稳定合同;ChatGPT 路径应以远程 MCP 为主。
|
|
275
|
+
- vendored `node_modules` 会增大包体,但当前依赖很少,先以真实平台大小限制验证,不提前引入 bundler。
|
|
276
|
+
- 四个仓库意味着四套审核节奏,但不意味着四套 CLI 业务实现。
|
|
277
|
+
- WorkBuddy 公共 SkillHub 提交通道未公开,自动化只能先生成可上传包。
|
|
278
|
+
- 平台安全扫描可能拒绝支付或可执行 bundle;拒绝原因应反馈到相应平台仓库,不改变其他平台已通过版本。
|
|
279
|
+
|
|
280
|
+
## 10. Checkpoint
|
|
281
|
+
|
|
282
|
+
仓库创建和跨仓凭据配置属于外部状态操作。实施到该步骤时需要仓库组织名、创建权限和最小权限 GitHub App/PAT;在此之前可以完成生成器、模板和本地验证。
|