@alipay/alipay-aipay 1.0.2 → 1.1.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/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +70 -21
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/prepare-tools.d.ts.map +1 -1
- package/dist/commands/prepare-tools.js +16 -4
- package/dist/commands/prepare-tools.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +8 -8
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/alipay-cli.d.ts +6 -0
- package/dist/utils/alipay-cli.d.ts.map +1 -1
- package/dist/utils/alipay-cli.js +34 -18
- package/dist/utils/alipay-cli.js.map +1 -1
- package/dist/utils/file.d.ts +9 -2
- package/dist/utils/file.d.ts.map +1 -1
- package/dist/utils/file.js +33 -3
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/gpg.d.ts.map +1 -1
- package/dist/utils/gpg.js +97 -53
- package/dist/utils/gpg.js.map +1 -1
- package/dist/utils/jq.d.ts.map +1 -1
- package/dist/utils/jq.js +6 -9
- package/dist/utils/jq.js.map +1 -1
- package/dist/utils/npm.d.ts.map +1 -1
- package/dist/utils/npm.js +2 -6
- package/dist/utils/npm.js.map +1 -1
- package/dist/utils/shell.d.ts +15 -2
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +216 -12
- package/dist/utils/shell.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +4 -1
- package/skill/VERSION +1 -0
- package/skill/references/integration/flow.md +7 -31
- package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +9 -2
- package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +8 -5
- package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +98 -114
- package/skill/references/normal/alipay-cli-env.md +11 -9
- package/skill/references/normal/self-update.md +59 -0
- package/skill/references/onboarding/flow.md +26 -2
- package/skill/references/onboarding/modules/authorization.md +30 -9
- package/skill/references/onboarding/modules/product-sign.md +2 -0
- package/skill/references/onboarding/modules/scripts/auth.sh +15 -2
package/dist/utils/shell.js
CHANGED
|
@@ -1,46 +1,250 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* 执行短命令并强制约束总耗时。使用独立进程组,超时时尽量杀掉 shell
|
|
4
|
+
* 及其子进程,避免工具检测命令异常时拖住 install/update。
|
|
5
|
+
*/
|
|
6
|
+
export function execCommand(command, timeout = 5000) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const child = spawn('sh', ['-c', command], {
|
|
9
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
10
|
+
detached: true,
|
|
11
|
+
});
|
|
12
|
+
let settled = false;
|
|
13
|
+
let timedOut = false;
|
|
14
|
+
let stdout = '';
|
|
15
|
+
let stderr = '';
|
|
16
|
+
let timeoutTimer = null;
|
|
17
|
+
let killTimer = null;
|
|
18
|
+
let fallbackTimer = null;
|
|
19
|
+
function clearTimers() {
|
|
20
|
+
if (timeoutTimer) {
|
|
21
|
+
clearTimeout(timeoutTimer);
|
|
22
|
+
timeoutTimer = null;
|
|
23
|
+
}
|
|
24
|
+
if (killTimer) {
|
|
25
|
+
clearTimeout(killTimer);
|
|
26
|
+
killTimer = null;
|
|
27
|
+
}
|
|
28
|
+
if (fallbackTimer) {
|
|
29
|
+
clearTimeout(fallbackTimer);
|
|
30
|
+
fallbackTimer = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function killChild(signal) {
|
|
34
|
+
try {
|
|
35
|
+
if (child.pid) {
|
|
36
|
+
process.kill(-child.pid, signal);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
child.kill(signal);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
try {
|
|
44
|
+
child.kill(signal);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// ignore
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function releaseChildHandles() {
|
|
52
|
+
try {
|
|
53
|
+
child.stdout?.destroy();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// ignore
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
child.stderr?.destroy();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// ignore
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
child.unref();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// ignore
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function rejectTimeout() {
|
|
72
|
+
if (settled)
|
|
73
|
+
return;
|
|
74
|
+
settled = true;
|
|
75
|
+
clearTimers();
|
|
76
|
+
releaseChildHandles();
|
|
77
|
+
reject(new Error(`Command timed out after ${timeout}ms\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`));
|
|
78
|
+
}
|
|
79
|
+
if (child.stdout) {
|
|
80
|
+
child.stdout.on('data', (data) => {
|
|
81
|
+
stdout += data.toString();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (child.stderr) {
|
|
85
|
+
child.stderr.on('data', (data) => {
|
|
86
|
+
stderr += data.toString();
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
timeoutTimer = setTimeout(() => {
|
|
90
|
+
timedOut = true;
|
|
91
|
+
killChild('SIGTERM');
|
|
92
|
+
killTimer = setTimeout(() => killChild('SIGKILL'), 1000);
|
|
93
|
+
fallbackTimer = setTimeout(rejectTimeout, 1500);
|
|
94
|
+
}, timeout);
|
|
95
|
+
child.on('close', (code) => {
|
|
96
|
+
if (settled)
|
|
97
|
+
return;
|
|
98
|
+
settled = true;
|
|
99
|
+
clearTimers();
|
|
100
|
+
if (timedOut) {
|
|
101
|
+
reject(new Error(`Command timed out after ${timeout}ms\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (code === 0) {
|
|
105
|
+
resolve({ stdout, stderr });
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
reject(new Error(`Command exited with code ${code}\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`));
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
child.on('error', (error) => {
|
|
112
|
+
if (settled)
|
|
113
|
+
return;
|
|
114
|
+
settled = true;
|
|
115
|
+
clearTimers();
|
|
116
|
+
reject(error);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
2
120
|
/**
|
|
3
121
|
* 执行可能需要交互式输入的命令(如 sudo 密码、brew 确认等)
|
|
4
122
|
* 有 TTY 时使用 stdio: 'inherit' 让子进程直接访问终端
|
|
5
|
-
* 无 TTY 时(AI agent
|
|
123
|
+
* 无 TTY 时(AI agent 环境)捕获输出,供错误摘要使用
|
|
124
|
+
* 传入 idleTimeout 时,有输出就续期,只在长时间无输出时终止命令
|
|
6
125
|
*/
|
|
7
|
-
export function execInteractive(command, timeout = 300000) {
|
|
126
|
+
export function execInteractive(command, timeout = 300000, options = {}) {
|
|
8
127
|
return new Promise((resolve, reject) => {
|
|
9
128
|
const hasTty = process.stdin.isTTY;
|
|
129
|
+
const monitorOutput = typeof options.idleTimeout === 'number' && options.idleTimeout > 0;
|
|
10
130
|
const child = spawn('sh', ['-c', command], {
|
|
11
|
-
stdio: hasTty ? 'inherit' : ['pipe', 'pipe', 'pipe'],
|
|
131
|
+
stdio: hasTty && !monitorOutput ? 'inherit' : ['pipe', 'pipe', 'pipe'],
|
|
132
|
+
detached: monitorOutput,
|
|
12
133
|
});
|
|
13
|
-
|
|
134
|
+
let settled = false;
|
|
14
135
|
let stdout = '';
|
|
15
136
|
let stderr = '';
|
|
16
|
-
|
|
137
|
+
let pendingFailure = null;
|
|
138
|
+
let timeoutTimer = null;
|
|
139
|
+
let idleTimer = null;
|
|
140
|
+
let forceKillTimer = null;
|
|
141
|
+
let failureFallbackTimer = null;
|
|
142
|
+
function clearTimers() {
|
|
143
|
+
if (timeoutTimer) {
|
|
144
|
+
clearTimeout(timeoutTimer);
|
|
145
|
+
timeoutTimer = null;
|
|
146
|
+
}
|
|
147
|
+
if (idleTimer) {
|
|
148
|
+
clearTimeout(idleTimer);
|
|
149
|
+
idleTimer = null;
|
|
150
|
+
}
|
|
151
|
+
if (forceKillTimer) {
|
|
152
|
+
clearTimeout(forceKillTimer);
|
|
153
|
+
forceKillTimer = null;
|
|
154
|
+
}
|
|
155
|
+
if (failureFallbackTimer) {
|
|
156
|
+
clearTimeout(failureFallbackTimer);
|
|
157
|
+
failureFallbackTimer = null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function terminateChild(signal) {
|
|
161
|
+
try {
|
|
162
|
+
if (monitorOutput && child.pid) {
|
|
163
|
+
process.kill(-child.pid, signal);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
child.kill(signal);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
try {
|
|
171
|
+
child.kill(signal);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// ignore
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function fail(error) {
|
|
179
|
+
if (settled)
|
|
180
|
+
return;
|
|
181
|
+
if (pendingFailure)
|
|
182
|
+
return;
|
|
183
|
+
pendingFailure = error;
|
|
184
|
+
clearTimers();
|
|
185
|
+
terminateChild('SIGTERM');
|
|
186
|
+
forceKillTimer = setTimeout(() => terminateChild('SIGKILL'), 2000);
|
|
187
|
+
failureFallbackTimer = setTimeout(() => {
|
|
188
|
+
if (settled)
|
|
189
|
+
return;
|
|
190
|
+
settled = true;
|
|
191
|
+
clearTimers();
|
|
192
|
+
reject(error);
|
|
193
|
+
}, 3000);
|
|
194
|
+
}
|
|
195
|
+
function resetIdleTimer() {
|
|
196
|
+
if (!monitorOutput || !options.idleTimeout)
|
|
197
|
+
return;
|
|
198
|
+
if (idleTimer)
|
|
199
|
+
clearTimeout(idleTimer);
|
|
200
|
+
idleTimer = setTimeout(() => {
|
|
201
|
+
fail(new Error(`Command idle timed out after ${options.idleTimeout}ms`));
|
|
202
|
+
}, options.idleTimeout);
|
|
203
|
+
}
|
|
204
|
+
if (child.stdout) {
|
|
17
205
|
child.stdout.on('data', (data) => {
|
|
18
206
|
stdout += data.toString();
|
|
207
|
+
if (hasTty && monitorOutput)
|
|
208
|
+
process.stdout.write(data);
|
|
209
|
+
resetIdleTimer();
|
|
19
210
|
});
|
|
20
211
|
}
|
|
21
|
-
if (
|
|
212
|
+
if (child.stderr) {
|
|
22
213
|
child.stderr.on('data', (data) => {
|
|
23
214
|
stderr += data.toString();
|
|
215
|
+
if (hasTty && monitorOutput)
|
|
216
|
+
process.stderr.write(data);
|
|
217
|
+
resetIdleTimer();
|
|
24
218
|
});
|
|
25
219
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
reject(new Error('Command timed out'));
|
|
220
|
+
timeoutTimer = setTimeout(() => {
|
|
221
|
+
fail(new Error(`Command timed out after ${timeout}ms`));
|
|
29
222
|
}, timeout);
|
|
223
|
+
resetIdleTimer();
|
|
30
224
|
child.on('close', (code) => {
|
|
31
|
-
|
|
225
|
+
if (settled)
|
|
226
|
+
return;
|
|
227
|
+
settled = true;
|
|
228
|
+
clearTimers();
|
|
229
|
+
if (pendingFailure) {
|
|
230
|
+
reject(pendingFailure);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
32
233
|
if (code === 0) {
|
|
33
234
|
resolve(code);
|
|
34
235
|
}
|
|
35
236
|
else {
|
|
36
|
-
const errMsg = hasTty
|
|
237
|
+
const errMsg = hasTty && !monitorOutput
|
|
37
238
|
? `Command exited with code ${code}`
|
|
38
239
|
: `Command exited with code ${code}\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`;
|
|
39
240
|
reject(new Error(errMsg));
|
|
40
241
|
}
|
|
41
242
|
});
|
|
42
243
|
child.on('error', (err) => {
|
|
43
|
-
|
|
244
|
+
if (settled)
|
|
245
|
+
return;
|
|
246
|
+
settled = true;
|
|
247
|
+
clearTimers();
|
|
44
248
|
reject(err);
|
|
45
249
|
});
|
|
46
250
|
});
|
package/dist/utils/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAWtC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAO,GAAG,IAAI;IACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YACzC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,YAAY,GAAyC,IAAI,CAAC;QAC9D,IAAI,SAAS,GAAyC,IAAI,CAAC;QAC3D,IAAI,aAAa,GAAyC,IAAI,CAAC;QAE/D,SAAS,WAAW;YAClB,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QAED,SAAS,SAAS,CAAC,MAAsB;YACvC,IAAI,CAAC;gBACH,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS,mBAAmB;YAC1B,IAAI,CAAC;gBACH,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,SAAS,aAAa;YACpB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,EAAE,CAAC;YACd,mBAAmB,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,eAAe,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5H,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YACzD,aAAa,GAAG,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,EAAE,CAAC;YACd,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,eAAe,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1H,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,OAAO,GAAG,MAAM,EAChB,UAAkC,EAAE;IAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QACnC,MAAM,aAAa,GAAG,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAEzF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YACzC,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YACtE,QAAQ,EAAE,aAAa;SACxB,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,cAAc,GAAiB,IAAI,CAAC;QAExC,IAAI,YAAY,GAAyC,IAAI,CAAC;QAC9D,IAAI,SAAS,GAAyC,IAAI,CAAC;QAC3D,IAAI,cAAc,GAAyC,IAAI,CAAC;QAChE,IAAI,oBAAoB,GAAyC,IAAI,CAAC;QAEtE,SAAS,WAAW;YAClB,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC7B,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,YAAY,CAAC,oBAAoB,CAAC,CAAC;gBACnC,oBAAoB,GAAG,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,SAAS,cAAc,CAAC,MAAsB;YAC5C,IAAI,CAAC;gBACH,IAAI,aAAa,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS,IAAI,CAAC,KAAY;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,IAAI,cAAc;gBAAE,OAAO;YAC3B,cAAc,GAAG,KAAK,CAAC;YACvB,WAAW,EAAE,CAAC;YACd,cAAc,CAAC,SAAS,CAAC,CAAC;YAC1B,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YACnE,oBAAoB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACrC,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAED,SAAS,cAAc;YACrB,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,WAAW;gBAAE,OAAO;YACnD,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,IAAI,KAAK,CAAC,gCAAgC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;YAC3E,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,IAAI,MAAM,IAAI,aAAa;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxD,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,IAAI,MAAM,IAAI,aAAa;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxD,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,cAAc,EAAE,CAAC;QAEjB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,EAAE,CAAC;YACd,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,CAAC,cAAc,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa;oBACrC,CAAC,CAAC,4BAA4B,IAAI,EAAE;oBACpC,CAAC,CAAC,4BAA4B,IAAI,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvG,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAC/B,CAAC"}
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -34,9 +34,11 @@ description: >-
|
|
|
34
34
|
### 执行流程(通用)
|
|
35
35
|
|
|
36
36
|
```
|
|
37
|
-
用户输入 → 加载 references/integration/flow.md 或 references/onboarding/flow.md → 输出待办步骤清单 → 等待确认 → 逐步执行
|
|
37
|
+
用户输入 → best-effort 自更新检查 → 加载 references/integration/flow.md 或 references/onboarding/flow.md → 输出待办步骤清单 → 等待确认 → 逐步执行
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
**启动自更新检查**:每次触发本 Skill 时,先读取并执行 `references/normal/self-update.md` 的 best-effort 自更新检查。若本轮对话中刚成功执行过 `npx -y @alipay/alipay-aipay@latest install`,则视为检查已完成,直接继续后续流程。该检查不作为业务阻塞确认点;若当前 Agent 环境要求联网或写入用户 Skill 目录授权,则按环境权限机制处理。
|
|
41
|
+
|
|
40
42
|
**产品推荐入口:**
|
|
41
43
|
- 集成场景:读取 `references/integration/modules/product-decision.md` 做支付产品推荐与澄清。
|
|
42
44
|
- 签约/入驻场景:读取 `references/onboarding/flow.md` 的 Step 2“方案规划”做产品匹配与推荐。
|
|
@@ -68,6 +70,7 @@ alipay-aipay/
|
|
|
68
70
|
└── references/
|
|
69
71
|
├── normal/ # 通用文档(集成 + 签约共用)
|
|
70
72
|
│ ├── alipay-cli-env.md # alipay-cli 检测与安装
|
|
73
|
+
│ ├── self-update.md # 启动自更新检查
|
|
71
74
|
│ ├── rejection-guide.md # 不支持产品的拒绝引导话术
|
|
72
75
|
│ └── scripts/ # 通用脚本
|
|
73
76
|
│ ├── common.sh # shell 公共函数与初始化入口
|
package/skill/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.0.6
|
|
@@ -163,43 +163,19 @@ Agent 出现如下任何一种行为即视为违规:
|
|
|
163
163
|
> ⚠️ **必须完整阅读** `modules/sandbox/sandbox-setup-guide.md` 后方可执行本步骤
|
|
164
164
|
|
|
165
165
|
**完成条件**:
|
|
166
|
-
- [M-02] **必须**已完整阅读 `modules/sandbox/sandbox-setup-guide.md
|
|
166
|
+
- [M-02] **必须**已完整阅读 `modules/sandbox/sandbox-setup-guide.md`
|
|
167
167
|
- [M-02] 已检测用户操作系统类型
|
|
168
|
-
- [M-02] Unix/macOS/Linux
|
|
169
|
-
- [M-02] Windows
|
|
170
|
-
- [M-02]
|
|
168
|
+
- [M-02] Unix/macOS/Linux:已调用沙箱工具获取候选沙箱 `data`
|
|
169
|
+
- [M-02] Windows:已引导用户自行获取沙箱信息并提供配置
|
|
170
|
+
- [M-02] 已按 `sandbox-setup-guide.md` 完成字段完整性校验、正式落盘、摘要输出、配置文件路径输出和成功创建后提示
|
|
171
171
|
|
|
172
172
|
**操作流程**:
|
|
173
173
|
1. 检测用户操作系统(Windows/macOS/Linux)
|
|
174
174
|
2. Windows用户:引导自行获取沙箱信息,参考 `modules/sandbox/sandbox-setup-guide.md` 第 1.2 节
|
|
175
|
-
3. Unix/macOS/Linux
|
|
175
|
+
3. Unix/macOS/Linux用户:参考 `modules/sandbox/alipay-sandbox-tool.md` 调用沙箱工具
|
|
176
|
+
4. 按 `modules/sandbox/sandbox-setup-guide.md` 的顺序处理候选 `data`:字段完整性校验 → 正式落盘 → 输出关键摘要与配置文件路径
|
|
176
177
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
> 详细输出格式见 `modules/sandbox/sandbox-setup-guide.md` 第 3.2 节
|
|
180
|
-
>
|
|
181
|
-
> **必须按表格格式输出**,包含以下全部内容:
|
|
182
|
-
|
|
183
|
-
| 类别 | 必含字段 |
|
|
184
|
-
|------|---------|
|
|
185
|
-
| 应用配置 | `appId`、`appPrivateKey`、`appPrivatePkcsKey`、`alipayPublicKey`、`appPublicKey`、`pid` |
|
|
186
|
-
| 商家账号 | `accountDesc`、`email`、`merchantId`、`userId`、`acctrans` |
|
|
187
|
-
| 买家账号 | `accountDesc`、`email`、`userName`、`userId`、`logonPassword`、`payPassword` |
|
|
188
|
-
| 沙箱信息 | `sandboxId`、`sandboxName` |
|
|
189
|
-
|
|
190
|
-
**强校验规则**:
|
|
191
|
-
- 工具返回后,**必须逐项核对**上述必含字段是否存在且非空
|
|
192
|
-
- 如有字段缺失,**阻断流程**,要求重新创建
|
|
193
|
-
- 后续步骤将沙箱配置写入用户项目后,必须做配置准确性后置校验,确认写入值来自同一份沙箱返回配置,且与沙箱返回值一致、字段选择正确、SDK 配置匹配、无占位符或截断。校验失败必须阻断后续联调,先重新复制沙箱字段或修正 SDK 配置。
|
|
194
|
-
|
|
195
|
-
**绝对禁止**:
|
|
196
|
-
- ❌ 禁止编造字段
|
|
197
|
-
- ❌ 禁止用占位符(xxx)代替真实返回值
|
|
198
|
-
- ❌ 禁止用示例假数据(如 `MIIEvw...`)冒充
|
|
199
|
-
- ❌ 禁止使用 JSON 代码块输出
|
|
200
|
-
- ❌ 禁止省略任何字段
|
|
201
|
-
|
|
202
|
-
> ⚠️ 详细操作、输出格式、强校验规则、红线禁止请参阅 `modules/sandbox/sandbox-setup-guide.md`
|
|
178
|
+
> 沙箱必含字段、落盘格式、路径输出、重复创建红线、失败处理和写入项目后的后置校验,均以 `modules/sandbox/sandbox-setup-guide.md` 为准。
|
|
203
179
|
|
|
204
180
|
---
|
|
205
181
|
|
|
@@ -160,10 +160,17 @@ python3 ../scripts/local_402_sandbox_pay.py run \
|
|
|
160
160
|
|
|
161
161
|
同时提醒用户:
|
|
162
162
|
|
|
163
|
-
>
|
|
163
|
+
> 沙箱支付宝当前仅支持安卓系统。如果尚未安装沙箱版支付宝,请复制以下链接到网页浏览器打开,并使用支付宝客户端扫码下载:
|
|
164
164
|
>
|
|
165
165
|
> https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original
|
|
166
166
|
|
|
167
|
+
**沙箱支付宝下载红线(Agent 内部约束,不要作为用户提示逐字输出):**
|
|
168
|
+
- 默认只提供上方沙箱支付宝安装直链,复制到网页浏览器打开,并使用支付宝客户端扫码下载。
|
|
169
|
+
- 严禁声称 iOS 也有沙箱版支付宝或可在 iOS 完成沙箱支付宝安装。
|
|
170
|
+
- 严禁引导用户去应用市场、应用商店、搜索引擎或任何第三方站点搜索/下载“沙箱支付宝”。
|
|
171
|
+
- 严禁提供 `https://sandbox.alipay.com`、其他自编 URL、二维码、安装包名称或下载方式。
|
|
172
|
+
- 如果用户明确反馈上述直链、页面二维码无法打开或无法下载,只能引导用户前往支付宝开放平台沙箱工具页 `https://open.alipay.com/develop/sandbox/tool`,按页面指引安装沙箱版支付宝;不得自行补充其他替代渠道。
|
|
173
|
+
|
|
167
174
|
等待用户确认付款成功后,记录过程产物目录 `$ARTIFACT_DIR`,进入第四步。
|
|
168
175
|
|
|
169
176
|
### 第四步:验证 Payment-Proof 重试
|
|
@@ -247,7 +254,7 @@ python3 ../scripts/local_402_sandbox_pay.py run --url "$SERVICE_URL" --metho
|
|
|
247
254
|
3. **过程产物**:默认写入 `/tmp/alipay_local_402_sandbox_pay_<timestamp>`,可通过 `--artifact-dir` 指定
|
|
248
255
|
4. **买家签名**:默认占位值 `-`,无需修改
|
|
249
256
|
5. **沙箱化 Agent 网络权限**:脚本内 `fetch_payment_needed` 使用 curl,且收银测试会访问沙箱接口;沙箱化 Agent 环境首次执行即申请可联网权限
|
|
250
|
-
6.
|
|
257
|
+
6. **沙箱支付宝安装包**:沙箱支付宝当前仅支持安卓系统;默认引导用户复制 `https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original` 到网页浏览器打开,并使用支付宝客户端扫码下载。若用户明确反馈该直链、页面二维码无法打开或无法下载,只能引导用户前往支付宝开放平台沙箱工具页 `https://open.alipay.com/develop/sandbox/tool`,按页面指引安装沙箱版支付宝。严禁引导用户使用 iOS 沙箱支付宝、应用市场搜索、`https://sandbox.alipay.com` 或其他自编下载 URL。
|
|
251
258
|
|
|
252
259
|
---
|
|
253
260
|
|
|
@@ -14,7 +14,7 @@ which alipay-cli 2>/dev/null && alipay-cli version
|
|
|
14
14
|
|
|
15
15
|
## 2. 创建快速沙箱
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
**重要:工具返回的 `data` 只是候选沙箱配置;必须先按 `sandbox-setup-guide.md` 完成字段完整性校验,校验通过后再写入正式本地配置文件。对话中只展示关键字段摘要和配置文件路径,避免 privateKey、publicKey、账号密码等长字段刷屏。**
|
|
18
18
|
|
|
19
19
|
`createAnonymousSandbox` 的 MCP 请求体只有业务入参 `request.appType`。`PLATFORM`、`PRODUCT` 是 alipay-cli 上下文环境变量,禁止写入 `--data` 的 JSON。
|
|
20
20
|
|
|
@@ -54,8 +54,9 @@ alipay-cli mcp call alipay-anonymous-sandbox.createAnonymousSandbox \
|
|
|
54
54
|
**结果解析:**
|
|
55
55
|
|
|
56
56
|
1. 取 `result.content[0].text`,去转义还原 JSON
|
|
57
|
-
2. `success === true` →
|
|
58
|
-
3.
|
|
57
|
+
2. `success === true` → 提取 `data` 字段作为候选沙箱配置,先按 [沙箱环境初始化](sandbox-setup-guide.md) 的必含字段清单做完整性校验
|
|
58
|
+
3. 字段完整性校验通过 → 将 `data` 字段完整写入正式本地配置文件,并按摘要输出格式展示关键字段;保持本地文件中的原始字段值不变,不在对话中复述长字段
|
|
59
|
+
4. `success !== true` 或 `data` 字段缺失/字段不完整 → 按错误处理流程阻断;不得写入正式 `.alipay-sandbox.json`
|
|
59
60
|
|
|
60
61
|
## 3. 错误处理
|
|
61
62
|
|
|
@@ -74,9 +75,11 @@ CLI 输出不暴露 HTTP 状态码,统一按响应体中的 `success` 字段
|
|
|
74
75
|
- 执行前向用户展示即将运行的命令
|
|
75
76
|
- 参数不确定时先向用户确认
|
|
76
77
|
|
|
77
|
-
##
|
|
78
|
+
## 返回结构示例
|
|
78
79
|
|
|
79
|
-
###
|
|
80
|
+
### 成功结构示例
|
|
81
|
+
|
|
82
|
+
> 下例仅用于说明字段结构;真实执行时默认只输出关键字段摘要,完整私钥、公钥、账号密码等长字段写入本地配置文件。
|
|
80
83
|
|
|
81
84
|
```json
|
|
82
85
|
{
|