@alipay/alipay-aipay 1.7.6-beta.2 → 1.7.6
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/package.json +2 -2
- package/skill/SKILL.md +3 -11
- package/skill/VERSION +1 -1
- package/skill/references/normal/scripts/channel_offer.mjs +18 -59
- package/skill/references/normal/scripts/self_update.mjs +1 -1
- package/skill/references/normal/self-update.md +1 -1
- package/skill-pre/SKILL.md +1 -1
- package/skill-pre/references/integration/flow.md +18 -18
- package/skill-pre/references/integration/modules/checklist.md +3 -3
- package/skill-pre/references/integration/modules/sandbox/sandbox-setup-guide.md +27 -27
- package/skill-pre/references/normal/full-process-routing.md +1 -1
- package/skill-pre/references/normal/json/policy-rules.json +1 -1
- package/skill-pre/references/normal/scripts/alipay_cli_env.mjs +1 -1
- package/skill-pre/references/normal/scripts/runtime.mjs +5 -0
- package/skill-pre/references/normal/scripts/self_update.mjs +1 -1
- package/skill-pre/references/normal/scripts/windows/routing.mjs +18 -4
- package/skill-pre/references/normal/self-update.md +1 -1
- package/skill-pre/references/normal/windows-environment.md +6 -2
- package/skill-pre/references/onboarding/flow.md +2 -0
- package/skill-pre/references/runtime-entry.md +1 -1
- package/skill/references/normal/json/npm-origin.json +0 -1
- package/skill-pre/references/normal/json/npm-origin.json +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alipay/alipay-aipay",
|
|
3
|
-
"version": "1.7.6
|
|
3
|
+
"version": "1.7.6",
|
|
4
4
|
"description": "支付宝 AI 付接入 Skill 安装包 - 优先安装 Agent Skill,并在 macOS/Linux 后台准备用户级 CLI 工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"typescript": "^5.3.3"
|
|
56
56
|
},
|
|
57
57
|
"alipayAipayChannels": {
|
|
58
|
-
"stable": "1.7.
|
|
58
|
+
"stable": "1.7.3",
|
|
59
59
|
"pre": "1.7.5-pre"
|
|
60
60
|
}
|
|
61
61
|
}
|
package/skill/SKILL.md
CHANGED
|
@@ -31,7 +31,7 @@ powershell.exe -NoProfile -NonInteractive -File "<SKILL_DIR>/references/normal/s
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
本目录的 `references/normal/json/release-channel.json` 固定当前渠道;正式版为 `stable`,预发版为 `pre`。自更新只比较 npm latest 元数据中的本渠道 Skill 版本与本地 `VERSION`,不以 npm
|
|
34
|
+
本目录的 `references/normal/json/release-channel.json` 固定当前渠道;正式版为 `stable`,预发版为 `pre`。自更新只比较 npm latest 元数据中的本渠道 Skill 版本与本地 `VERSION`,不以 npm 包版本判断是否需要更新,不切换或扫描另一渠道。缺少合法渠道元数据时保留当前版本。 本地 beta 测试版本固定使用当前版本,不查询 npm、不自动升级或转正;常规版本只接收本渠道非 beta 版本。此判断由同一自更新命令完成,Agent 不自行判断或修改 VERSION。
|
|
35
35
|
|
|
36
36
|
本次 Agent 对话首次使用 `alipay-aipay` 时,先把本文件所在目录解析为规范化绝对路径 `<SKILL_DIR>`,记录一次性事实 `ALIPAY_AIPAY_SELF_UPDATE_CHECKED=true`,再执行以下单条命令。`<SKILL_DIR>` 是执行时替换的路径占位符;禁止用 shell 变量赋值、命令替换或依赖特定 shell:
|
|
37
37
|
|
|
@@ -69,19 +69,13 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" channel-offer decide --
|
|
|
69
69
|
|
|
70
70
|
仅唯一 `ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER=PRE` 可进入内测安装;`STABLE` 表示继续本正式版,记录已处理并按下文刷新 CLI。`UNDECIDED` 表示用户在提问或表达不确定,先回答或澄清,仍等待明确选择;不能把业务催促、泛泛的“继续/OK/1”或通用 `reply confirm` 当作内测授权。任一错误或 marker 不唯一时停止渠道切换,禁止安装。用户以后明确提出切换时,可重新进行这一选择,不受已处理事实限制。
|
|
71
71
|
|
|
72
|
-
`PRE`
|
|
72
|
+
`PRE` 后先执行固定只读预检,确认 npm latest 的预发渠道已包含 Windows 改造版;本地当前工作区或尚未发布的版本不能代替线上事实:
|
|
73
73
|
|
|
74
74
|
```text
|
|
75
75
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" channel-offer available
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
仅唯一 `ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER=AVAILABLE`
|
|
79
|
-
|
|
80
|
-
```text
|
|
81
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" channel-offer install --reply "<USER_REPLY>" --expected-package-version "<核验得到的 npm beta 版本>" --expected-pre-version "<核验得到的内测版 Skill 版本>"
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
`USER_REPLY` 必须是此前判为 `PRE` 的同一条用户原始回复。安装器重新查询同一线上来源;包版本、正式版版本或内测版版本变化时在写入前停止,成功时使用核验所得精确 npm 包版本。Windows 优先复用当前 Node 附带或已有 npm 缓存中的 npm/npx JS 入口,其次查找现成 `.cmd` shim;缺少 npm 命令或 npm 查询进程失败时,版本核验最多回退一次只读查询 npm 官方 registry。此步骤不下载 Node、不创建临时 shim 或修改 PATH。`UNAVAILABLE|CHECK_FAILED`、安装失败与核验失败均按下方恢复规则处理。`CHANNEL_OFFER_REASON` 只用于解释实际失败类别,禁止展示原始内部 marker、npm 输出或敏感诊断。
|
|
78
|
+
仅唯一 `ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER=AVAILABLE` 才执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" channel-offer install --reply "<USER_REPLY>"`,传入此前被判为 `PRE` 的同一条用户原始回复;安装器会在执行前再次确认明确选择和线上版本。Windows 优先复用当前 Node 附带或已有 npm 缓存中的 npm/npx JS 入口,其次查找现成 `.cmd` shim;缺少 npm 命令或 npm 查询进程失败时,版本核验最多回退一次只读查询 npm 官方 registry。此步骤不下载 Node、不创建临时 shim 或修改 PATH。`UNAVAILABLE|CHECK_FAILED`、安装失败与核验失败均按下方恢复规则处理。`CHANNEL_OFFER_REASON` 只用于解释实际失败类别,禁止展示原始内部 marker、npm 输出或敏感诊断。
|
|
85
79
|
|
|
86
80
|
安装入口优先依据当前正式版安装路径绑定同类 Agent 的 Home 安装目标,不让其他 Agent 的残留环境变量决定本轮加载目录。安装器在当前主目标成功或 Windows 已校验会话副本就绪后返回对应结构化结果;channel-offer 会复核实际目录的完整性、`pre` 渠道及 `VERSION` 与本次线上版本完全一致,来自 npm beta 包时还复核安装来源。只有安装退出码为 0、唯一 `CHANNEL_OFFER=INSTALLED|SESSION_READY`、唯一 `CHANNEL_OFFER_PRE_VERSION` 及唯一 `CHANNEL_OFFER_SKILL_DIR=<JSON 字符串>` 时,才从 JSON 字符串取得实际内测版绝对路径。禁止从安装计划、旧内测路径或“进程退出 0”推定成功。该目录须可由当前 Agent 读取;读取失败也按核验失败处理。
|
|
87
81
|
|
|
@@ -99,8 +93,6 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" channel-offer install -
|
|
|
99
93
|
|
|
100
94
|
上述安装重试始终使用已保存、原先判为 `PRE` 的同一条完整回复;用户后来拒绝或切回正式版则立即取消重试。选择继续正式版时记录已处理并执行下文 CLI 刷新,保留原任务,不要求重复描述需求。此选择发生在正式版 telemetry 启动前,不为渠道提示或预发安装创建正式版 run。
|
|
101
95
|
|
|
102
|
-
来自 npm beta 包的 `available` 和 `install` 还须各取得唯一合法的 `ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER_PRE_VERSION=<内测版 Skill 版本>`,两次值完全一致,且安装后目录中的 `VERSION` 等于该值;任一缺失或冲突都不视为切换成功。现有对客提示保持原文,其中手动 `@latest` 安装命令属于常规发布路径;本测试包收到明确内测意图后必须走上述受控切换,不能执行该手动命令代替。
|
|
103
|
-
|
|
104
96
|
仅确定继续正式版后,若当前上下文没有与规范化 `SKILL_DIR`、合法 `VERSION` 绑定的 `ALIPAY_AIPAY_CLI_REFRESHED=true`,必须刷新一次 `alipay-cli`;不得因自更新已检查而跳过。仅唯一终态 `READY` 可在当前对话上下文记录该成功事实、路径和版本,不写缓存或业务状态;三者仍可用且一致时,后续根触发、确认、补材料、候选选择、恢复、中断继续和 Full Process 衔接均不重复刷新。
|
|
105
97
|
|
|
106
98
|
```text
|
package/skill/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.7.
|
|
1
|
+
1.7.3
|
|
@@ -12,20 +12,6 @@ import { isWindowsPlatform } from './platform_compat.mjs';
|
|
|
12
12
|
import { renderMessage } from './render_customer_message.mjs';
|
|
13
13
|
|
|
14
14
|
const marker = 'ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER=';
|
|
15
|
-
const betaPackagePattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)-beta\.\d+$/u;
|
|
16
|
-
const localBetaOrigin = () => {
|
|
17
|
-
const skillDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..');
|
|
18
|
-
const originFile = path.join(skillDir, 'references/normal/json/npm-origin.json');
|
|
19
|
-
if (!fs.existsSync(originFile)) return null;
|
|
20
|
-
try {
|
|
21
|
-
const origin = JSON.parse(fs.readFileSync(originFile, 'utf8'));
|
|
22
|
-
const stableVersion = fs.readFileSync(path.join(skillDir, 'VERSION'), 'utf8').trim();
|
|
23
|
-
if (origin.distTag === 'beta' && betaPackagePattern.test(origin.packageVersion) && versionPattern.test(stableVersion)) {
|
|
24
|
-
return {packageVersion: origin.packageVersion, stableVersion};
|
|
25
|
-
}
|
|
26
|
-
} catch {}
|
|
27
|
-
throw new Error('测试包来源元数据无效');
|
|
28
|
-
};
|
|
29
15
|
const explicitPre = /(?:安装并使用|安装并用|安装|使用|切换到?|切到|转到|换到|换成|改用|改成|选择|试用|试试|体验|启用|用|装|我要|我选|给我)(?:这个|该|一下|下)?(?:内测版|预发版|alipay-aipay-pre)|(?:内测版|预发版|alipay-aipay-pre).{0,6}(?:我想|我要|请)(?:安装|使用|切换|试用|体验)|\b(?:use|install|switch\s+to|try)\s+(?:the\s+)?(?:pre(?:view)?\s+version|alipay-aipay-pre)\b/iu;
|
|
30
16
|
const negativePre = /(?:不(?:准备|希望|打算|需要|愿意|想要|想|要|允许|授权|接受)?|别|不要|无需|无须|暂不|先不|取消|拒绝|禁止)\s*(?:给我|帮我|让我)?\s*(?:安装|切换到?|切到|使用|选择|试用|用|装)?\s*(?:内测版|预发版)|(?:内测版|预发版)\s*(?:不用|不要|算了)|\b(?:no|not|don't|cancel)\b/iu;
|
|
31
17
|
const stableChoice = /(?:^|[,,。;;\s])(?:继续|使用|保持|选择|留在)(?:当前)?(?:的)?(?:正式版|稳定版)|(?:正式版|稳定版).{0,8}(?:继续|就好|即可)|\bstable\b/iu;
|
|
@@ -124,35 +110,26 @@ export function packageManagerInvocation(tool, args, {
|
|
|
124
110
|
|
|
125
111
|
const single = value => Array.isArray(value) && value.length === 1 ? value[0] : value;
|
|
126
112
|
const versionPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u;
|
|
127
|
-
export function parsePublishedPre(stdout
|
|
113
|
+
export function parsePublishedPre(stdout) {
|
|
128
114
|
let metadata;
|
|
129
115
|
try { metadata = single(JSON.parse(stdout)); } catch { return {status: 'CHECK_FAILED', reason: 'INVALID_METADATA'}; }
|
|
130
116
|
const packageVersion = single(metadata?.version);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (!packageMatch || !packageMatch.slice(1,4).map(Number).every(Number.isSafeInteger)) {
|
|
134
|
-
return {status: 'CHECK_FAILED', reason: 'INVALID_METADATA'};
|
|
135
|
-
}
|
|
136
|
-
if (betaOrigin && (packageVersion !== betaOrigin.packageVersion ||
|
|
137
|
-
single(single(metadata?.alipayAipayChannels)?.stable) !== betaOrigin.stableVersion)) {
|
|
138
|
-
return {status: 'UNAVAILABLE', reason: 'BETA_STABLE_MISMATCH'};
|
|
139
|
-
}
|
|
117
|
+
if (typeof packageVersion !== 'string' || !versionPattern.test(packageVersion) ||
|
|
118
|
+
!packageVersion.split('.').map(Number).every(Number.isSafeInteger)) return {status: 'CHECK_FAILED', reason: 'INVALID_METADATA'};
|
|
140
119
|
const value = single(single(metadata?.alipayAipayChannels)?.pre);
|
|
141
120
|
if (value === undefined) return {status: 'UNAVAILABLE', reason: 'PRE_CHANNEL_MISSING'};
|
|
142
|
-
const
|
|
143
|
-
const match = typeof value === 'string' ? prePattern.exec(value) : null;
|
|
121
|
+
const match = typeof value === 'string' ? /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)-pre$/u.exec(value) : null;
|
|
144
122
|
if (!match) return {status: 'CHECK_FAILED', reason: 'INVALID_METADATA'};
|
|
145
123
|
const [major, minor, patch] = match.slice(1).map(Number);
|
|
146
124
|
if (![major, minor, patch].every(Number.isSafeInteger)) return {status: 'CHECK_FAILED', reason: 'INVALID_METADATA'};
|
|
147
125
|
return major > 1 || (major === 1 && (minor > 7 || (minor === 7 && patch >= 4)))
|
|
148
|
-
? {status: 'AVAILABLE', packageVersion, preVersion: value}
|
|
149
|
-
: {status: 'UNAVAILABLE', reason: 'PRE_VERSION_TOO_OLD'};
|
|
126
|
+
? {status: 'AVAILABLE', packageVersion, preVersion: value} : {status: 'UNAVAILABLE', reason: 'PRE_VERSION_TOO_OLD'};
|
|
150
127
|
}
|
|
151
128
|
export const publishedPreFromMetadata = stdout => parsePublishedPre(stdout).status;
|
|
152
129
|
|
|
153
|
-
export function registryMetadata(
|
|
130
|
+
export function registryMetadata() {
|
|
154
131
|
return new Promise((resolve, reject) => {
|
|
155
|
-
const request = https.get(
|
|
132
|
+
const request = https.get('https://registry.npmjs.org/@alipay%2falipay-aipay/latest',
|
|
156
133
|
{headers: {accept: 'application/json'}}, response => {
|
|
157
134
|
if (response.statusCode !== 200) { response.resume(); reject(new Error('REGISTRY_HTTP_ERROR')); return; }
|
|
158
135
|
let data = ''; let bytes = 0;
|
|
@@ -172,23 +149,22 @@ export function registryMetadata(tag = 'latest') {
|
|
|
172
149
|
}
|
|
173
150
|
|
|
174
151
|
export async function publishedWindowsPreAvailable({
|
|
175
|
-
run = spawnSync, readRegistry = registryMetadata,
|
|
152
|
+
run = spawnSync, readRegistry = registryMetadata,
|
|
176
153
|
invocationOptions = {windows: process.platform === 'win32'},
|
|
177
154
|
} = {}) {
|
|
178
|
-
const
|
|
179
|
-
const invocation = packageManagerInvocation('npm', ['view', `@alipay/alipay-aipay@${tag}`, 'version', 'alipayAipayChannels', '--json'], invocationOptions);
|
|
155
|
+
const invocation = packageManagerInvocation('npm', ['view', '@alipay/alipay-aipay@latest', 'version', 'alipayAipayChannels', '--json'], invocationOptions);
|
|
180
156
|
if (invocation) {
|
|
181
157
|
let result;
|
|
182
158
|
try { result = run(invocation.command, invocation.args,
|
|
183
159
|
{env: invocation.env, encoding: 'utf8', timeout: 10000, maxBuffer: 64 * 1024, windowsHide: true, shell: false}); } catch { /* Try the official registry once. */ }
|
|
184
|
-
if (result && !result.error && result.status === 0) return parsePublishedPre(result.stdout
|
|
160
|
+
if (result && !result.error && result.status === 0) return parsePublishedPre(result.stdout);
|
|
185
161
|
}
|
|
186
|
-
try { return parsePublishedPre(await readRegistry(
|
|
162
|
+
try { return parsePublishedPre(await readRegistry()); }
|
|
187
163
|
catch { return {status: 'CHECK_FAILED', reason: 'REGISTRY_UNREACHABLE'}; }
|
|
188
164
|
}
|
|
189
165
|
|
|
190
|
-
const sessionReceiptPrefix = 'ALIPAY_AIPAY_INTERNAL:CHANNEL_SESSION_RESULT=';
|
|
191
166
|
const installReceiptPrefix = 'ALIPAY_AIPAY_INTERNAL:CHANNEL_INSTALL_RESULT=';
|
|
167
|
+
const sessionReceiptPrefix = 'ALIPAY_AIPAY_INTERNAL:CHANNEL_SESSION_RESULT=';
|
|
192
168
|
const sourceSkillDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..');
|
|
193
169
|
|
|
194
170
|
export function channelInstallTarget(skillDir = sourceSkillDir, {home = os.homedir()} = {}) {
|
|
@@ -290,17 +266,13 @@ export function runPreInstaller(invocation, {
|
|
|
290
266
|
}
|
|
291
267
|
|
|
292
268
|
export async function installWindowsPre(reply, {
|
|
293
|
-
query =
|
|
269
|
+
query = publishedWindowsPreAvailable, install = runPreInstaller,
|
|
294
270
|
verify = verifyChannelInstall, target = channelInstallTarget(),
|
|
295
271
|
invocationOptions = {windows: process.platform === 'win32'},
|
|
296
|
-
expectedPackageVersion = null, expectedPreVersion = null,
|
|
297
272
|
} = {}) {
|
|
298
273
|
if (decideChannelOffer(reply) !== 'PRE') return {status: 'UNDECIDED', reason:'EXPLICIT_PRE_REQUIRED'};
|
|
299
274
|
const published = await query();
|
|
300
275
|
if (published.status !== 'AVAILABLE') return published;
|
|
301
|
-
if (expectedPackageVersion && (published.packageVersion !== expectedPackageVersion || published.preVersion !== expectedPreVersion)) {
|
|
302
|
-
return {status:'CHECK_FAILED',reason:'PUBLISHED_PACKAGE_CHANGED'};
|
|
303
|
-
}
|
|
304
276
|
const spec = `@alipay/alipay-aipay@${published.packageVersion}`;
|
|
305
277
|
const targetArgs = target ? ['--target', target] : [];
|
|
306
278
|
const invocation = packageManagerInvocation('npx', ['-y', spec, 'install', '--channel', 'pre', ...targetArgs], invocationOptions)
|
|
@@ -309,20 +281,12 @@ export async function installWindowsPre(reply, {
|
|
|
309
281
|
invocation.env = {...invocation.env, ALIPAY_AIPAY_CHANNEL_OFFER_INSTALL: '1'};
|
|
310
282
|
const installed = await install(invocation);
|
|
311
283
|
if (installed.status !== 'INSTALLED') return installed;
|
|
312
|
-
return verify(installed.stderr || '', published, {target
|
|
284
|
+
return verify(installed.stderr || '', published, {target});
|
|
313
285
|
}
|
|
314
286
|
|
|
315
287
|
function report(outcome) {
|
|
316
288
|
if (outcome.reason) process.stderr.write(`ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER_REASON=${outcome.reason}\n`);
|
|
317
|
-
if (
|
|
318
|
-
/^\d+\.\d+\.\d+-pre$/u.test(outcome.preVersion)) {
|
|
319
|
-
process.stderr.write(`ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER_PRE_VERSION=${outcome.preVersion}\n`);
|
|
320
|
-
}
|
|
321
|
-
if (outcome.status === 'AVAILABLE' &&
|
|
322
|
-
typeof outcome.packageVersion === 'string' &&
|
|
323
|
-
(versionPattern.test(outcome.packageVersion) || betaPackagePattern.test(outcome.packageVersion))) {
|
|
324
|
-
process.stderr.write(`ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER_PACKAGE_VERSION=${outcome.packageVersion}\n`);
|
|
325
|
-
}
|
|
289
|
+
if (outcome.preVersion) process.stderr.write(`ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER_PRE_VERSION=${outcome.preVersion}\n`);
|
|
326
290
|
if (['INSTALLED','SESSION_READY'].includes(outcome.status) && outcome.skillDir) process.stderr.write(`ALIPAY_AIPAY_INTERNAL:CHANNEL_OFFER_SKILL_DIR=${JSON.stringify(outcome.skillDir)}\n`);
|
|
327
291
|
process.stderr.write(`${marker}${outcome.status}\n`);
|
|
328
292
|
}
|
|
@@ -343,16 +307,11 @@ export async function runChannelOfferCli(argv = process.argv) {
|
|
|
343
307
|
return;
|
|
344
308
|
}
|
|
345
309
|
if (action === 'available' && argv.length === 3 && isWindowsPlatform()) {
|
|
346
|
-
report(await publishedWindowsPreAvailable(
|
|
310
|
+
report(await publishedWindowsPreAvailable());
|
|
347
311
|
return;
|
|
348
312
|
}
|
|
349
|
-
if (action === 'install' && isWindowsPlatform()) {
|
|
350
|
-
const
|
|
351
|
-
const regularArgs=argv.length===5 && argv[3]==='--reply';
|
|
352
|
-
const betaArgs=argv.length===9 && argv[3]==='--reply' && argv[5]==='--expected-package-version' && argv[7]==='--expected-pre-version' &&
|
|
353
|
-
betaPackagePattern.test(argv[6]) && /^\d+\.\d+\.\d+-pre$/u.test(argv[8]);
|
|
354
|
-
if (betaOrigin ? !betaArgs : !regularArgs) throw new Error('内测安装参数不完整');
|
|
355
|
-
const outcome = await installWindowsPre(argv[4],betaOrigin ? {expectedPackageVersion:argv[6],expectedPreVersion:argv[8]} : {});
|
|
313
|
+
if (action === 'install' && argv.length === 5 && argv[3] === '--reply' && isWindowsPlatform()) {
|
|
314
|
+
const outcome = await installWindowsPre(argv[4]);
|
|
356
315
|
report(outcome);
|
|
357
316
|
if (!['INSTALLED','SESSION_READY'].includes(outcome.status)) process.exitCode = 1;
|
|
358
317
|
return;
|
|
@@ -377,7 +377,7 @@ export async function runSelfUpdateCli(argv = process.argv) {
|
|
|
377
377
|
const installedVersion = readVersionFile(skillDir);
|
|
378
378
|
const kind = skillVersionKind(installedVersion?.raw, channel);
|
|
379
379
|
// A developer-installed beta is pinned, including when its entry is damaged.
|
|
380
|
-
if (kind === 'beta'
|
|
380
|
+
if (kind === 'beta') return local ? { kind: 'CURRENT', version: local } : { kind: 'VERIFY_FAILED' };
|
|
381
381
|
if (installedVersion && !kind) return { kind: 'CHECK_FAILED' };
|
|
382
382
|
const checked = await npmLatest(channel);
|
|
383
383
|
if (!checked.ok) {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
唯一 stderr 终态:`SELF_UPDATE:CURRENT=<合法 SemVer>`、`SELF_UPDATE:UPDATED=<合法 SemVer>`、`SELF_UPDATE:SESSION_READY=<合法 SemVer>`、`SELF_UPDATE:RETRY_WITH_NETWORK`、`SELF_UPDATE:SKIPPED_NETWORK_RESTRICTED`、`SELF_UPDATE:CHECK_FAILED`、`SELF_UPDATE:INSTALL_FAILED`、`SELF_UPDATE:VERIFY_FAILED`。`UPDATED` 用原子替换后的新版,除 `SESSION_READY` 外其余用当前可用版;marker 异常读当前入口,不得称最新或更新成功;停止读旧版,读取同一根目录的新版入口。仅 `RETRY_WITH_NETWORK` 可取权后原样重试一次,拒绝、不支持或再次返回时读当前入口;一次网络恢复外,不重查、取权、用 `sudo`、要求用户操作或写更新状态。每次只查一次 npm latest 的 `version` 和 `alipayAipayChannels`;只比较本渠道 Skill 版本,npm 包版本仅用于精确下载;`VERSION` 缺失、非法、落后或业务入口缺失时只从查询所得精确 npm 包版本安装当前渠道一次。渠道由当前目录的 `references/normal/json/release-channel.json` 与 Skill 名称共同校验;旧正式版缺少渠道文件时只兼容 `stable`,预发版禁止回退正式版。缺少或非法的远端渠道元数据返回 `CHECK_FAILED`,不得按 npm 包版本兜底。不调用公开 `install --target all`;超时终止同一次调用的进程树并清理。
|
|
6
6
|
|
|
7
|
-
本地正式渠道的 `X.Y.Z-beta`、`X.Y.Z-betaN`(兼容 `-beta.N`)和预发渠道的 `X.Y.Z-pre-beta`、`X.Y.Z-pre-betaN
|
|
7
|
+
本地正式渠道的 `X.Y.Z-beta`、`X.Y.Z-betaN`(兼容 `-beta.N`)和预发渠道的 `X.Y.Z-pre-beta`、`X.Y.Z-pre-betaN` 均为固定测试版本。完整安装直接返回 `CURRENT` 且不查询 npm;业务入口损坏时返回 `VERIFY_FAILED`,仍不下载修复或转正。更换版本必须由测试人员显式执行 npm 安装器的 `install`,普通 `update` 同样不推进 beta。正常版本分别为 `X.Y.Z` 与 `X.Y.Z-pre`,远端对应渠道若为 beta 或名称不匹配,返回 `CHECK_FAILED`,不自动安装。beta 不参与版本排序,无自动追踪和自动转正。
|
|
8
8
|
|
|
9
9
|
`SESSION_READY` 是 Windows 目录占用或权限失败的有限恢复:只有替换前的备份/暂存准备失败,安装器才从本次精确 npm 包创建并逐文件 SHA-256 复核独立副本;不混合覆盖原目录,不更新全局安装记录。必须同时取得唯一 `ALIPAY_AIPAY_INTERNAL:SELF_UPDATE_SESSION_SKILL_DIR=<JSON 字符串>`,用已核验的绝对路径重绑 `SKILL_DIR`,明确告知“全局目录未更新,当前会话使用已校验的新版本;下次会话仍可能加载旧版”。废弃旧 loaded/CLI 刷新事实,保留本渠道自更新已检查事实,立即读取新路径的 `SKILL.md` 并继续其余启动协议,禁止再次自更新。内测版仍需按新路径/版本完成声明及服务/采集选择,安装意图不得代替采集同意。路径 marker 缺失、冲突或新入口不可读时,不切换、不声称更新成功,使用仍可用的原目录或说明入口不可用。
|
|
10
10
|
|
package/skill-pre/SKILL.md
CHANGED
|
@@ -30,7 +30,7 @@ powershell.exe -NoProfile -NonInteractive -File "<SKILL_DIR>/references/normal/s
|
|
|
30
30
|
|
|
31
31
|
## 前置启动协议
|
|
32
32
|
|
|
33
|
-
本目录的 `references/normal/json/release-channel.json` 固定当前渠道;正式版为 `stable`,预发版为 `pre`。自更新只比较 npm latest 元数据中的本渠道 Skill 版本与本地 `VERSION`,不以 npm
|
|
33
|
+
本目录的 `references/normal/json/release-channel.json` 固定当前渠道;正式版为 `stable`,预发版为 `pre`。自更新只比较 npm latest 元数据中的本渠道 Skill 版本与本地 `VERSION`,不以 npm 包版本判断是否需要更新,不切换或扫描另一渠道。缺少合法渠道元数据时保留当前版本。 本地 beta 测试版本固定使用当前版本,不查询 npm、不自动升级或转正;常规版本只接收本渠道非 beta 版本。此判断由同一自更新命令完成,Agent 不自行判断或修改 VERSION。
|
|
34
34
|
|
|
35
35
|
本次 Agent 对话首次使用 `alipay-aipay-pre` 时,先把本文件所在目录解析为规范化绝对路径 `<SKILL_DIR>`,记录一次性事实 `ALIPAY_AIPAY_PRE_SELF_UPDATE_CHECKED=true`,再执行以下单条命令。`<SKILL_DIR>` 是执行时替换的路径占位符;禁止用 shell 变量赋值、命令替换或依赖特定 shell:
|
|
36
36
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_CORE:START -->
|
|
2
2
|
# 支付产品-代码开发流程
|
|
3
3
|
|
|
4
|
-
本 flow 的 Windows READY/LEGACY 指根入口的唯一兼容环境分流事实,或 Windows 环境文档明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 停在环境恢复点,不进入本 flow。后续命令附加当前有效的 `--windows-route`。Windows READY 通过 Git Bash 执行登记的快速沙箱脚本;Windows LEGACY 保留原 Node
|
|
4
|
+
本 flow 的 Windows READY/LEGACY/CODE_ONLY 指根入口的唯一兼容环境分流事实,或 Windows 环境文档明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 停在环境恢复点,不进入本 flow。后续命令附加当前有效的 `--windows-route`。Windows READY 通过 Git Bash 执行登记的快速沙箱脚本;Windows LEGACY/CODE_ONLY 保留原 Node 独立开发和手工沙箱分支。三者都由当前 Agent 串行执行,不启用 Integration Worker。Windows 敏感文件以 NTFS DACL 设置并读回验证代替 POSIX `0600/0700`:只允许当前用户、SYSTEM 和 Administrators;不能证明保护有效时不得使用配置。CLI 业务命令、产品参数、沙箱终态和完成条件不变。CODE_ONLY 只允许 `integration_only`:缺少可选工具或有限准备失败不阻断独立开发,未配置时保持 `VERIFY_PENDING`,不输出站点开通引导;不得将该分流用于 Onboarding 或 Full Process,根意图变化必须重跑 Windows 入口。
|
|
5
5
|
|
|
6
6
|
> ⚠️ **前置声明**:本 flow 仅支持 **AI 网页应用收款、AI 移动应用收款、AI 按量付费**三种产品的集成。原有“网站支付”“APP 支付”“按量付费”仍作为输入别名和资源目录名。**其他产品(当面付、订单码支付、JSAPI支付、预授权支付、商家扣款等)暂不支持**,如需集成请前往[支付宝开放平台](https://open.alipay.com/)查阅相关文档。
|
|
7
7
|
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
## 用户阻塞点索引
|
|
39
39
|
|
|
40
40
|
<!-- GENERATED:INTEGRATION-GUARDS:START -->
|
|
41
|
-
共享护栏:`P-MCP-CONTRACT-FROZEN` 仅用已验证脚本;禁推断或尝试近似方法;`P-SANDBOX-CREDENTIAL-EXCEPTION` Unix/macOS/Linux 与 Windows READY 已校验快速沙箱买家密码仅限登记摘要/付款体验;Windows LEGACY 手工资料仅入受保护项目配置,禁复述、另存或扩展到生产值;`P-SENSITIVE-STATE` 公钥限当前 app 调用且禁复述/保存;敏感值禁入回复/摘要/日志/状态/宽权限文件;临时 URL 仅由登记动作展示;`P-PROJECT-PROTECT` 禁清空/覆盖/删除既有项目;仅改已确认路径和范围;`P-CUSTOMER-OUTPUT-EXCLUSIVE` 登记 stdout 原文是唯一正文;阻塞送达后立即等待;`P-DETERMINISTIC-HANDOFF` 仅执行登记命令并按唯一终态转移;禁追加解析;失败只走登记恢复。
|
|
41
|
+
共享护栏:`P-MCP-CONTRACT-FROZEN` 仅用已验证脚本;禁推断或尝试近似方法;`P-SANDBOX-CREDENTIAL-EXCEPTION` Unix/macOS/Linux 与 Windows READY 已校验快速沙箱买家密码仅限登记摘要/付款体验;Windows LEGACY/CODE_ONLY 手工资料仅入受保护项目配置,禁复述、另存或扩展到生产值;`P-SENSITIVE-STATE` 公钥限当前 app 调用且禁复述/保存;敏感值禁入回复/摘要/日志/状态/宽权限文件;临时 URL 仅由登记动作展示;`P-PROJECT-PROTECT` 禁清空/覆盖/删除既有项目;仅改已确认路径和范围;`P-CUSTOMER-OUTPUT-EXCLUSIVE` 登记 stdout 原文是唯一正文;阻塞送达后立即等待;`P-DETERMINISTIC-HANDOFF` 仅执行登记命令并按唯一终态转移;禁追加解析;失败只走登记恢复。
|
|
42
42
|
<!-- GENERATED:INTEGRATION-GUARDS:END -->
|
|
43
43
|
<!-- GENERATED:INTEGRATION-GUARDS-AIPAY:START -->
|
|
44
44
|
共享护栏:`P-A2M-SANDBOX` A2M 沙箱固定 api_mock_service_id 与沙箱网关;生产值仅用于正式配置;`P-A2M-SUCCESS` 联调仅在 HTTP 200、资源可归属、无业务失败且适用回执有效时通过。
|
|
@@ -144,19 +144,19 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message loc
|
|
|
144
144
|
- [INT.ENV.PROJECT_LANGUAGE_READY] 已确认唯一目标项目路径和服务端语言,且目标项目包含已确认语言的构建标识
|
|
145
145
|
- [INT.SANDBOX.OS_DETECTED] 已检测用户操作系统类型
|
|
146
146
|
- [INT.SANDBOX.PREPARATION_RECORDED] Unix/macOS/Linux 或 Windows READY 已从固定脚本取得唯一 `READY|CREATE_PENDING|VERIFY_PENDING` 终态。`READY` 时配置已安全落盘或复核;待配置不是成功,不满足任何沙箱配置、测试或生产就绪条件,但本步骤允许继续产品确认和代码开发
|
|
147
|
-
- [INT.SANDBOX.WINDOWS_STATE_RECORDED] Windows LEGACY:本轮既有标准消息后提供的完整有效沙箱资料已写入并校验为 `READY`;未进入该资料收集分支时已记录 `VERIFY_PENDING` 并继续代码实现;只有用户明确要求立即配置时才使用既有标准消息收集资料
|
|
147
|
+
- [INT.SANDBOX.WINDOWS_STATE_RECORDED] Windows LEGACY/CODE_ONLY:本轮既有标准消息后提供的完整有效沙箱资料已写入并校验为 `READY`;未进入该资料收集分支时已记录 `VERIFY_PENDING` 并继续代码实现;只有用户明确要求立即配置时才使用既有标准消息收集资料
|
|
148
148
|
|
|
149
149
|
**执行规则**:
|
|
150
150
|
|
|
151
151
|
1. 只确认创建和保存沙箱所需的目标项目路径、服务端语言与操作系统;不得为了创建匿名沙箱先要求用户确定支付产品。缺少多个字段时使用“启动前上下文补问”的固定标准消息一次补齐;字段已能从用户输入和项目事实确定时,不发送环境、项目识别或准备进度消息。
|
|
152
|
-
2. Unix/macOS/Linux 或 Windows READY 从本 flow 目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env integration-check --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`;Windows LEGACY 执行同一命令,仅检查原生 Node。该入口在检查开始时记录环境检查事实,不单独上报 telemetry stage。Windows LEGACY 只检查本 Integration Node runner 所需运行时,不要求 Bash、jq 或当前流程不会调用的 alipay-cli。唯一 `CLI_ENV:READY` 时继续且不读取完整安装文档。Windows READY 检查非零时停止依赖动作,按 `../normal/windows-environment.md` 有限恢复;不得执行下述 Unix 包管理器链。`CLI_ENV:NEEDS_SETUP` 时才读取 `../normal/alipay-cli-env.md`:若唯一 `CLI_ENV_MISSING` 包含 `jq`,先以所需网络和 `~/.local/bin` 写权限执行一次 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env prepare-jq --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`;唯一 `ALIPAY_AIPAY_INTERNAL:JQ_PREPARE=READY` 后原样重跑 `env integration-check`。`FAILED|UNSUPPORTED`,或 `READY` 后复检仍缺 jq 时,由 Agent 按环境文档执行当前系统首选包管理器兜底并再次复检;macOS 必须从清华镜像开始,明确失败后才依次选择阿里云、中科大和直连,不并发、不回到 `prepare-jq` 循环。其他缺失项仍按当前系统分支补齐,完成后重跑检查;不得重复执行 `prepare-jq` 或新增业务确认点。其他输出、非 0 或 marker 冲突停在本步骤。
|
|
152
|
+
2. Unix/macOS/Linux 或 Windows READY 从本 flow 目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env integration-check --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`;Windows LEGACY/CODE_ONLY 执行同一命令,仅检查原生 Node。该入口在检查开始时记录环境检查事实,不单独上报 telemetry stage。Windows LEGACY/CODE_ONLY 只检查本 Integration Node runner 所需运行时,不要求 Bash、jq 或当前流程不会调用的 alipay-cli。唯一 `CLI_ENV:READY` 时继续且不读取完整安装文档。Windows READY 检查非零时停止依赖动作,按 `../normal/windows-environment.md` 有限恢复;不得执行下述 Unix 包管理器链。`CLI_ENV:NEEDS_SETUP` 时才读取 `../normal/alipay-cli-env.md`:若唯一 `CLI_ENV_MISSING` 包含 `jq`,先以所需网络和 `~/.local/bin` 写权限执行一次 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env prepare-jq --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`;唯一 `ALIPAY_AIPAY_INTERNAL:JQ_PREPARE=READY` 后原样重跑 `env integration-check`。`FAILED|UNSUPPORTED`,或 `READY` 后复检仍缺 jq 时,由 Agent 按环境文档执行当前系统首选包管理器兜底并再次复检;macOS 必须从清华镜像开始,明确失败后才依次选择阿里云、中科大和直连,不并发、不回到 `prepare-jq` 循环。其他缺失项仍按当前系统分支补齐,完成后重跑检查;不得重复执行 `prepare-jq` 或新增业务确认点。其他输出、非 0 或 marker 冲突停在本步骤。
|
|
153
153
|
3. Unix/macOS/Linux 或 Windows READY 从本 flow 所在的 `references/integration/` 目录执行唯一准备入口:
|
|
154
154
|
|
|
155
155
|
```bash
|
|
156
156
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox ensure "<规范化项目路径>" "<已确认服务端语言>" [--telemetry-run-id "$RUN_ID" --telemetry-history-count "$HISTORY_COUNT"] --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
-
4. Windows LEGACY 不调用快速沙箱脚本。普通代码开发或完整接入请求没有明确要求当前配置沙箱时,不展示申领消息、不补问,直接记录 `sandboxConfigState=VERIFY_PENDING` 并继续步骤 2。只有用户明确要求现在配置/恢复 Windows LEGACY 沙箱时,才执行下列既有标准消息 `sandbox.windows.manual_setup`;该消息使用自由资料回复,不要求用户输入 `1` 或自行执行脚本。随后只处理用户针对本轮该消息提供的资料:完整有效时写入目标项目的受保护本机配置并记录 `READY`,部分或错误时使用既有受控失败分支补问实际缺失/错误字段:
|
|
159
|
+
4. Windows LEGACY/CODE_ONLY 不调用快速沙箱脚本。普通代码开发或完整接入请求没有明确要求当前配置沙箱时,不展示申领消息、不补问,直接记录 `sandboxConfigState=VERIFY_PENDING` 并继续步骤 2。只有用户明确要求现在配置/恢复 Windows LEGACY/CODE_ONLY 沙箱时,才执行下列既有标准消息 `sandbox.windows.manual_setup`;该消息使用自由资料回复,不要求用户输入 `1` 或自行执行脚本。随后只处理用户针对本轮该消息提供的资料:完整有效时写入目标项目的受保护本机配置并记录 `READY`,部分或错误时使用既有受控失败分支补问实际缺失/错误字段:
|
|
160
160
|
|
|
161
161
|
```bash
|
|
162
162
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message windows-sandbox-setup --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
@@ -165,16 +165,16 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message win
|
|
|
165
165
|
资料校验通过后必须建立适用的版本控制忽略和访问保护。该例外只适用于当前沙箱资料;生产环境应用私钥和密码禁止提供给 Agent。Agent 不得在回复、摘要或普通日志中复述收到的值。
|
|
166
166
|
|
|
167
167
|
5. Unix/macOS/Linux 或 Windows READY 的 `ensure` 只依据同一目标项目的 `.alipay-sandbox.json` 当前事实分流:文件不存在时执行既有 `create`;文件存在或为符号链接时执行既有 `verify` 安全路径。已存在配置不得再次调用 `createAnonymousSandbox`、不得覆盖,也不得因为中断重来要求用户删除配置;无效、不安全或被 Git 跟踪时不得使用,脚本按待配置终态统一输出后继续代码开发。
|
|
168
|
-
6. 只有 Unix/macOS/Linux 或 Windows READY 创建分支会调用冻结的 `alipay-anonymous-sandbox.createAnonymousSandbox`、`{"request":{"appType":"PUBLICAPP"}}`、`PLATFORM`、`PLATFORM_ID`、`ALIPAYCLI_BIZ_INFO` 环境变量和 `result.content[0].text -> success -> data` 解包逻辑;`ALIPAYCLI_BIZ_INFO` 固定标识当前调用方 Skill、当前生效版本和匿名 `skill_user_id`,禁止传入 `PRODUCT`。Windows LEGACY 不调用该方法或 `sandbox_config.sh`。
|
|
168
|
+
6. 只有 Unix/macOS/Linux 或 Windows READY 创建分支会调用冻结的 `alipay-anonymous-sandbox.createAnonymousSandbox`、`{"request":{"appType":"PUBLICAPP"}}`、`PLATFORM`、`PLATFORM_ID`、`ALIPAYCLI_BIZ_INFO` 环境变量和 `result.content[0].text -> success -> data` 解包逻辑;`ALIPAYCLI_BIZ_INFO` 固定标识当前调用方 Skill、当前生效版本和匿名 `skill_user_id`,禁止传入 `PRODUCT`。Windows LEGACY/CODE_ONLY 不调用该方法或 `sandbox_config.sh`。
|
|
169
169
|
7. Unix/macOS/Linux 或 Windows READY 只接受以下互斥最终结果和一个临时恢复结果;待配置不算成功:
|
|
170
170
|
- `READY`:退出码为 0;唯一带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 `SANDBOX_ENSURE_ACTION=CREATED|VERIFIED`、`SANDBOX_CONFIG_PATH=<同一目标项目绝对路径>/.alipay-sandbox.json` 和 `FLOW:SANDBOX_CONFIG_READY` 内部事实。
|
|
171
171
|
- `CREATE_PENDING`:退出码为 0;脚本 stdout 已渲染唯一 `sandbox.configuration.pending/CREATE` 正文,并产生唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=sandbox.configuration.pending`;另有唯一带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 `SANDBOX_PENDING_PATH=<同一目标项目绝对路径>/.alipay-sandbox.json` 和 `FLOW:SANDBOX_CONFIG_PENDING_CREATE` 内部事实;不得出现 READY 标记。
|
|
172
172
|
- `VERIFY_PENDING`:退出码为 0;脚本 stdout 已渲染唯一 `sandbox.configuration.pending/VERIFY` 正文,并产生唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=sandbox.configuration.pending`;另有唯一带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 `SANDBOX_PENDING_PATH=<同一目标项目绝对路径>/.alipay-sandbox.json` 和 `FLOW:SANDBOX_CONFIG_PENDING_VERIFY` 内部事实;不得出现 READY 标记。
|
|
173
173
|
- `LOCAL_FS_RECOVERY`:仅创建分支、退出码 `77`,唯一包含上述 CREATE pending 两个事实及 `SANDBOX_LOCAL_FS_PERMISSION_MODE=CREATE`、`CLI_FLOW:RETRY_WITH_LOCAL_FS_PERMISSION`;stdout 是现有 pending 正文,先暂存且不得发送,CLI 调用次数为 0。允许权限升级后原样重试一次:`READY` 时丢弃暂存正文;普通 `CREATE_PENDING` 或再次命中本结果时只发送重试 stdout 并接受其 pending 事实;拒绝或宿主不支持时发送首次 stdout 并接受首次 pending 事实。不得再次申请、新增消息或确认。
|
|
174
174
|
8. 所有 `ALIPAY_AIPAY_INTERNAL:` 行只用于转移;宿主合并输出时也先整行剔除。`READY` 的 stdout 为空,静默记录 `READY` 并直接进入步骤 2;普通 pending 或按上项降级时,必须校验唯一 `CUSTOMER_MESSAGE_DELIVERY_REQUIRED=sandbox.configuration.pending`,下一动作将剔除内部行后的 stdout 原文独立送达,再记录 `CREATE_PENDING|VERIFY_PENDING` 并直接进入步骤 2。禁止追加 `jq|cat|grep|ls|stat` 或临时脚本;待配置时禁止读取、引用或复制无效/不存在配置的字段。
|
|
175
|
-
Windows READY 若在调用沙箱脚本前收到非零及 `WINDOWS_BUSINESS_BLOCKED=ENVIRONMENT_UNAVAILABLE`,本次 CLI 调用为零,停在环境阻断点;按 Windows 环境文档只读复检或有限准备,取得 READY
|
|
175
|
+
Windows READY 若在调用沙箱脚本前收到非零及 `WINDOWS_BUSINESS_BLOCKED=ENVIRONMENT_UNAVAILABLE`,本次 CLI 调用为零,停在环境阻断点;按 Windows 环境文档只读复检或有限准备,取得 READY 后再继续。不得擅自转 LEGACY/CODE_ONLY 或重放已发出的业务请求;CODE_ONLY 例外仅处理根入口的可选工具失败。脚本已启动后的失败仍按第 9 项处理,不把超时或未知结果伪装为待配置。
|
|
176
176
|
|
|
177
|
-
9. 除上项精确的 `LOCAL_FS_RECOVERY` 外,命令非 0、终态标记缺失/重复/冲突、路径不一致或输出含 `SANDBOX_ERROR` 时属于脚本执行协议失败,仍停留在步骤 1;不得把这种执行异常降级为待配置,也不得临场改写 jq、重放原始 MCP 命令或自行检查敏感配置。CLI 已执行后才出现本地状态权限证据时,创建请求属于 `MAYBE_SENT`,脚本不得返回恢复 marker 或重放,`ensure` 直接使用既有 `CREATE_PENDING` 正文和终态继续代码开发。Windows LEGACY 配置检查未通过仍按 Windows LEGACY 登记分支处理。项目内自建 JSON、Agent 自报或补充诊断结果都不能替代上述终态。
|
|
177
|
+
9. 除上项精确的 `LOCAL_FS_RECOVERY` 外,命令非 0、终态标记缺失/重复/冲突、路径不一致或输出含 `SANDBOX_ERROR` 时属于脚本执行协议失败,仍停留在步骤 1;不得把这种执行异常降级为待配置,也不得临场改写 jq、重放原始 MCP 命令或自行检查敏感配置。CLI 已执行后才出现本地状态权限证据时,创建请求属于 `MAYBE_SENT`,脚本不得返回恢复 marker 或重放,`ensure` 直接使用既有 `CREATE_PENDING` 正文和终态继续代码开发。Windows LEGACY/CODE_ONLY 配置检查未通过仍按 Windows LEGACY/CODE_ONLY 登记分支处理。项目内自建 JSON、Agent 自报或补充诊断结果都不能替代上述终态。
|
|
178
178
|
10. 准备阶段不得渲染 `sandbox.environment.summary` 或 `sandbox.environment.reminder`,不得展示沙箱买家密码,也不得输出“沙箱测试通过”。只有 `sandboxConfigState=READY` 且代码开发完成并通过配置后置校验后,才按步骤 5 的摘要展示规则对客展示沙箱环境配置。
|
|
179
179
|
|
|
180
180
|
### 步骤 2:产品决策
|
|
@@ -232,14 +232,14 @@ runner 失败时不得展示手写方案或进入步骤 3。成功时必须取
|
|
|
232
232
|
|
|
233
233
|
**完成条件**:
|
|
234
234
|
- [INT.SANDBOX.UNIX_TERMINAL] Unix/macOS/Linux 或 Windows READY:`READY` 时已用 `reverify` 复核同一配置;步骤 1 或本步骤得到 `CREATE_PENDING|VERIFY_PENDING` 时,未读取或使用无效配置,已保留待配置状态并继续步骤 4
|
|
235
|
-
- [INT.SANDBOX.WINDOWS_REVERIFIED] Windows LEGACY:`READY` 时已静默复核步骤 1 通过的项目实际配置、密钥格式和版本控制保护;`VERIFY_PENDING` 时未读取配置或重复展示申领提示,已直接继续代码开发
|
|
235
|
+
- [INT.SANDBOX.WINDOWS_REVERIFIED] Windows LEGACY/CODE_ONLY:`READY` 时已静默复核步骤 1 通过的项目实际配置、密钥格式和版本控制保护;`VERIFY_PENDING` 时未读取配置或重复展示申领提示,已直接继续代码开发
|
|
236
236
|
|
|
237
237
|
> `READY` 时实际本机配置路径是后续唯一可信来源;待配置时 `SANDBOX_PENDING_PATH` 只是预期路径,不得作为配置存在或字段有效的证据。禁止从对话或历史代码复制密钥;对客沙箱摘要只能在代码开发完成且配置后置校验通过后展示。正常路径由 `sandbox_config.sh` 托管字段、落盘、重复创建和失败分支;仅脚本协议异常或用户要求解释时读取沙箱指南。
|
|
238
238
|
|
|
239
239
|
**操作流程**:
|
|
240
240
|
1. 继承步骤 1 的操作系统、规范化项目路径和服务端语言;任一值变化就返回步骤 1,不在本步骤重新探测。
|
|
241
241
|
2. Unix/macOS/Linux 或 Windows READY 的 `sandboxConfigState=CREATE_PENDING|VERIFY_PENDING` 时不再次调用脚本、不读取配置,直接进入步骤 4;本轮后续保持同一状态,直到用户另行要求重新配置。
|
|
242
|
-
3. Windows LEGACY 的 `sandboxConfigState=VERIFY_PENDING` 时不读取或探测配置、不渲染 `sandbox.windows.manual_setup`,直接进入步骤 4;`READY` 时才静默复核步骤 1 由 Agent 写入的同一本机敏感配置路径、项目实际读取字段、密钥格式和版本控制保护。路径、字段或保护发生变化时返回步骤 1 的 Windows LEGACY 分支,只补问实际缺失或错误字段。
|
|
242
|
+
3. Windows LEGACY/CODE_ONLY 的 `sandboxConfigState=VERIFY_PENDING` 时不读取或探测配置、不渲染 `sandbox.windows.manual_setup`,直接进入步骤 4;`READY` 时才静默复核步骤 1 由 Agent 写入的同一本机敏感配置路径、项目实际读取字段、密钥格式和版本控制保护。路径、字段或保护发生变化时返回步骤 1 的 Windows LEGACY/CODE_ONLY 分支,只补问实际缺失或错误字段。
|
|
243
243
|
4. Unix/macOS/Linux 或 Windows READY 仅在 `sandboxConfigState=READY` 时执行以下唯一复核命令,不先检查文件、不读取字段、不运行其他诊断:
|
|
244
244
|
|
|
245
245
|
```bash
|
|
@@ -247,7 +247,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox reverify "<规
|
|
|
247
247
|
```
|
|
248
248
|
|
|
249
249
|
5. `reverify` 只接受与步骤 1 相同的三个互斥终态。`READY` 更新 `sandboxConfigState=READY` 并立即进入步骤 4;`VERIFY_PENDING` 已由脚本输出唯一待配置正文,更新状态后立即进入步骤 4。`reverify` 不允许创建分支,若异常出现 `CREATED|CREATE_PENDING` 标记必须按协议失败停止。所有终态之后禁止追加任何 `jq`、`cat`、`grep`、`ls`、`stat` 或临时脚本。
|
|
250
|
-
6. Windows LEGACY 手工申领分支不伪装成快速沙箱脚本结果,只按本步骤和指南检查目标项目实际使用的本地配置。沙箱就绪时不输出复核进度、沙箱环境摘要、独立校验结果或字段核对表,直接进入步骤 4。
|
|
250
|
+
6. Windows LEGACY/CODE_ONLY 手工申领分支不伪装成快速沙箱脚本结果,只按本步骤和指南检查目标项目实际使用的本地配置。沙箱就绪时不输出复核进度、沙箱环境摘要、独立校验结果或字段核对表,直接进入步骤 4。
|
|
251
251
|
|
|
252
252
|
---
|
|
253
253
|
|
|
@@ -290,7 +290,7 @@ curl -sL "<当前契约 sourceUrl 中的官方页面>"
|
|
|
290
290
|
| 4 | 时间戳格式 | 必须使用 `yyyy-MM-dd HH:mm:ss`,禁止使用 ISO 格式 |
|
|
291
291
|
| 5 | SDK 引入方式 | 必须通过查阅 SDK 文档或类型定义确定正确的引入方式,禁止凭猜测选择 |
|
|
292
292
|
| 6 | 遇到 `invalid-signature` 报错 | 严禁凭猜测归因到私钥格式;先核对实际发送、参与签名和服务端验签的参数是否完全一致 |
|
|
293
|
-
| 7 | 配置接入后必须后置校验 | Unix/macOS/Linux 或 Windows READY 必须确认服务端加载器直接读取已验证文件、字段映射正确且 SDK 配置匹配;Windows LEGACY 必须确认项目读取同一套本机沙箱应用配置;失败时禁止继续联调 |
|
|
293
|
+
| 7 | 配置接入后必须后置校验 | Unix/macOS/Linux 或 Windows READY 必须确认服务端加载器直接读取已验证文件、字段映射正确且 SDK 配置匹配;Windows LEGACY/CODE_ONLY 必须确认项目读取同一套本机沙箱应用配置;失败时禁止继续联调 |
|
|
294
294
|
|
|
295
295
|
步骤 4 的本地依据全部取得后,执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration implementation --product-type "$PRODUCT_TYPE" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"` 加载步骤 5;不得直接读取后续整段 flow。
|
|
296
296
|
|
|
@@ -310,7 +310,7 @@ curl -sL "<当前契约 sourceUrl 中的官方页面>"
|
|
|
310
310
|
- [INT.CODE.BASE_IMPLEMENTED] 已完成支付宝支付产品集成代码实现
|
|
311
311
|
- [INT.CODE.INTERFACES_COMPLETE] 已按目标产品文档完成全部适用接口;网站支付/APP 支付覆盖下单、交易查询、退款、退款查询、关闭交易和异步通知处理代码,按量付费覆盖 402、`payment.verify` 和 `fulfillment.confirm`
|
|
312
312
|
- [INT.CODE.SELF_CHECKED] 已完成代码自检并确认无误
|
|
313
|
-
- [INT.CODE.CONFIG_VERIFIED] 已完成支付配置准确性后置校验:Unix/macOS/Linux 或 Windows READY 服务端加载器直接读取已验证文件且字段映射、SDK 配置匹配;Windows LEGACY 项目读取同一套本机沙箱应用配置
|
|
313
|
+
- [INT.CODE.CONFIG_VERIFIED] 已完成支付配置准确性后置校验:Unix/macOS/Linux 或 Windows READY 服务端加载器直接读取已验证文件且字段映射、SDK 配置匹配;Windows LEGACY/CODE_ONLY 项目读取同一套本机沙箱应用配置
|
|
314
314
|
- [INT.WEBPAY.RETURN_IMPLEMENTED] 网站支付在用户未明确要求不使用同步回跳时,已配置与当前项目一致的 `return_url`,并实现可通过 GET 访问的回跳路由和结果页;页面不直接信任同步回跳参数判定支付成功
|
|
315
315
|
- [INT.LOCAL_ACCEPTANCE.NOTIFY_DEFERRED] 用户处于“本地生产参数验收模式”时,已明确记录当前暂不联调公网 `notify_url`,支付结果确认依赖异步通知处理代码加主动查询兜底;未把同步回跳参数当作支付成功依据
|
|
316
316
|
- [INT.A2M.PRODUCTION_CONTROLS] 按量付费生产接入中已补齐订单持久化、本地订单匹配、金额一致性、资源防串、幂等履约和履约确认失败可重试逻辑,不存在未实现的关键 TODO
|
|
@@ -328,13 +328,13 @@ curl -sL "<当前契约 sourceUrl 中的官方页面>"
|
|
|
328
328
|
|
|
329
329
|
开始执行代码自检、语法/静态检查或支付配置后置校验前,进入本 flow 的 `verification` 阶段;该阶段不再单独记录 telemetry 开始态,只由最终收口阶段记录结果。
|
|
330
330
|
|
|
331
|
-
**支付配置接入与后置校验**:`sandboxConfigState=READY` 时,Unix/macOS/Linux 或 Windows READY 快速沙箱由商家服务端代码使用当前语言的标准 JSON 解析器,在运行时读取步骤 1/3 已验证的 `.alipay-sandbox.json`,并从 `appIds[0]` 映射 `appId`、`alipayPublicKey` 和当前语言私钥字段;不得先用 `jq`、`cat` 或临时脚本把字段原文打印到工具输出、复制到源码或重复写入 `.env`。项目已有配置抽象时在其服务端加载边界接入该 JSON,不改变字段原值。Windows LEGACY 从步骤 1 由 Agent 写入并校验的本机敏感配置读取。后置校验必须检查实际加载路径、字段选择、SDK 初始化和版本控制保护;Java 使用 `appPrivateKey`,其他四种语言使用 `appPrivatePkcsKey`。A2M 的 `seller_signature` 使用原生密码库时,只在调用边界按库要求解析密钥。失败时修正加载器或 SDK 配置,禁止猜测、转换格式或改写原始值。
|
|
331
|
+
**支付配置接入与后置校验**:`sandboxConfigState=READY` 时,Unix/macOS/Linux 或 Windows READY 快速沙箱由商家服务端代码使用当前语言的标准 JSON 解析器,在运行时读取步骤 1/3 已验证的 `.alipay-sandbox.json`,并从 `appIds[0]` 映射 `appId`、`alipayPublicKey` 和当前语言私钥字段;不得先用 `jq`、`cat` 或临时脚本把字段原文打印到工具输出、复制到源码或重复写入 `.env`。项目已有配置抽象时在其服务端加载边界接入该 JSON,不改变字段原值。Windows LEGACY/CODE_ONLY 从步骤 1 由 Agent 写入并校验的本机敏感配置读取。后置校验必须检查实际加载路径、字段选择、SDK 初始化和版本控制保护;Java 使用 `appPrivateKey`,其他四种语言使用 `appPrivatePkcsKey`。A2M 的 `seller_signature` 使用原生密码库时,只在调用边界按库要求解析密钥。失败时修正加载器或 SDK 配置,禁止猜测、转换格式或改写原始值。
|
|
332
332
|
|
|
333
333
|
`sandboxConfigState=CREATE_PENDING|VERIFY_PENDING` 时仍完整实现当前产品全部适用接口、安全校验和配置加载边界,但不得读取当前无效配置、写入占位 appId/密钥、把示例值当作运行配置或声称 `INT.CODE.CONFIG_VERIFIED` 通过。加载器在配置缺失或无效时必须明确失败并阻止真实 SDK 调用;本轮所有依赖沙箱值的运行验证保持未完成。
|
|
334
334
|
|
|
335
335
|
**沙箱摘要展示入口**:只有 `sandboxConfigState=READY`、本步骤的代码实现和支付配置后置校验都已完成,才允许对客展示沙箱环境配置。待配置状态跳过本入口,不另写摘要或失败话术。Unix/macOS/Linux 或 Windows READY 从本 flow 所在目录执行:
|
|
336
336
|
|
|
337
|
-
`environmentRows` 的具体值严禁编造、猜测、补全,禁止使用示例值、占位值或历史对话值替代本轮已校验配置。Unix/macOS/Linux 或 Windows READY 必须由登记脚本直接读取同一配置并生成四行,Agent 不得手填或改写;Windows LEGACY 的应用 ID 和买家测试账号必须取自步骤 1/3 已校验的同一本机配置,两个密码行的固定保存提示仅在实际确认密码已写入该文件后使用。任一必需字段缺失、为空、配置无法读取或来源无法确认时,停止摘要展示并按既有配置失败分支处理,禁止为凑齐四行补值。
|
|
337
|
+
`environmentRows` 的具体值严禁编造、猜测、补全,禁止使用示例值、占位值或历史对话值替代本轮已校验配置。Unix/macOS/Linux 或 Windows READY 必须由登记脚本直接读取同一配置并生成四行,Agent 不得手填或改写;Windows LEGACY/CODE_ONLY 的应用 ID 和买家测试账号必须取自步骤 1/3 已校验的同一本机配置,两个密码行的固定保存提示仅在实际确认密码已写入该文件后使用。任一必需字段缺失、为空、配置无法读取或来源无法确认时,停止摘要展示并按既有配置失败分支处理,禁止为凑齐四行补值。
|
|
338
338
|
|
|
339
339
|
```bash
|
|
340
340
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox summary "<productType>" "<规范化项目路径>" "<已确认服务端语言>" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
@@ -342,13 +342,13 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox summary "<produ
|
|
|
342
342
|
|
|
343
343
|
该命令 stdout 只渲染 `sandbox.environment.summary` 与 `sandbox.environment.reminder`;Unix/macOS/Linux 和 Windows READY 都从已校验的快速沙箱配置展示买家账号、登录密码与支付密码。命令必须产生唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=sandbox.environment.summary`,带 `ALIPAY_AIPAY_INTERNAL:` 前缀的配置路径和 `FLOW:SANDBOX_CONFIGURED` 只用于流程转移,严禁对客。命令返回后下一动作必须将剔除内部行后的 stdout 原文独立送达,再进入后续沙箱测试或付款体验;不得把工具面板输出或自写摘要当作已送达。命令不重新创建沙箱,不调用 `createAnonymousSandbox`。`productType` 只能来自步骤 2 已确认的 `aipay|webpay|apppay`;配置路径和语言必须与步骤 1/3 一致。摘要展示失败时不得进入沙箱测试或付款体验,也不得改用 Agent 自写表格。
|
|
344
344
|
|
|
345
|
-
Windows LEGACY 从项目实际读取的同一本机配置构造不含密码和密钥原文的 `ENVIRONMENT_ROWS`,再从本 flow 所在目录执行以下固定命令;不得重新索取或复述步骤 1 已提供的敏感值,也不得改用 Unix 快速沙箱脚本:
|
|
345
|
+
Windows LEGACY/CODE_ONLY 从项目实际读取的同一本机配置构造不含密码和密钥原文的 `ENVIRONMENT_ROWS`,再从本 flow 所在目录执行以下固定命令;不得重新索取或复述步骤 1 已提供的敏感值,也不得改用 Unix 快速沙箱脚本:
|
|
346
346
|
|
|
347
347
|
```powershell
|
|
348
348
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message windows-sandbox-summary --product-name "$PRODUCT_NAME" --config-path "$CONFIG_PATH" --environment-rows "$ENVIRONMENT_ROWS" --telemetry-run-id "$RUN_ID" --telemetry-history-count "$HISTORY_COUNT" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
349
349
|
```
|
|
350
350
|
|
|
351
|
-
Windows LEGACY 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实际本机配置绝对路径;`ENVIRONMENT_ROWS` 固定依次为“沙箱支付宝应用ID(appID)”“沙箱买家测试账号”“沙箱买家登录密码”“沙箱买家支付密码”四行。前两行使用实际沙箱应用 ID 和买家登录账号;两个密码行只展示“已写入本地配置文件,默认不在对话中展开”,不得传入密码原文。不追加 pid、商家或买家 userId、sandboxId。两个 renderer 任一失败都按摘要展示失败处理,禁止手写补齐。
|
|
351
|
+
Windows LEGACY/CODE_ONLY 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实际本机配置绝对路径;`ENVIRONMENT_ROWS` 固定依次为“沙箱支付宝应用ID(appID)”“沙箱买家测试账号”“沙箱买家登录密码”“沙箱买家支付密码”四行。前两行使用实际沙箱应用 ID 和买家登录账号;两个密码行只展示“已写入本地配置文件,默认不在对话中展开”,不得传入密码原文。不追加 pid、商家或买家 userId、sandboxId。两个 renderer 任一失败都按摘要展示失败处理,禁止手写补齐。
|
|
352
352
|
|
|
353
353
|
<!-- ALIPAY_AIPAY_PRODUCT:webpay:START -->
|
|
354
354
|
**网站支付回跳默认规则**:用户未特别说明时,默认实现支付后同步回跳。`return_url` 必须来自已确认目标项目的实际协议、主机、端口和路由,禁止保留 `your-domain.com`、示例端口或猜测路径。项目没有结果页时,在当前技术栈内新增与既有 UI 一致的 GET 回跳路由和页面。用户已明确不需要同步回跳时,直接按关闭分支验收,不增加第二次确认;仍必须保留异步通知、交易查询和商户订单查询页。用户未明确关闭但代码缺少 `return_url` 时,必须修复为默认同步回跳分支,不得要求用户接受遗漏。验收结论必须从实际代码重新检查,不接受调用方自报 `returnMode`。
|
|
@@ -600,7 +600,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message che
|
|
|
600
600
|
|
|
601
601
|
**完成语义**:只有步骤 1-8 的适用完成条件均满足且 `sandboxConfigState=READY` 后,才可声明支付产品-代码开发完成。沙箱待配置但代码实现与其余检查通过时只能输出“部分通过”,不得改写为完成;存在其他未通过项时输出“未通过”;若配置已就绪且仅剩无法自动验证项,输出“部分通过”并登记人工待验证项,不得改写为完成或生产就绪。
|
|
602
602
|
|
|
603
|
-
完成结论必须逐项来自本轮实际检查:项目和代码项重新扫描目标目录;Unix/macOS/Linux 或 Windows READY 只有 `sandboxConfigState=READY` 时才重新执行严格的 `sandbox_config.sh verify`,待配置时直接复用本轮脚本终态并标记相关项未完成,不得在 checklist 中再次创建或复核;Windows LEGACY 只有 `READY` 时重新检查项目实际读取的本地配置、密钥格式和版本控制保护,`VERIFY_PENDING` 时直接标记配置及依赖动作未完成;按量付费联调只接受本轮 `run --auto-complete --require-payment-validation` 的实际成功;用户确认项只接受当前摘要后的回复。任何一项缺失、失败或无法执行都标记为失败或人工待验证,不得由 Agent 自填 `PASS`。
|
|
603
|
+
完成结论必须逐项来自本轮实际检查:项目和代码项重新扫描目标目录;Unix/macOS/Linux 或 Windows READY 只有 `sandboxConfigState=READY` 时才重新执行严格的 `sandbox_config.sh verify`,待配置时直接复用本轮脚本终态并标记相关项未完成,不得在 checklist 中再次创建或复核;Windows LEGACY/CODE_ONLY 只有 `READY` 时重新检查项目实际读取的本地配置、密钥格式和版本控制保护,`VERIFY_PENDING` 时直接标记配置及依赖动作未完成;按量付费联调只接受本轮 `run --auto-complete --require-payment-validation` 的实际成功;用户确认项只接受当前摘要后的回复。任何一项缺失、失败或无法执行都标记为失败或人工待验证,不得由 Agent 自填 `PASS`。
|
|
604
604
|
|
|
605
605
|
**沙箱结论边界**:步骤 8 的代码与配置校验不得把步骤 3 的字段完整性、网站支付的付款指引或 APP 支付跳过步骤 6 改写为“沙箱测试通过”。只有按量付费步骤 6 已取得完整端到端成功证据时,最终摘要才可复用该测试结论。
|
|
606
606
|
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
| 私钥存储位置 | 私钥不得保存在客户端代码中 | 构造交易数据并签名必须在商家服务端完成,私钥绝对不能保存在商家APP客户端中,也不能从服务端下发。商户需妥善保存私钥,不建议在代码或配置中明文写入私钥,应当通过加密配置文件或密钥管理平台进行管理 |
|
|
13
13
|
| 私钥日志安全 | 私钥不得出现在日志中 | 私钥的保密等级比源码高,出现在日志中将增加私钥泄露的风险 |
|
|
14
14
|
| 私钥仓库安全 | 私钥不得上传公共仓库 | 私钥泄露将导致应用和支付宝交互的安全性完全丧失 |
|
|
15
|
-
| 沙箱配置后置校验 | 沙箱 appId、应用私钥、支付宝公钥接入项目后必须完成配置准确性校验 | `sandboxConfigState=READY` 时,Unix/macOS/Linux 或 Windows READY 必须确认商家服务端加载器直接读取已验证的 `.alipay-sandbox.json`,从同一 `appIds[0]` 选择当前语言字段且不在源码、普通日志或额外 `.env` 留下密钥副本;Windows LEGACY 必须确认项目实际读取值属于本次手工申领和密钥配置的同一沙箱应用。待配置时本项直接不通过,代码只能保留会在配置缺失时明确失败的加载边界,禁止占位符、示例值或其他来源密钥 |
|
|
15
|
+
| 沙箱配置后置校验 | 沙箱 appId、应用私钥、支付宝公钥接入项目后必须完成配置准确性校验 | `sandboxConfigState=READY` 时,Unix/macOS/Linux 或 Windows READY 必须确认商家服务端加载器直接读取已验证的 `.alipay-sandbox.json`,从同一 `appIds[0]` 选择当前语言字段且不在源码、普通日志或额外 `.env` 留下密钥副本;Windows LEGACY/CODE_ONLY 必须确认项目实际读取值属于本次手工申领和密钥配置的同一沙箱应用。待配置时本项直接不通过,代码只能保留会在配置缺失时明确失败的加载边界,禁止占位符、示例值或其他来源密钥 |
|
|
16
16
|
| 用户项目文件保护 | 既有项目结构、文件和无关支付能力均保留;新项目只创建在尚不存在或为空的目录 | 检查本轮变更不存在未经独立二次确认的既有文件删除、既有文件整体覆盖,或与已确认目标产品无关的修改;新建文件不属于既有文件整体覆盖。发现违规立即判定不通过并停止后续流程 |
|
|
17
|
-
| 沙箱配置防提交 | Unix/macOS/Linux 或 Windows READY 快速沙箱:配置未被 Git 跟踪,项目根目录 `.gitignore` 包含精确规则 `/.alipay-sandbox.json`,Unix 配置权限为 `0600`,Windows READY 使用经读回验证的 NTFS DACL(当前用户、SYSTEM、Administrators);Windows LEGACY 手工沙箱:实际敏感配置未被 Git 跟踪并具有对应忽略保护,Windows LEGACY 文件访问控制能核验时仅当前用户可访问,不能核验时标记人工待验证 | 禁止私钥、沙箱账号或密码随项目进入 Git 暂存区或公共仓库;缺少适用保护时判定不通过 |
|
|
17
|
+
| 沙箱配置防提交 | Unix/macOS/Linux 或 Windows READY 快速沙箱:配置未被 Git 跟踪,项目根目录 `.gitignore` 包含精确规则 `/.alipay-sandbox.json`,Unix 配置权限为 `0600`,Windows READY 使用经读回验证的 NTFS DACL(当前用户、SYSTEM、Administrators);Windows LEGACY/CODE_ONLY 手工沙箱:实际敏感配置未被 Git 跟踪并具有对应忽略保护,Windows LEGACY/CODE_ONLY 文件访问控制能核验时仅当前用户可访问,不能核验时标记人工待验证 | 禁止私钥、沙箱账号或密码随项目进入 Git 暂存区或公共仓库;缺少适用保护时判定不通过 |
|
|
18
18
|
| 沙箱配置稳定定位 | Unix/macOS/Linux 或 Windows READY 项目代码从已确认的规范化项目根定位 `.alipay-sandbox.json` | 禁止依赖 `cwd`、`getcwd()`、`Directory.GetCurrentDirectory()`、`user.dir` 或 Agent 启动目录 |
|
|
19
19
|
| SDK 公钥/证书模式一致 | 公钥模式使用普通执行 API;证书执行 API 只在应用公钥证书、支付宝公钥证书和支付宝根证书均已配置时使用 | 禁止公钥配置模式误用证书执行 API |
|
|
20
20
|
| 支付校验无旁路 | 生产源码中不存在 Mock、测试或沙箱开关可触达的跳过验签、固定成功或支付校验旁路 | 沙箱与生产必须共用相同验证控制流 |
|
|
@@ -135,7 +135,7 @@
|
|
|
135
135
|
|
|
136
136
|
先按当前证据逐项判断;本轮可修复时先修复、重检,不渲染中间结果。项目稳定后按 `../flow.md` 执行唯一 `checklist-result`,由 runner 在同一次最终调用中校验 scope 并对同一项目快照执行固定 implementation audit。审计失败是阻断缺口,不能被 Agent 自报结论覆盖;可修复时先返回结构化 findings,项目变化后重新加载 checklist 阶段取得新 scope。
|
|
137
137
|
|
|
138
|
-
最终 action、完整参数和失败转移只以 `../flow.md` 步骤 8 为准,本模块不复制命令。runner 只接受最终一轮实际证据:Unix/macOS/Linux 或 Windows READY 的 `sandboxConfigState` 复用脚本终态,Windows LEGACY 复用步骤 1/3 的 `READY|VERIFY_PENDING`;待配置时不重跑或读取配置,并把配置及依赖动作列为未完成。
|
|
138
|
+
最终 action、完整参数和失败转移只以 `../flow.md` 步骤 8 为准,本模块不复制命令。runner 只接受最终一轮实际证据:Unix/macOS/Linux 或 Windows READY 的 `sandboxConfigState` 复用脚本终态,Windows LEGACY/CODE_ONLY 复用步骤 1/3 的 `READY|VERIFY_PENDING`;待配置时不重跑或读取配置,并把配置及依赖动作列为未完成。
|
|
139
139
|
|
|
140
140
|
各产品结论差异如下,对客正文只在消息目录维护:
|
|
141
141
|
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
- ✅ **即开即用**:全自动配置网关及应用信息
|
|
12
12
|
- ✅ **安全隔离**:测试环境不涉及真实资金,可放心调试
|
|
13
13
|
|
|
14
|
-
### 1.2 Windows LEGACY 用户注意事项
|
|
15
|
-
Windows READY 通过兼容层执行 flow
|
|
14
|
+
### 1.2 Windows LEGACY/CODE_ONLY 用户注意事项
|
|
15
|
+
Windows READY 通过兼容层执行 flow 登记的快速沙箱;下述手工分支适用于 Windows LEGACY/CODE_ONLY;CODE_ONLY 仅限独立代码开发,不代表站点开通选择。
|
|
16
16
|
|
|
17
|
-
Windows LEGACY 普通代码开发或完整接入请求未明确要求当前配置沙箱时,记录 `sandboxConfigState=VERIFY_PENDING` 并继续代码实现,不展示资料收集消息。只有用户明确要求现在配置或恢复 Windows LEGACY 沙箱时,才使用 `../../../normal/json/customer-messages.json` 的既有 `sandbox.windows.manual_setup`,引导用户前往支付宝 AI 付站点的“选择产品 → 一站式接入 → 技术集成”页面获取当前沙箱的 APPID、公私钥和账号信息;随后只处理用户针对本轮该消息提供的资料,完整时校验并写入目标项目实际使用的本地敏感配置,部分或错误时只补问对应字段。不得要求用户自行配置、理解 `sandbox_config.sh`、执行 Bash 或手工拼接 Skill 的规范化 JSON。该资料输入例外只适用于沙箱,生产环境应用私钥和密码禁止提供给 Agent;Agent 不得在回复、摘要或普通日志中复述收到的值。
|
|
17
|
+
Windows LEGACY/CODE_ONLY 普通代码开发或完整接入请求未明确要求当前配置沙箱时,记录 `sandboxConfigState=VERIFY_PENDING` 并继续代码实现,不展示资料收集消息。只有用户明确要求现在配置或恢复 Windows LEGACY/CODE_ONLY 沙箱时,才使用 `../../../normal/json/customer-messages.json` 的既有 `sandbox.windows.manual_setup`,引导用户前往支付宝 AI 付站点的“选择产品 → 一站式接入 → 技术集成”页面获取当前沙箱的 APPID、公私钥和账号信息;随后只处理用户针对本轮该消息提供的资料,完整时校验并写入目标项目实际使用的本地敏感配置,部分或错误时只补问对应字段。不得要求用户自行配置、理解 `sandbox_config.sh`、执行 Bash 或手工拼接 Skill 的规范化 JSON。该资料输入例外只适用于沙箱,生产环境应用私钥和密码禁止提供给 Agent;Agent 不得在回复、摘要或普通日志中复述收到的值。
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
20
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message windows-sandbox-setup --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
@@ -46,7 +46,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message win
|
|
|
46
46
|
### 3.1 获取候选沙箱配置
|
|
47
47
|
|
|
48
48
|
- Unix/macOS/Linux 或 Windows READY:运行时只执行 integration flow 的 `sandbox_config.sh ensure`;[alipay-sandbox-tool](alipay-sandbox-tool.md) 只记录脚本内部冻结的 MCP 契约和维护依据,不作为 Agent 直调入口。
|
|
49
|
-
- Windows LEGACY:兼容环境未就绪,按第 1.2 节记录 `READY|VERIFY_PENDING`;该分支不调用 `sandbox_config.sh create|verify`,也不伪造 `FLOW:SANDBOX_CONFIGURED`。
|
|
49
|
+
- Windows LEGACY/CODE_ONLY:兼容环境未就绪,按第 1.2 节记录 `READY|VERIFY_PENDING`;该分支不调用 `sandbox_config.sh create|verify`,也不伪造 `FLOW:SANDBOX_CONFIGURED`。
|
|
50
50
|
- 工具返回 `success === true` 只代表拿到候选 `data`;必须完成第 4 节字段完整性校验后,才允许写入正式配置文件。
|
|
51
51
|
- `success !== true`、`data` 缺失或字段不完整时,先执行第 6 节既定重试;耗尽后进入本轮待配置状态,只阻断沙箱字段使用、摘要、配置校验和沙箱测试,不阻断代码实现。
|
|
52
52
|
|
|
@@ -61,25 +61,25 @@ Unix/macOS/Linux 或 Windows READY 快速沙箱由 `sandbox_config.sh` 在内部
|
|
|
61
61
|
5. 后续由商家服务端代码使用当前语言标准 JSON 解析器在运行时读取该文件并映射到 SDK;Agent 不通过 shell 输出字段原文,也不把沙箱密钥复制到源码或重复写入 `.env`。
|
|
62
62
|
6. 代码开发完成且配置后置校验通过后,再使用第 5.2 节的摘要输出入口对客展示沙箱环境配置。
|
|
63
63
|
|
|
64
|
-
Windows LEGACY 手工沙箱:
|
|
64
|
+
Windows LEGACY/CODE_ONLY 手工沙箱:
|
|
65
65
|
|
|
66
66
|
1. 没有资料且没有明确配置请求时记录 `VERIFY_PENDING` 并继续代码实现,不渲染消息、不探测猜测配置。
|
|
67
67
|
2. 用户明确要求配置且尚未提供资料时,才使用标准消息一次收集当前沙箱应用的 APPID、支付宝公钥、应用公钥、与已确认语言匹配的应用私钥和沙箱账号信息;缺失或校验失败时只补问对应字段。
|
|
68
68
|
3. 按第 4 节校验资料,随后由 Agent 写入目标项目实际使用的本地敏感配置;不要求采用快速沙箱 `data` 的嵌套结构,不把值复制到源码或普通日志。
|
|
69
|
-
4. 检查敏感配置未被 Git 跟踪,并已有适用于实际路径的版本控制忽略保护;能检查 Windows LEGACY 文件访问控制时确认仅当前用户可访问,不能取得证据时标记为人工待验证。
|
|
70
|
-
5. 只有 `READY` 时才输出第 5 节规定的摘要和 Windows LEGACY 提醒并从实际本机配置映射到 SDK;Agent 不得在回复或摘要中复述用户提供的沙箱密钥和密码,生产环境应用私钥和密码禁止提供给 Agent。
|
|
69
|
+
4. 检查敏感配置未被 Git 跟踪,并已有适用于实际路径的版本控制忽略保护;能检查 Windows LEGACY/CODE_ONLY 文件访问控制时确认仅当前用户可访问,不能取得证据时标记为人工待验证。
|
|
70
|
+
5. 只有 `READY` 时才输出第 5 节规定的摘要和 Windows LEGACY/CODE_ONLY 提醒并从实际本机配置映射到 SDK;Agent 不得在回复或摘要中复述用户提供的沙箱密钥和密码,生产环境应用私钥和密码禁止提供给 Agent。
|
|
71
71
|
|
|
72
|
-
Unix/macOS/Linux 或 Windows READY 快速沙箱的流程准备必须使用 integration flow 登记的 `sandbox_config.sh ensure` 入口:配置缺失时脚本内部创建,已存在时脚本内部复核;步骤 3 仅在首次准备为 `READY` 时执行 `reverify`,待配置时直接继续代码开发;代码开发完成且配置仍为 `READY` 后才使用 `summary` 展示摘要。`ensure|reverify` 会把既定重试耗尽转换为受控 `CREATE_PENDING|VERIFY_PENDING`,直接渲染统一消息并返回终态标记;Agent 不得直接选择创建分支、重复检查文件存在性或权限、读取字段结构、拼接沙箱 JSON、另写解析逻辑或自制摘要表。Windows LEGACY 手工申领分支检查目标项目实际读取的本地配置,不把平台字段擅自改造成快速沙箱返回结构。
|
|
72
|
+
Unix/macOS/Linux 或 Windows READY 快速沙箱的流程准备必须使用 integration flow 登记的 `sandbox_config.sh ensure` 入口:配置缺失时脚本内部创建,已存在时脚本内部复核;步骤 3 仅在首次准备为 `READY` 时执行 `reverify`,待配置时直接继续代码开发;代码开发完成且配置仍为 `READY` 后才使用 `summary` 展示摘要。`ensure|reverify` 会把既定重试耗尽转换为受控 `CREATE_PENDING|VERIFY_PENDING`,直接渲染统一消息并返回终态标记;Agent 不得直接选择创建分支、重复检查文件存在性或权限、读取字段结构、拼接沙箱 JSON、另写解析逻辑或自制摘要表。Windows LEGACY/CODE_ONLY 手工申领分支检查目标项目实际读取的本地配置,不把平台字段擅自改造成快速沙箱返回结构。
|
|
73
73
|
|
|
74
74
|
---
|
|
75
75
|
|
|
76
76
|
## 4. 字段完整性校验契约(脚本内部卡点)
|
|
77
77
|
|
|
78
|
-
Unix/macOS/Linux 或 Windows READY 由 `sandbox_config.sh` 内部逐项校验,Agent 只消费退出码和 flow 登记标记,不手工执行本节清单。Windows LEGACY 没有该脚本能力时,才按目标项目实际配置逐项检查。任一必含字段缺失或为空时立即停止使用当前候选:Unix/macOS/Linux 或 Windows READY 不得写入正式 `.alipay-sandbox.json`,Windows LEGACY 不得把当前本机配置标记为可用;Unix/macOS/Linux 或 Windows READY 按有限重试和待配置终态继续代码实现,Windows LEGACY 仍使用登记的资料补充出口。
|
|
78
|
+
Unix/macOS/Linux 或 Windows READY 由 `sandbox_config.sh` 内部逐项校验,Agent 只消费退出码和 flow 登记标记,不手工执行本节清单。Windows LEGACY/CODE_ONLY 没有该脚本能力时,才按目标项目实际配置逐项检查。任一必含字段缺失或为空时立即停止使用当前候选:Unix/macOS/Linux 或 Windows READY 不得写入正式 `.alipay-sandbox.json`,Windows LEGACY/CODE_ONLY 不得把当前本机配置标记为可用;Unix/macOS/Linux 或 Windows READY 按有限重试和待配置终态继续代码实现,Windows LEGACY/CODE_ONLY 仍使用登记的资料补充出口。
|
|
79
79
|
|
|
80
80
|
### 4.1 必含字段清单
|
|
81
81
|
|
|
82
|
-
以下是两条分支共同的语义要求,必须按项目语言和测试账号要求存在且非空。Unix/macOS/Linux 或 Windows READY 快速沙箱按表中的原始字段名检查;Windows LEGACY 按目标项目实际配置的等价字段检查,不得为了通过校验擅自改造为快速沙箱嵌套结构:
|
|
82
|
+
以下是两条分支共同的语义要求,必须按项目语言和测试账号要求存在且非空。Unix/macOS/Linux 或 Windows READY 快速沙箱按表中的原始字段名检查;Windows LEGACY/CODE_ONLY 按目标项目实际配置的等价字段检查,不得为了通过校验擅自改造为快速沙箱嵌套结构:
|
|
83
83
|
|
|
84
84
|
| 字段 | 说明 |
|
|
85
85
|
|---|---|
|
|
@@ -125,31 +125,31 @@ Unix/macOS/Linux 或 Windows READY 快速沙箱:
|
|
|
125
125
|
- 文件权限必须限制为当前用户可读写,即 `chmod 600`;权限收紧或复核失败时不得使用配置或执行沙箱依赖动作。
|
|
126
126
|
- 配置不得已被 Git 跟踪;项目根目录 `.gitignore` 必须包含精确规则 `/.alipay-sandbox.json`。脚本只在缺失时追加一次,不覆盖既有内容;`.gitignore` 为符号链接或非普通文件时停止。
|
|
127
127
|
|
|
128
|
-
Windows LEGACY 手工沙箱:
|
|
128
|
+
Windows LEGACY/CODE_ONLY 手工沙箱:
|
|
129
129
|
|
|
130
130
|
- 由 Agent 根据目标项目实际结构选择并写入本机敏感配置路径,不要求用户创建 `.alipay-sandbox.json` 或自行配置项目。
|
|
131
|
-
- 配置必须未被 Git 跟踪,并建立适用于该实际路径的忽略保护;不得因为 Windows LEGACY 不使用 POSIX `0600` 而声称完成了该权限检查。
|
|
132
|
-
- 只有实际检查到的字段才能进入后续 SDK 映射;无法自动核验的 Windows LEGACY 文件访问控制或平台页面信息必须标记为人工待验证。
|
|
131
|
+
- 配置必须未被 Git 跟踪,并建立适用于该实际路径的忽略保护;不得因为 Windows LEGACY/CODE_ONLY 不使用 POSIX `0600` 而声称完成了该权限检查。
|
|
132
|
+
- 只有实际检查到的字段才能进入后续 SDK 映射;无法自动核验的 Windows LEGACY/CODE_ONLY 文件访问控制或平台页面信息必须标记为人工待验证。
|
|
133
133
|
|
|
134
|
-
Unix/macOS/Linux 或 Windows READY 创建阶段把实际本机配置路径和 `FLOW:SANDBOX_CONFIG_READY` 作为带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 stderr 内部事实,stdout 为空;不展示账号、密码、公钥或摘要。Windows LEGACY 手工分支完成后只在内部保留实际本机配置路径。两条分支在代码开发完成且配置后置校验通过后,才进入摘要展示。
|
|
134
|
+
Unix/macOS/Linux 或 Windows READY 创建阶段把实际本机配置路径和 `FLOW:SANDBOX_CONFIG_READY` 作为带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 stderr 内部事实,stdout 为空;不展示账号、密码、公钥或摘要。Windows LEGACY/CODE_ONLY 手工分支完成后只在内部保留实际本机配置路径。两条分支在代码开发完成且配置后置校验通过后,才进入摘要展示。
|
|
135
135
|
|
|
136
136
|
### 5.2 对话摘要
|
|
137
137
|
|
|
138
|
-
代码开发完成且配置后置校验通过后,Unix/macOS/Linux 或 Windows READY 从本文件所在的 `references/integration/modules/sandbox/` 目录使用 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox summary "<productType>" "<规范化项目路径>" "<已确认服务端语言>" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"` 复核并展示摘要;该脚本内部负责渲染 `sandbox.environment.summary` 与 `sandbox.environment.reminder`,Agent 不得绕过脚本自写摘要。Windows LEGACY 使用同一消息目录从项目实际读取的本机配置生成摘要,执行:
|
|
138
|
+
代码开发完成且配置后置校验通过后,Unix/macOS/Linux 或 Windows READY 从本文件所在的 `references/integration/modules/sandbox/` 目录使用 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox summary "<productType>" "<规范化项目路径>" "<已确认服务端语言>" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"` 复核并展示摘要;该脚本内部负责渲染 `sandbox.environment.summary` 与 `sandbox.environment.reminder`,Agent 不得绕过脚本自写摘要。Windows LEGACY/CODE_ONLY 使用同一消息目录从项目实际读取的本机配置生成摘要,执行:
|
|
139
139
|
|
|
140
140
|
```powershell
|
|
141
141
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message windows-sandbox-summary --product-name "$PRODUCT_NAME" --config-path "$CONFIG_PATH" --environment-rows "$ENVIRONMENT_ROWS" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
`environmentRows` 的具体值严禁编造、猜测、补全,禁止使用示例值、占位值或历史对话值替代本轮已校验配置。Unix/macOS/Linux 或 Windows READY 必须由登记脚本直接读取同一配置并生成四行,Agent 不得手填或改写;Windows LEGACY 的应用 ID 和买家测试账号必须取自步骤 1/3 已校验的同一本机配置,两个密码行的固定保存提示仅在实际确认密码已写入该文件后使用。任一必需字段缺失、为空、配置无法读取或来源无法确认时,停止摘要展示并按既有配置失败分支处理,禁止为凑齐四行补值。
|
|
144
|
+
`environmentRows` 的具体值严禁编造、猜测、补全,禁止使用示例值、占位值或历史对话值替代本轮已校验配置。Unix/macOS/Linux 或 Windows READY 必须由登记脚本直接读取同一配置并生成四行,Agent 不得手填或改写;Windows LEGACY/CODE_ONLY 的应用 ID 和买家测试账号必须取自步骤 1/3 已校验的同一本机配置,两个密码行的固定保存提示仅在实际确认密码已写入该文件后使用。任一必需字段缺失、为空、配置无法读取或来源无法确认时,停止摘要展示并按既有配置失败分支处理,禁止为凑齐四行补值。
|
|
145
145
|
|
|
146
|
-
摘要动态行固定依次为“沙箱支付宝应用ID(appID)”“沙箱买家测试账号”“沙箱买家登录密码”“沙箱买家支付密码”。Unix/macOS/Linux 与 Windows READY 都从已校验快速沙箱配置的 `appIds[0].appId`、`sandboxAccounts.user.email`、`sandboxAccounts.user.logonPassword`、`sandboxAccounts.user.payPassword` 取值;Windows LEGACY 手工沙箱只展示前两项实际值,两个密码行固定提示“已写入本地配置文件,默认不在对话中展开”。不得追加 pid、商家或买家 userId、sandboxId;手工沙箱不得将密码原文传入 renderer。以上例外不得扩展到生产环境账号、私钥或密码。
|
|
146
|
+
摘要动态行固定依次为“沙箱支付宝应用ID(appID)”“沙箱买家测试账号”“沙箱买家登录密码”“沙箱买家支付密码”。Unix/macOS/Linux 与 Windows READY 都从已校验快速沙箱配置的 `appIds[0].appId`、`sandboxAccounts.user.email`、`sandboxAccounts.user.logonPassword`、`sandboxAccounts.user.payPassword` 取值;Windows LEGACY/CODE_ONLY 手工沙箱只展示前两项实际值,两个密码行固定提示“已写入本地配置文件,默认不在对话中展开”。不得追加 pid、商家或买家 userId、sandboxId;手工沙箱不得将密码原文传入 renderer。以上例外不得扩展到生产环境账号、私钥或密码。
|
|
147
147
|
|
|
148
148
|
renderer 固定输出唯一摘要表、密钥字段已落盘提示和“配置不等于测试通过”的边界。禁止另写字段核对表、独立校验结论,或把表名、前后提示改成“沙箱环境校验通过”“沙箱测试通过”“沙箱环境测试通过”。
|
|
149
149
|
|
|
150
150
|
### 5.3 配置准备完成后提示(卡点)
|
|
151
151
|
|
|
152
|
-
`sandbox.environment.summary` 后立即渲染 `sandbox.environment.reminder`:Unix/macOS/Linux 或 Windows READY 由 `sandbox_config.sh summary` 使用 `DEFAULT`,Windows LEGACY 使用上方 `WINDOWS` 命令。该消息说明测试资金边界和配置位置;`DEFAULT` 另提醒代码开发阶段自动配置沙箱,正式上线前由用户替换为产品开通流程取得的线上应用配置。安全控制由脚本执行,详细生产配置与上线要求由步骤 7 的 `integration.safety.closeout` 输出。创建阶段不渲染,不维护文案副本。
|
|
152
|
+
`sandbox.environment.summary` 后立即渲染 `sandbox.environment.reminder`:Unix/macOS/Linux 或 Windows READY 由 `sandbox_config.sh summary` 使用 `DEFAULT`,Windows LEGACY/CODE_ONLY 使用上方 `WINDOWS` 命令。该消息说明测试资金边界和配置位置;`DEFAULT` 另提醒代码开发阶段自动配置沙箱,正式上线前由用户替换为产品开通流程取得的线上应用配置。安全控制由脚本执行,详细生产配置与上线要求由步骤 7 的 `integration.safety.closeout` 输出。创建阶段不渲染,不维护文案副本。
|
|
153
153
|
|
|
154
154
|
### 5.4 沙箱对客展示白名单
|
|
155
155
|
|
|
@@ -159,10 +159,10 @@ renderer 固定输出唯一摘要表、密钥字段已落盘提示和“配置
|
|
|
159
159
|
|---|---|---|
|
|
160
160
|
| Unix/macOS/Linux 与 Windows READY 快速沙箱摘要 | `sandbox_config.sh summary` 实际渲染的应用 `appId`、买家 `email/logonPassword/payPassword`、配置文件目录 | `appPrivateKey`、`appPrivatePkcsKey`、`alipayPublicKey`、`appPublicKey`、原始 `.alipay-sandbox.json`、完整 MCP 响应 |
|
|
161
161
|
| Unix/macOS/Linux 与 Windows READY 网站支付付款体验 | 已校验的沙箱买家登录账号、登录密码、支付密码,以及实际支付页面地址和启动命令 | 商家密码、任何公钥/私钥原文、完整支付表单、签名串 |
|
|
162
|
-
| Windows LEGACY 手工沙箱 | 配置文件目录、实际沙箱应用 ID 和买家登录账号、两个密码的本机保存提示、官方控制台获取与本机配置完成提示 | 用户提供的应用私钥、支付宝公钥、应用公钥、沙箱账号密码原文 |
|
|
162
|
+
| Windows LEGACY/CODE_ONLY 手工沙箱 | 配置文件目录、实际沙箱应用 ID 和买家登录账号、两个密码的本机保存提示、官方控制台获取与本机配置完成提示 | 用户提供的应用私钥、支付宝公钥、应用公钥、沙箱账号密码原文 |
|
|
163
163
|
| 按量付费自动联调 | 受控结论、付款链接和沙箱买家可选体验入口 | `Payment-Proof`、`Payment-Validation` 原文、完整收银请求、临时产物路径中的敏感内容 |
|
|
164
164
|
|
|
165
|
-
仅 Unix/macOS/Linux 与 Windows READY 的 `sandboxCredential` 类型变量可以承载快速沙箱买家登录密码和支付密码;该例外不适用于 Windows LEGACY 手工沙箱或生产账号、生产密码、应用私钥、公钥、token、签名串或 Payment-Proof。
|
|
165
|
+
仅 Unix/macOS/Linux 与 Windows READY 的 `sandboxCredential` 类型变量可以承载快速沙箱买家登录密码和支付密码;该例外不适用于 Windows LEGACY/CODE_ONLY 手工沙箱或生产账号、生产密码、应用私钥、公钥、token、签名串或 Payment-Proof。
|
|
166
166
|
|
|
167
167
|
### 5.5 网站支付沙箱付款提示(代码生成后、集成收尾前)
|
|
168
168
|
|
|
@@ -172,7 +172,7 @@ renderer 固定输出唯一摘要表、密钥字段已落盘提示和“配置
|
|
|
172
172
|
- **渲染验证**:Agent 具备浏览器/UI 能力时,打开回跳页确认非空白、无可见报错且关键内容正常渲染;不具备时,请用户打开精确地址确认。未取得证据时不得宣称回跳页已验证或网站支付代码开发完成。
|
|
173
173
|
- **关闭分支**:用户已明确表示不使用同步回跳时,不要求或猜测 `return_url`;确认 SDK 请求未传该字段,并验证异步通知、交易查询和商户订单查询页。用户未明确关闭时,缺少 `return_url` 必须修复为默认同步回跳分支。
|
|
174
174
|
|
|
175
|
-
完成对应分支校验后按系统渲染:Unix/macOS/Linux 与 Windows READY 快速沙箱使用 `webpay.sandbox.experience`,传入已校验的沙箱买家账号、登录密码、支付密码、实际项目启动命令、浏览器支付页面地址和当前回跳分支说明;Windows LEGACY 手工沙箱使用 `webpay.sandbox.experience.windows`,只传实际启动命令、浏览器支付页面地址和回跳分支说明,密码由用户从已保存的本机配置或支付宝开放平台控制台取得,Agent 不在付款指引中复述。不得使用示例端口、占位 URL 或猜测地址;任一必需值无法确定时不渲染半模板,指出缺失项并标记为人工待补充。
|
|
175
|
+
完成对应分支校验后按系统渲染:Unix/macOS/Linux 与 Windows READY 快速沙箱使用 `webpay.sandbox.experience`,传入已校验的沙箱买家账号、登录密码、支付密码、实际项目启动命令、浏览器支付页面地址和当前回跳分支说明;Windows LEGACY/CODE_ONLY 手工沙箱使用 `webpay.sandbox.experience.windows`,只传实际启动命令、浏览器支付页面地址和回跳分支说明,密码由用户从已保存的本机配置或支付宝开放平台控制台取得,Agent 不在付款指引中复述。不得使用示例端口、占位 URL 或猜测地址;任一必需值无法确定时不渲染半模板,指出缺失项并标记为人工待补充。
|
|
176
176
|
|
|
177
177
|
`curl` 调用下单接口并取得 HTML 支付表单只属于接口冒烟检查,不能替代用户付款指引,也不能据此标记步骤 6 完成。必须提供用户可在浏览器中打开的支付页面地址;页面打开沙箱收银台后,以下两种体验方式同时告知用户,由用户自行二选一。
|
|
178
178
|
|
|
@@ -200,8 +200,8 @@ renderer 固定输出唯一摘要表、密钥字段已落盘提示和“配置
|
|
|
200
200
|
2. 禁止用占位符或示例假数据冒充真实返回值。
|
|
201
201
|
3. 禁止假设“工具返回的应该都有”而跳过逐项校验。
|
|
202
202
|
4. 禁止字段不完整时使用当前配置、写入正式 `.alipay-sandbox.json`、执行配置后置校验或沙箱测试;允许继续不读取沙箱字段的代码实现,最终必须标记沙箱配置未完成。
|
|
203
|
-
5. Windows LEGACY 只允许用户在标准资料收集消息后提供当前沙箱密钥和账号信息,Agent 不得在回复、摘要或日志中复述;Unix/macOS/Linux 或 Windows READY 只允许按登记消息展示已校验的快速沙箱买家密码。禁止展示生产环境应用私钥、账号密码或把任何密钥长字段整段刷屏输出。
|
|
204
|
-
6. 禁止继续使用已被 Git 跟踪的沙箱敏感配置。Unix/macOS/Linux 或 Windows READY 快速沙箱还必须具备 `/.alipay-sandbox.json` 精确忽略规则;Windows LEGACY 必须具备适用于实际本机敏感配置路径的忽略保护。
|
|
203
|
+
5. Windows LEGACY/CODE_ONLY 只允许用户在标准资料收集消息后提供当前沙箱密钥和账号信息,Agent 不得在回复、摘要或日志中复述;Unix/macOS/Linux 或 Windows READY 只允许按登记消息展示已校验的快速沙箱买家密码。禁止展示生产环境应用私钥、账号密码或把任何密钥长字段整段刷屏输出。
|
|
204
|
+
6. 禁止继续使用已被 Git 跟踪的沙箱敏感配置。Unix/macOS/Linux 或 Windows READY 快速沙箱还必须具备 `/.alipay-sandbox.json` 精确忽略规则;Windows LEGACY/CODE_ONLY 必须具备适用于实际本机敏感配置路径的忽略保护。
|
|
205
205
|
|
|
206
206
|
### 6.2 快速沙箱重复创建边界
|
|
207
207
|
|
|
@@ -216,10 +216,10 @@ renderer 固定输出唯一摘要表、密钥字段已落盘提示和“配置
|
|
|
216
216
|
| 创建失败且既定重试耗尽 | `ensure` 使用 `sandbox.configuration.pending/CREATE`,记录 `CREATE_PENDING` 并继续代码实现;代码开发完成后固定提醒用户可对 Agent 说“重新创建并配置沙箱” |
|
|
217
217
|
| 候选字段或已有配置字段复核失败 | 最多自动重试 2 次、每次间隔 3 秒;仍失败时使用 `sandbox.configuration.pending/CREATE|VERIFY` 并继续代码实现,不展示原始字段或响应 |
|
|
218
218
|
| 待配置状态 | 跳过摘要、配置后置校验、按量付费联调和网站支付付款体验;最终 checklist 保持部分通过或未通过,不得宣称代码开发全部通过或生产就绪 |
|
|
219
|
-
| Windows LEGACY 未提供资料且未明确要求当前配置 | 记录 `VERIFY_PENDING` 并继续代码实现;不输出失败或申领消息,不探测、不读取、不伪造配置 |
|
|
220
|
-
| Windows LEGACY 手工申领资料或本地项目配置校验未通过 | 使用 `sandbox.create.failure/WINDOWS`;按第 4 节逐项校验,只补问或更正实际缺失、错误字段后由 Agent 更新本机配置,不要求用户执行 Skill 内部脚本,不伪造快速沙箱结果,也不调用快速沙箱重建 |
|
|
219
|
+
| Windows LEGACY/CODE_ONLY 未提供资料且未明确要求当前配置 | 记录 `VERIFY_PENDING` 并继续代码实现;不输出失败或申领消息,不探测、不读取、不伪造配置 |
|
|
220
|
+
| Windows LEGACY/CODE_ONLY 手工申领资料或本地项目配置校验未通过 | 使用 `sandbox.create.failure/WINDOWS`;按第 4 节逐项校验,只补问或更正实际缺失、错误字段后由 Agent 更新本机配置,不要求用户执行 Skill 内部脚本,不伪造快速沙箱结果,也不调用快速沙箱重建 |
|
|
221
221
|
|
|
222
|
-
本模块不维护失败话术副本;Unix/macOS/Linux 或 Windows READY 待配置正文由 `sandbox.configuration.pending` 固定维护,Windows LEGACY 缺失字段和恢复动作仍通过 `sandbox.create.failure/WINDOWS` 的受控变量传入。
|
|
222
|
+
本模块不维护失败话术副本;Unix/macOS/Linux 或 Windows READY 待配置正文由 `sandbox.configuration.pending` 固定维护,Windows LEGACY/CODE_ONLY 缺失字段和恢复动作仍通过 `sandbox.create.failure/WINDOWS` 的受控变量传入。
|
|
223
223
|
|
|
224
224
|
---
|
|
225
225
|
|
|
@@ -227,7 +227,7 @@ renderer 固定输出唯一摘要表、密钥字段已落盘提示和“配置
|
|
|
227
227
|
|
|
228
228
|
只有本轮沙箱配置为 `READY` 时,后续步骤才把可信配置接入用户项目并立即做配置准确性后置校验;校验失败时停止联调并修正服务端加载器或 SDK 配置。待配置时只实现会在缺少有效配置时明确失败的加载边界,不读取、复制或伪造沙箱字段。
|
|
229
229
|
|
|
230
|
-
- Unix/macOS/Linux 或 Windows READY 确认服务端加载器直接读取第 5.1 节的实际 `.alipay-sandbox.json`,从同一 `appIds[0]` 映射 `appId`、应用私钥和支付宝公钥;禁止从对话、历史代码或示例值复制,禁止用 shell 把字段原文输出后再粘贴。Windows LEGACY 确认项目读取同一套本机沙箱应用配置。
|
|
230
|
+
- Unix/macOS/Linux 或 Windows READY 确认服务端加载器直接读取第 5.1 节的实际 `.alipay-sandbox.json`,从同一 `appIds[0]` 映射 `appId`、应用私钥和支付宝公钥;禁止从对话、历史代码或示例值复制,禁止用 shell 把字段原文输出后再粘贴。Windows LEGACY/CODE_ONLY 确认项目读取同一套本机沙箱应用配置。
|
|
231
231
|
- 检查加载器没有截断、替换、包装或重新编码字段;项目源码、普通日志和额外 `.env` 中不存在沙箱密钥副本。
|
|
232
232
|
- 检查 SDK 配置与私钥字段匹配:`appPrivatePkcsKey` 对应 PKCS#1,`appPrivateKey` 对应 PKCS#8。
|
|
233
233
|
- 检查 SDK 实际接收的私钥值不包含 PEM 头尾、其他前后缀、包装行或说明文字;业务协议直接使用原生密码库签名时,可按密码库要求临时适配调用入参,但不得修改或覆盖原始配置值。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 完整接入编排
|
|
2
2
|
|
|
3
|
-
本文件是 `full_process` 唯一入口。Windows 复用根入口的 READY/LEGACY 分流,或明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED
|
|
3
|
+
本文件是 `full_process` 唯一入口。Windows 复用根入口的 READY/LEGACY 分流,或明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 先恢复环境,不进入本流程。仅开发的 CODE_ONLY 不适用于本流程;从仅开发切换为完整接入时必须先用 `full_process` 重新执行 Windows 入口。命令携带当前有效的 `--windows-route`。READY 执行 Integration 快速沙箱及 Onboarding 本地流程,LEGACY 仅在不支持的平台映射或用户明确选站点时先完成可独立开发内容,再在原衔接点输出站点引导。两者都不重新安装、不创建 Integration Worker。启动方案送达前只复用 Integration 步骤 1 的项目、语言、当前系统分支环境和沙箱准备;不得开发代码、进入 Onboarding 或读取开通信息。
|
|
4
4
|
|
|
5
5
|
目标项目和技术栈确定后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration entry --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`,只加载当前入口阶段并按步骤 1/2 准备及展示方案;代码开发满足衔接条件后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow onboarding entry --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`。禁止整读两个 flow。所有 Skill 自有运行时动作只用当前 Skill 绝对路径下的统一入口单命令执行,不前置 `cd`、不拼接管道;用户项目命令仍以已确认项目根为 workdir。
|
|
6
6
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"schemaVersion":1,"rules":[{"policyId":"P-MCP-CONTRACT-FROZEN","scope":"all","severity":"critical","text":"只用当前 Skill 已验证的 MCP 脚本契约;禁止推断、改名或尝试近似方法。","runtimeText":"仅用已验证脚本;禁推断或尝试近似方法。"},{"policyId":"P-AUTH-BEFORE-ONBOARDING","scope":"onboarding","severity":"critical","text":"登录、scope 和 MCC 校验通过前,禁止 onboarding 查询或写入。","runtimeText":"登录/scope/MCC 未通过前禁查询和写入。"},{"policyId":"P-SIGNING-WRITE","scope":"onboarding.signing","severity":"critical","text":"签约材料校验通过后直接提交,不增加确认;缺失或非法时禁止提交。"},{"policyId":"P-SERVICE-WRITE","scope":"onboarding.service","severity":"critical","text":"服务创建摘要送达后直接创建;服务修改须取得绑定当前脱敏摘要的明确确认。"},{"policyId":"P-APPLICATION-WRITE","scope":"onboarding.application","severity":"critical","text":"完整新建材料或非空候选后的明确“新建”已构成创建确认;快照未变时不追加确认,公钥确认后直接提审。"},{"policyId":"P-WRITE-UNKNOWN","scope":"onboarding.write","severity":"critical","text":"非幂等写入结果不明时只读核验;仍无法确认则进入 UNKNOWN,禁止重试写入。"},{"policyId":"P-PARTIAL-RESULT","scope":"onboarding","severity":"critical","text":"签约、服务、应用分支独立记录,失败不回滚或覆盖其他成功结果。"},{"policyId":"P-MATERIAL-CATEGORY","scope":"onboarding.materials","severity":"required","text":"每轮只展示一个材料类别;同类一次收齐,已提供材料不得重复索取。"},{"policyId":"P-KEY-NO-PRIVATE","scope":"onboarding.application","severity":"critical","text":"Agent 禁止请求、读取、处理、保存或输出生产私钥,也不提供密钥生成命令;仅用户选择方案3后可打开本地静态页面,由用户在浏览器内自行生成并保存密钥,禁止 Agent 操作页面生成按钮或读取页面密钥。"},{"policyId":"P-KEY-PUBLIC-USER","scope":"onboarding.application","severity":"critical","text":"应用公钥只能由用户提供;缺少时禁止 createKeyConfirmPage,也不得补全、改写或添加 PEM 头尾。"},{"policyId":"P-AUTH-URL","scope":"onboarding.authorization","severity":"critical","text":"授权链接只由 auth.sh 构造并校验固定域名、路径和参数;禁用 verification_url。"},{"policyId":"P-KEY-URL","scope":"onboarding.application","severity":"critical","text":"公钥确认只展示 createKeyConfirmPage 返回并校验的裸 URL;禁止二维码链接和 alipays://。"},{"policyId":"P-AUTH-URL-AUTO-OPEN","scope":"onboarding.authorization","severity":"critical","text":"授权 URL 交付后调用受控 opener;失败时保留同一裸 URL 和复制兜底。"},{"policyId":"P-KEY-URL-AUTO-OPEN","scope":"onboarding.application","severity":"critical","text":"公钥 URL 交付后调用受控 opener;失败时保留同一裸 URL 和复制兜底。"},{"policyId":"P-KEY-TOOL-DOWNLOAD","scope":"onboarding.application","severity":"critical","text":"预发版查询应用列表成功后展示三种公钥获取方式,不自动下载密钥工具。用户明确选择方案3才打开随包本地离线页面;失败引导自行下载安装官方密钥工具。页面由用户自行生成、保存密钥,Agent 只接收用户提供的公钥。"},{"policyId":"P-A2M-SANDBOX","scope":"integration.aipay","severity":"critical","text":"AI 按量付费沙箱 serviceId 固定为 api_mock_service_id,SDK 使用沙箱网关;生产网关和真实 serviceId 只用于正式配置。","runtimeText":"A2M 沙箱固定 api_mock_service_id 与沙箱网关;生产值仅用于正式配置。"},{"policyId":"P-A2M-SUCCESS","scope":"integration.aipay","severity":"critical","text":"自动联调只有在 HTTP 200、非空可归属资源、无明确业务失败且适用 Payment-Validation 有效时通过。","runtimeText":"联调仅在 HTTP 200、资源可归属、无业务失败且适用回执有效时通过。"},{"policyId":"P-SANDBOX-CREDENTIAL-EXCEPTION","scope":"integration.sandbox","severity":"critical","text":"Unix/macOS/Linux 与 Windows READY 只允许快速沙箱实际返回且已校验的买家登录/支付密码在登记的沙箱摘要和付款体验中经 stdin 临时渲染。Windows READY 的快速沙箱配置须写入当前项目受保护的本机文件;Windows LEGACY 手工沙箱允许用户在 sandbox.windows.manual_setup 后提供当前沙箱应用的 APPID、支付宝公钥、应用公钥、与当前开发语言匹配的应用私钥和沙箱账号信息;Agent 只能将其用于已确认目标项目的受保护配置,不得在回复、摘要、普通日志或业务状态中复述或另存原文。两类例外均不得扩展到生产环境账号、应用私钥或密码。","runtimeText":"Unix/macOS/Linux 与 Windows READY 已校验快速沙箱买家密码仅限登记摘要/付款体验;Windows LEGACY 手工资料仅入受保护项目配置,禁复述、另存或扩展到生产值。"},{"policyId":"P-SENSITIVE-STATE","scope":"all","severity":"critical","text":"用户公钥仅用于当前 app key/verify-key/verify-key-and-audit 调用,禁止在回复、摘要、普通日志、跨会话状态或宽权限临时文件中复述或保存;除登记的沙箱例外外,私钥、token、Payment-Proof、签名串、完整支付表单和未脱敏响应同样不得进入这些位置;临时 URL 仅可由登记动作校验后在该动作正文展示。","runtimeText":"公钥限当前 app 调用且禁复述/保存;敏感值禁入回复/摘要/日志/状态/宽权限文件;临时 URL 仅由登记动作展示。"},{"policyId":"P-PROJECT-PROTECT","scope":"integration","severity":"critical","text":"不得清空、覆盖或删除用户既有项目;只在已确认目标路径和范围内做必要修改。","runtimeText":"禁清空/覆盖/删除既有项目;仅改已确认路径和范围。"},{"policyId":"P-CUSTOMER-OUTPUT-EXCLUSIVE","scope":"all","severity":"critical","text":"登记 runner/script 的 stdout 是唯一对客正文,禁止增删改写;阻塞消息送达后立即等待用户。","runtimeText":"登记 stdout 原文是唯一正文;阻塞送达后立即等待。"},{"policyId":"P-ONBOARDING-CONTROL-CHANNEL","scope":"onboarding","severity":"critical","text":"剔除 ALIPAY_AIPAY_INTERNAL 内部行后再处理 stdout;内部行禁止对客,正文为空时直接转移。","runtimeText":"内部行禁对客;正文为空按唯一终态转移。"},{"policyId":"P-AUTH-PAGE-DELIVERY-BARRIER","scope":"onboarding.authorization","severity":"critical","text":"`auth.page` stdout 必须先独立送达,再 opener 和有限轮询;不得合并 pending 或收口,也不等待确认。"},{"policyId":"P-KEY-PAGE-DELIVERY-BARRIER","scope":"onboarding.application","severity":"critical","text":"`application.key.page` stdout 必须先独立送达,再 opener 和有限轮询;不得合并 pending 或收口,也不等待确认。"},{"policyId":"P-DETERMINISTIC-HANDOFF","scope":"all","severity":"critical","text":"只执行 flow 动作处登记命令并按唯一终态立即转移;禁止追加命令重复解析,失败只走登记恢复。","runtimeText":"仅执行登记命令并按唯一终态转移;禁追加解析;失败只走登记恢复。"}],"officialUrls":{"aipaySite":"https://aipay.alipay.com/","aipaySkillSite":"https://aipay.alipay.com/?from=alipay-aipay-skill","merchantPlatform":"https://b.alipay.com/page/portal/home","openPlatform":"https://open.alipay.com/","openPlatformHome":"https://open.alipay.com","technicalSupport":"https://opensupport.alipay.com/support/intelligent-services?form=payskill","keyToolManual":"https://opendocs.alipay.com/isv/02kipk","keyToolMac":"https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=mac&channelType=WEB","keyToolWindows":"https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB","androidSandboxAlipay":"https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original","sandboxToolFallback":"https://open.alipay.com/develop/sandbox/tool","sandboxGateway":"https://openapi-sandbox.dl.alipaydev.com/gateway.do","productionGateway":"https://openapi.alipay.com/gateway.do","openPlatformPaySkill":"https://open.alipay.com?form=payskill","traditionalPaymentSkill":"https://github.com/alipay/ai/tree/main/skills","dingtalkSupportGroupQr":"https://mdn.alipayobjects.com/huamei_5fajmi/afts/img/MlFpRKmYyLIAAAAARJAAAAgADlahAQFr/original","wecomCommunityGroupQr":"https://mdn.alipayobjects.com/huamei_5fajmi/afts/img/Cz0TTZVO7_4AAAAAQDAAAAgADlahAQFr/fmt.webp","applicationKeyFormat":"https://opendocs.alipay.com/common/055l5k"},"authorizationProducts":[{"productName":"AI 按量付费","salesCode":"I1080300001000160457","scope":"app:all,machine_pay:write,agmnt:write"},{"productName":"AI 网页应用收款","salesCode":"I1080300001000041203","scope":"app:all,fast_instant_trade_pay:write"},{"productName":"AI 移动应用收款","salesCode":"I1080300001000041313","scope":"app:all,auth_alipay_apppay:write"}],"temporaryUrlAllowlist":{"authorization":{"host":"aipay.alipay.com","path":"/cli-auth","requiredQueryParams":["deviceCode","productCode","mccCode"],"optionalQueryParams":["platform"]},"publicKeyConfirmation":[{"host":"aipay.alipay.com","path":"/public-key-confirm","requiredQueryParams":["keyConfirmToken"],"optionalQueryParams":[]},{"host":"open.alipay.com","path":"/ai/ai-resource-center/public-key-confirm","requiredQueryParams":["keyConfirmToken"],"optionalQueryParams":[]}],"windowsOnboardingRedirect":{"host":"aipay.alipay.com","path":"/","requiredQueryParams":["from","reason","platform_id"],"optionalQueryParams":[]}}}
|
|
1
|
+
{"schemaVersion":1,"rules":[{"policyId":"P-MCP-CONTRACT-FROZEN","scope":"all","severity":"critical","text":"只用当前 Skill 已验证的 MCP 脚本契约;禁止推断、改名或尝试近似方法。","runtimeText":"仅用已验证脚本;禁推断或尝试近似方法。"},{"policyId":"P-AUTH-BEFORE-ONBOARDING","scope":"onboarding","severity":"critical","text":"登录、scope 和 MCC 校验通过前,禁止 onboarding 查询或写入。","runtimeText":"登录/scope/MCC 未通过前禁查询和写入。"},{"policyId":"P-SIGNING-WRITE","scope":"onboarding.signing","severity":"critical","text":"签约材料校验通过后直接提交,不增加确认;缺失或非法时禁止提交。"},{"policyId":"P-SERVICE-WRITE","scope":"onboarding.service","severity":"critical","text":"服务创建摘要送达后直接创建;服务修改须取得绑定当前脱敏摘要的明确确认。"},{"policyId":"P-APPLICATION-WRITE","scope":"onboarding.application","severity":"critical","text":"完整新建材料或非空候选后的明确“新建”已构成创建确认;快照未变时不追加确认,公钥确认后直接提审。"},{"policyId":"P-WRITE-UNKNOWN","scope":"onboarding.write","severity":"critical","text":"非幂等写入结果不明时只读核验;仍无法确认则进入 UNKNOWN,禁止重试写入。"},{"policyId":"P-PARTIAL-RESULT","scope":"onboarding","severity":"critical","text":"签约、服务、应用分支独立记录,失败不回滚或覆盖其他成功结果。"},{"policyId":"P-MATERIAL-CATEGORY","scope":"onboarding.materials","severity":"required","text":"每轮只展示一个材料类别;同类一次收齐,已提供材料不得重复索取。"},{"policyId":"P-KEY-NO-PRIVATE","scope":"onboarding.application","severity":"critical","text":"Agent 禁止请求、读取、处理、保存或输出生产私钥,也不提供密钥生成命令;仅用户选择方案3后可打开本地静态页面,由用户在浏览器内自行生成并保存密钥,禁止 Agent 操作页面生成按钮或读取页面密钥。"},{"policyId":"P-KEY-PUBLIC-USER","scope":"onboarding.application","severity":"critical","text":"应用公钥只能由用户提供;缺少时禁止 createKeyConfirmPage,也不得补全、改写或添加 PEM 头尾。"},{"policyId":"P-AUTH-URL","scope":"onboarding.authorization","severity":"critical","text":"授权链接只由 auth.sh 构造并校验固定域名、路径和参数;禁用 verification_url。"},{"policyId":"P-KEY-URL","scope":"onboarding.application","severity":"critical","text":"公钥确认只展示 createKeyConfirmPage 返回并校验的裸 URL;禁止二维码链接和 alipays://。"},{"policyId":"P-AUTH-URL-AUTO-OPEN","scope":"onboarding.authorization","severity":"critical","text":"授权 URL 交付后调用受控 opener;失败时保留同一裸 URL 和复制兜底。"},{"policyId":"P-KEY-URL-AUTO-OPEN","scope":"onboarding.application","severity":"critical","text":"公钥 URL 交付后调用受控 opener;失败时保留同一裸 URL 和复制兜底。"},{"policyId":"P-KEY-TOOL-DOWNLOAD","scope":"onboarding.application","severity":"critical","text":"预发版查询应用列表成功后展示三种公钥获取方式,不自动下载密钥工具。用户明确选择方案3才打开随包本地离线页面;失败引导自行下载安装官方密钥工具。页面由用户自行生成、保存密钥,Agent 只接收用户提供的公钥。"},{"policyId":"P-A2M-SANDBOX","scope":"integration.aipay","severity":"critical","text":"AI 按量付费沙箱 serviceId 固定为 api_mock_service_id,SDK 使用沙箱网关;生产网关和真实 serviceId 只用于正式配置。","runtimeText":"A2M 沙箱固定 api_mock_service_id 与沙箱网关;生产值仅用于正式配置。"},{"policyId":"P-A2M-SUCCESS","scope":"integration.aipay","severity":"critical","text":"自动联调只有在 HTTP 200、非空可归属资源、无明确业务失败且适用 Payment-Validation 有效时通过。","runtimeText":"联调仅在 HTTP 200、资源可归属、无业务失败且适用回执有效时通过。"},{"policyId":"P-SANDBOX-CREDENTIAL-EXCEPTION","scope":"integration.sandbox","severity":"critical","text":"Unix/macOS/Linux 与 Windows READY 只允许快速沙箱实际返回且已校验的买家登录/支付密码在登记的沙箱摘要和付款体验中经 stdin 临时渲染。Windows READY 的快速沙箱配置须写入当前项目受保护的本机文件;Windows LEGACY/CODE_ONLY 手工沙箱允许用户在 sandbox.windows.manual_setup 后提供当前沙箱应用的 APPID、支付宝公钥、应用公钥、与当前开发语言匹配的应用私钥和沙箱账号信息;Agent 只能将其用于已确认目标项目的受保护配置,不得在回复、摘要、普通日志或业务状态中复述或另存原文。两类例外均不得扩展到生产环境账号、应用私钥或密码。","runtimeText":"Unix/macOS/Linux 与 Windows READY 已校验快速沙箱买家密码仅限登记摘要/付款体验;Windows LEGACY/CODE_ONLY 手工资料仅入受保护项目配置,禁复述、另存或扩展到生产值。"},{"policyId":"P-SENSITIVE-STATE","scope":"all","severity":"critical","text":"用户公钥仅用于当前 app key/verify-key/verify-key-and-audit 调用,禁止在回复、摘要、普通日志、跨会话状态或宽权限临时文件中复述或保存;除登记的沙箱例外外,私钥、token、Payment-Proof、签名串、完整支付表单和未脱敏响应同样不得进入这些位置;临时 URL 仅可由登记动作校验后在该动作正文展示。","runtimeText":"公钥限当前 app 调用且禁复述/保存;敏感值禁入回复/摘要/日志/状态/宽权限文件;临时 URL 仅由登记动作展示。"},{"policyId":"P-PROJECT-PROTECT","scope":"integration","severity":"critical","text":"不得清空、覆盖或删除用户既有项目;只在已确认目标路径和范围内做必要修改。","runtimeText":"禁清空/覆盖/删除既有项目;仅改已确认路径和范围。"},{"policyId":"P-CUSTOMER-OUTPUT-EXCLUSIVE","scope":"all","severity":"critical","text":"登记 runner/script 的 stdout 是唯一对客正文,禁止增删改写;阻塞消息送达后立即等待用户。","runtimeText":"登记 stdout 原文是唯一正文;阻塞送达后立即等待。"},{"policyId":"P-ONBOARDING-CONTROL-CHANNEL","scope":"onboarding","severity":"critical","text":"剔除 ALIPAY_AIPAY_INTERNAL 内部行后再处理 stdout;内部行禁止对客,正文为空时直接转移。","runtimeText":"内部行禁对客;正文为空按唯一终态转移。"},{"policyId":"P-AUTH-PAGE-DELIVERY-BARRIER","scope":"onboarding.authorization","severity":"critical","text":"`auth.page` stdout 必须先独立送达,再 opener 和有限轮询;不得合并 pending 或收口,也不等待确认。"},{"policyId":"P-KEY-PAGE-DELIVERY-BARRIER","scope":"onboarding.application","severity":"critical","text":"`application.key.page` stdout 必须先独立送达,再 opener 和有限轮询;不得合并 pending 或收口,也不等待确认。"},{"policyId":"P-DETERMINISTIC-HANDOFF","scope":"all","severity":"critical","text":"只执行 flow 动作处登记命令并按唯一终态立即转移;禁止追加命令重复解析,失败只走登记恢复。","runtimeText":"仅执行登记命令并按唯一终态转移;禁追加解析;失败只走登记恢复。"}],"officialUrls":{"aipaySite":"https://aipay.alipay.com/","aipaySkillSite":"https://aipay.alipay.com/?from=alipay-aipay-skill","merchantPlatform":"https://b.alipay.com/page/portal/home","openPlatform":"https://open.alipay.com/","openPlatformHome":"https://open.alipay.com","technicalSupport":"https://opensupport.alipay.com/support/intelligent-services?form=payskill","keyToolManual":"https://opendocs.alipay.com/isv/02kipk","keyToolMac":"https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=mac&channelType=WEB","keyToolWindows":"https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB","androidSandboxAlipay":"https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original","sandboxToolFallback":"https://open.alipay.com/develop/sandbox/tool","sandboxGateway":"https://openapi-sandbox.dl.alipaydev.com/gateway.do","productionGateway":"https://openapi.alipay.com/gateway.do","openPlatformPaySkill":"https://open.alipay.com?form=payskill","traditionalPaymentSkill":"https://github.com/alipay/ai/tree/main/skills","dingtalkSupportGroupQr":"https://mdn.alipayobjects.com/huamei_5fajmi/afts/img/MlFpRKmYyLIAAAAARJAAAAgADlahAQFr/original","wecomCommunityGroupQr":"https://mdn.alipayobjects.com/huamei_5fajmi/afts/img/Cz0TTZVO7_4AAAAAQDAAAAgADlahAQFr/fmt.webp","applicationKeyFormat":"https://opendocs.alipay.com/common/055l5k"},"authorizationProducts":[{"productName":"AI 按量付费","salesCode":"I1080300001000160457","scope":"app:all,machine_pay:write,agmnt:write"},{"productName":"AI 网页应用收款","salesCode":"I1080300001000041203","scope":"app:all,fast_instant_trade_pay:write"},{"productName":"AI 移动应用收款","salesCode":"I1080300001000041313","scope":"app:all,auth_alipay_apppay:write"}],"temporaryUrlAllowlist":{"authorization":{"host":"aipay.alipay.com","path":"/cli-auth","requiredQueryParams":["deviceCode","productCode","mccCode"],"optionalQueryParams":["platform"]},"publicKeyConfirmation":[{"host":"aipay.alipay.com","path":"/public-key-confirm","requiredQueryParams":["keyConfirmToken"],"optionalQueryParams":[]},{"host":"open.alipay.com","path":"/ai/ai-resource-center/public-key-confirm","requiredQueryParams":["keyConfirmToken"],"optionalQueryParams":[]}],"windowsOnboardingRedirect":{"host":"aipay.alipay.com","path":"/","requiredQueryParams":["from","reason","platform_id"],"optionalQueryParams":[]}}}
|
|
@@ -11,7 +11,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
11
11
|
import { checkCliEnvironment, isWindowsPlatform } from './platform_compat.mjs';
|
|
12
12
|
|
|
13
13
|
export function runAlipayCliEnvCli(argv = process.argv) {
|
|
14
|
-
if (windowsEnvironmentRunner && !(argv[2] === 'integration-check' && process.env.ALIPAY_AIPAY_WINDOWS_ROUTE
|
|
14
|
+
if (windowsEnvironmentRunner && !(argv[2] === 'integration-check' && ['LEGACY', 'CODE_ONLY'].includes(process.env.ALIPAY_AIPAY_WINDOWS_ROUTE))) {
|
|
15
15
|
process.exitCode = windowsEnvironmentRunner(argv.slice(2));
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
@@ -225,6 +225,11 @@ async function runOnboardingExecuteReady(args) {
|
|
|
225
225
|
async function dispatch(domain, args) {
|
|
226
226
|
if (windowsRouting) {
|
|
227
227
|
if (domain === 'windows-entry') return windowsRouting.runWindowsEntry(args);
|
|
228
|
+
if (process.env.ALIPAY_AIPAY_WINDOWS_ROUTE === 'CODE_ONLY' &&
|
|
229
|
+
(domain.startsWith('onboarding-') || (domain === 'flow' && args[0] !== 'integration') ||
|
|
230
|
+
(args.includes('--root-intent') && args[args.indexOf('--root-intent') + 1] !== 'integration_only'))) {
|
|
231
|
+
windowsRouting.requireBusinessEnvironment();
|
|
232
|
+
}
|
|
228
233
|
if (process.env.ALIPAY_AIPAY_WINDOWS_ROUTE === 'BLOCKED' &&
|
|
229
234
|
['integration-bootstrap','onboarding-bootstrap','flow'].includes(domain)) windowsRouting.requireBusinessEnvironment();
|
|
230
235
|
if (['sandbox', 'mcc', 'auth', 'screenshots', 'special-license', 'sign', 'service', 'app',
|
|
@@ -377,7 +377,7 @@ export async function runSelfUpdateCli(argv = process.argv) {
|
|
|
377
377
|
const installedVersion = readVersionFile(skillDir);
|
|
378
378
|
const kind = skillVersionKind(installedVersion?.raw, channel);
|
|
379
379
|
// A developer-installed beta is pinned, including when its entry is damaged.
|
|
380
|
-
if (kind === 'beta'
|
|
380
|
+
if (kind === 'beta') return local ? { kind: 'CURRENT', version: local } : { kind: 'VERIFY_FAILED' };
|
|
381
381
|
if (installedVersion && !kind) return { kind: 'CHECK_FAILED' };
|
|
382
382
|
const checked = await npmLatest(channel);
|
|
383
383
|
if (!checked.ok) {
|
|
@@ -4,6 +4,17 @@ import {prepare} from './prepare.mjs';
|
|
|
4
4
|
const intents = ['integration_only', 'onboarding_only', 'full_process'];
|
|
5
5
|
const prefix = 'ALIPAY_AIPAY_INTERNAL:';
|
|
6
6
|
|
|
7
|
+
// Only optional-tool failures can relax the code-development gate. Node,
|
|
8
|
+
// storage/ACL failures, invalid state and unknown exceptions remain blocking.
|
|
9
|
+
function codeOnlyFailure(error) {
|
|
10
|
+
const tools = ['Git Bash', 'git', 'jq', 'alipay-cli', 'cli', 'curl', 'PowerShell'];
|
|
11
|
+
if (!tools.includes(error.dependency)) return false;
|
|
12
|
+
return ['DEPENDENCY_MISSING', 'DEPENDENCY_VERSION', 'EXECUTION_FAILED',
|
|
13
|
+
'WINGET_UNAVAILABLE', 'GIT_INSTALL_FAILED', 'GIT_VERIFY_FAILED', 'CLI_INSTALL_FAILED',
|
|
14
|
+
'DOWNLOAD_FAILED', 'INTEGRITY_FAILED', 'SIGNATURE_FAILED', 'RETRY_BUDGET_EXHAUSTED',
|
|
15
|
+
'USER_SCOPE_REQUIRED'].includes(error.reason);
|
|
16
|
+
}
|
|
17
|
+
|
|
7
18
|
// This is a routing result, never proof of a successful payment or onboarding.
|
|
8
19
|
export function selectRoute({rootIntent = '', authorized = false, repair = false, siteSelected = false} = {}) {
|
|
9
20
|
if (rootIntent && !intents.includes(rootIntent)) throw new Error('非法 Windows 根意图');
|
|
@@ -24,7 +35,9 @@ export function selectRoute({rootIntent = '', authorized = false, repair = false
|
|
|
24
35
|
} catch (e) { error = e; }
|
|
25
36
|
}
|
|
26
37
|
report(error);
|
|
27
|
-
|
|
38
|
+
const route = error.reason === 'NO_COMPATIBLE_EXECUTION_MAPPING' ? 'LEGACY' :
|
|
39
|
+
rootIntent === 'integration_only' && codeOnlyFailure(error) ? 'CODE_ONLY' : 'BLOCKED';
|
|
40
|
+
return emit({rootIntent, route, ...resultError(error)});
|
|
28
41
|
}
|
|
29
42
|
|
|
30
43
|
function emit(result) {
|
|
@@ -50,14 +63,14 @@ export function runWindowsEntry(args) {
|
|
|
50
63
|
siteSelected:options['--site-selected']==='true'});
|
|
51
64
|
}
|
|
52
65
|
|
|
53
|
-
//
|
|
66
|
+
// LEGACY/CODE_ONLY can only disable operations. READY is never a capability token.
|
|
54
67
|
export function consumeRoute(args) {
|
|
55
68
|
const remaining = [];
|
|
56
69
|
let route;
|
|
57
70
|
let seen = false;
|
|
58
71
|
for (let i = 0; i < args.length; i++) {
|
|
59
72
|
if (args[i] !== '--windows-route') { remaining.push(args[i]); continue; }
|
|
60
|
-
if (seen || !['READY','LEGACY','BLOCKED'].includes(args[i + 1])) throw new Error('Windows 分流参数非法');
|
|
73
|
+
if (seen || !['READY','LEGACY','CODE_ONLY','BLOCKED'].includes(args[i + 1])) throw new Error('Windows 分流参数非法');
|
|
61
74
|
seen = true;
|
|
62
75
|
route = args[++i];
|
|
63
76
|
}
|
|
@@ -67,7 +80,7 @@ export function consumeRoute(args) {
|
|
|
67
80
|
// Native Node messages, telemetry and project inspection do not depend on Bash.
|
|
68
81
|
// READY is never trusted as proof; the actual business executor checks again.
|
|
69
82
|
export function requireBusinessEnvironment() {
|
|
70
|
-
if (['LEGACY','BLOCKED'].includes(process.env.ALIPAY_AIPAY_WINDOWS_ROUTE)) {
|
|
83
|
+
if (['LEGACY','CODE_ONLY','BLOCKED'].includes(process.env.ALIPAY_AIPAY_WINDOWS_ROUTE)) {
|
|
71
84
|
const error = Object.assign(new Error('WINDOWS_ENVIRONMENT_UNAVAILABLE'), {reason: 'WINDOWS_ENVIRONMENT_UNAVAILABLE'});
|
|
72
85
|
throw error;
|
|
73
86
|
}
|
|
@@ -75,6 +88,7 @@ export function requireBusinessEnvironment() {
|
|
|
75
88
|
}
|
|
76
89
|
|
|
77
90
|
export function onboardingRoute() {
|
|
91
|
+
if (process.env.ALIPAY_AIPAY_WINDOWS_ROUTE === 'CODE_ONLY') return 'BLOCKED';
|
|
78
92
|
if (['LEGACY','BLOCKED'].includes(process.env.ALIPAY_AIPAY_WINDOWS_ROUTE)) return process.env.ALIPAY_AIPAY_WINDOWS_ROUTE;
|
|
79
93
|
try { requireBusinessEnvironment(); return 'READY'; }
|
|
80
94
|
catch (error) { report(error); return 'BLOCKED'; }
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
唯一 stderr 终态:`SELF_UPDATE:CURRENT=<合法 SemVer>`、`SELF_UPDATE:UPDATED=<合法 SemVer>`、`SELF_UPDATE:SESSION_READY=<合法 SemVer>`、`SELF_UPDATE:RETRY_WITH_NETWORK`、`SELF_UPDATE:SKIPPED_NETWORK_RESTRICTED`、`SELF_UPDATE:CHECK_FAILED`、`SELF_UPDATE:INSTALL_FAILED`、`SELF_UPDATE:VERIFY_FAILED`。`UPDATED` 用原子替换后的新版,除 `SESSION_READY` 外其余用当前可用版;marker 异常读当前入口,不得称最新或更新成功;停止读旧版,读取同一根目录的新版入口。仅 `RETRY_WITH_NETWORK` 可取权后原样重试一次,拒绝、不支持或再次返回时读当前入口;一次网络恢复外,不重查、取权、用 `sudo`、要求用户操作或写更新状态。每次只查一次 npm latest 的 `version` 和 `alipayAipayChannels`;只比较本渠道 Skill 版本,npm 包版本仅用于精确下载;`VERSION` 缺失、非法、落后或业务入口缺失时只从查询所得精确 npm 包版本安装当前渠道一次。渠道由当前目录的 `references/normal/json/release-channel.json` 与 Skill 名称共同校验;旧正式版缺少渠道文件时只兼容 `stable`,预发版禁止回退正式版。缺少或非法的远端渠道元数据返回 `CHECK_FAILED`,不得按 npm 包版本兜底。不调用公开 `install --target all`;超时终止同一次调用的进程树并清理。
|
|
6
6
|
|
|
7
|
-
本地正式渠道的 `X.Y.Z-beta`、`X.Y.Z-betaN`(兼容 `-beta.N`)和预发渠道的 `X.Y.Z-pre-beta`、`X.Y.Z-pre-betaN
|
|
7
|
+
本地正式渠道的 `X.Y.Z-beta`、`X.Y.Z-betaN`(兼容 `-beta.N`)和预发渠道的 `X.Y.Z-pre-beta`、`X.Y.Z-pre-betaN` 均为固定测试版本。完整安装直接返回 `CURRENT` 且不查询 npm;业务入口损坏时返回 `VERIFY_FAILED`,仍不下载修复或转正。更换版本必须由测试人员显式执行 npm 安装器的 `install`,普通 `update` 同样不推进 beta。正常版本分别为 `X.Y.Z` 与 `X.Y.Z-pre`,远端对应渠道若为 beta 或名称不匹配,返回 `CHECK_FAILED`,不自动安装。beta 不参与版本排序,无自动追踪和自动转正。
|
|
8
8
|
|
|
9
9
|
`SESSION_READY` 是 Windows 目录占用或权限失败的有限恢复:只有替换前的备份/暂存准备失败,安装器才从本次精确 npm 包创建并逐文件 SHA-256 复核独立副本;不混合覆盖原目录,不更新全局安装记录。必须同时取得唯一 `ALIPAY_AIPAY_INTERNAL:SELF_UPDATE_SESSION_SKILL_DIR=<JSON 字符串>`,用已核验的绝对路径重绑 `SKILL_DIR`,明确告知“全局目录未更新,当前会话使用已校验的新版本;下次会话仍可能加载旧版”。废弃旧 loaded/CLI 刷新事实,保留本渠道自更新已检查事实,立即读取新路径的 `SKILL.md` 并继续其余启动协议,禁止再次自更新。内测版仍需按新路径/版本完成声明及服务/采集选择,安装意图不得代替采集同意。路径 marker 缺失、冲突或新入口不可读时,不切换、不声称更新成功,使用仍可用的原目录或说明入口不可用。
|
|
10
10
|
|
|
@@ -16,7 +16,11 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" windows-entry --root-in
|
|
|
16
16
|
|
|
17
17
|
用户明确要求安装并通过 Skill 完成签约/开通或完整接入时附加 `--prepare-authorized true`;仅代码开发且没有依赖准备授权时先只读检查。用户明确选择站点时附加 `--site-selected true`。准备授权只覆盖用户级依赖,不包含登录、签约或应用写入。
|
|
18
18
|
|
|
19
|
-
退出 0 只表示分流完成。必须取得唯一 `ALIPAY_AIPAY_INTERNAL:WINDOWS_ROUTE=<JSON>`,校验 schemaVersion=1、rootIntent 等于当前根意图、route 为 READY、BLOCKED 或
|
|
19
|
+
退出 0 只表示分流完成。必须取得唯一 `ALIPAY_AIPAY_INTERNAL:WINDOWS_ROUTE=<JSON>`,校验 schemaVersion=1、rootIntent 等于当前根意图、route 为 READY、BLOCKED、LEGACY 或 CODE_ONLY;非零、超时、缺失或冲突均按 BLOCKED 停止。READY 才执行本地快速沙箱和签约;BLOCKED 说明内部 `WINDOWS_ENV_RESULT` 的实际 reason/dependency 及恢复动作,等待环境修复,不能输出站点引导;LEGACY 仅用于不支持的执行映射或用户明确选择站点。后续 Windows runtime 命令附加当前 `--windows-route`;BLOCKED 不进入 bootstrap、业务 flow 或项目写入。修复后必须重新只读复检,取得唯一 READY 才继续原任务。环境故障不关闭遥测,也不改变 SESSION_ID、run_id、计数或会话采集选择。
|
|
20
|
+
|
|
21
|
+
仅开发入口的例外:`integration_only` 遇到已识别的 Git Bash、jq、CLI 或安装辅助工具缺失/运行失败,以及这些工具的有限安装、下载、哈希/签名校验或预算耗尽失败时,返回 `CODE_ONLY`。失败工具不得继续执行,校验失败的安装包不得运行;保留实际失败诊断,但不等待用户修环境才开始独立代码开发。以唯一 WINDOWS_ROUTE 的 route 决定是否进入开发;WINDOWS_ENV_RESULT 的失败诊断仅表示兼容工具仍不可用,不能将其误读为 CODE_ONLY 也禁止开发。该分流只允许 Integration 的原生 Node 路径,默认 `VERIFY_PENDING`,跳过快速沙箱和依赖沙箱的测试,最终如实列出未完成项,不自动引导站点开通。Node 版本不足、架构探测未知、存储/ACL、状态损坏、回滚失败或未知错误仍为 BLOCKED;项目路径和敏感配置保护要求不变。下文“失败保持 BLOCKED”对该可选工具例外按 CODE_ONLY 处理,签约/完整接入不适用此例外。
|
|
22
|
+
|
|
23
|
+
CODE_ONLY 后用户已自行修好工具时,原样执行上述 `windows-entry --root-intent integration_only` 只读复检;明确授权准备时附加 `--prepare-authorized true`,只有明确修复后重试才再附加 `--repair-confirmed true`,沿用原有分阶段预算。唯一 READY 才恢复快速沙箱能力;仍为 CODE_ONLY 时继续独立开发,不反复安装。转为产品开通或完整接入必须先按新根意图重新执行入口,不把 CODE_ONLY 当成 LEGACY 的站点选择,也不沿用仅开发的能力事实。
|
|
20
24
|
|
|
21
25
|
## Windows CLI 安装契约
|
|
22
26
|
|
|
@@ -70,7 +74,7 @@ Windows 签约请求的 UUID 使用已有 Node 生成,仅此步骤不要求 py
|
|
|
70
74
|
|
|
71
75
|
所有兼容层内部 marker 只写 stderr 且以 `ALIPAY_AIPAY_INTERNAL:` 开头,不对客。`WINDOWS_ENV_RESULT` 表示环境诊断;`WINDOWS_BUSINESS_BLOCKED=ENVIRONMENT_UNAVAILABLE` 表示 gateway 在启动本次业务脚本前阻断,退出非零,本次业务 CLI 调用为零。
|
|
72
76
|
|
|
73
|
-
Integration
|
|
77
|
+
Integration 在上述明确的调用前阻断时停在环境恢复点,不擅自改判 LEGACY/CODE_ONLY;本例外仅处理根入口的可选工具失败。用户修复后复检 READY 才继续;沙箱脚本已经启动后,只接受原 flow 的 READY、CREATE_PENDING、VERIFY_PENDING 和精确 LOCAL_FS_RECOVERY;非零、超时、协议冲突仍停止核对,不将异常伪装成待配置、不重放原 MCP、不读取敏感配置补造成功证据。
|
|
74
78
|
|
|
75
79
|
Onboarding 的环境失败停止依赖动作;修复后先按原只读入口查询实际状态。授权、材料、资格和审核错误仍归原业务分支,不能统一解释为 Windows 失败。所有原有交付屏障、阻塞确认、未知写结果规则和最终收口仍有效。
|
|
76
80
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<!-- ALIPAY_AIPAY_FLOW:ONBOARDING_CORE:START -->
|
|
2
2
|
# 支付产品-产品开通流程说明
|
|
3
3
|
|
|
4
|
+
Windows `CODE_ONLY` 仅用于独立代码开发,不是站点选择或开通授权;从该分流转为产品开通前,必须按当前根意图重新执行 `windows-entry`,取得适用于开通的分流事实。
|
|
5
|
+
|
|
4
6
|
Windows 的 READY/LEGACY 取根入口唯一分流,或 Windows 环境文档明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 停在环境恢复点,不进入本 flow。后续 runtime 命令追加当前有效的 `--windows-route`。READY 通过兼容层执行本 flow 原授权、查询、材料、写操作和收口;LEGACY 仅在不支持的平台映射或用户明确选站点时执行原站点引导。环境检查失败不修改业务状态、遥测开关或会话采集选择。业务调用前若返回非零及 `WINDOWS_BUSINESS_BLOCKED=ENVIRONMENT_UNAVAILABLE`,停止依赖该环境的动作,不重放写入;修复后按 Windows 环境文档有限复检,再按原只读查询核验实际状态。未知业务结果仍沿用原恢复规则。
|
|
5
7
|
|
|
6
8
|
> ⚠️ **前置声明**:本 flow 仅支持 **AI 网页应用收款、AI 移动应用收款、AI 按量付费**三种产品的产品开通。原有“网站支付”“APP 支付”“按量付费”仍作为输入别名和资源目录名。**其他产品(当面付、订单码支付、JSAPI支付、预授权支付、商家扣款等)暂不支持**,如需开通请前往[支付宝商家平台](https://b.alipay.com/page/portal/home)完成。
|
|
@@ -70,7 +70,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" telemetry resolve-sessi
|
|
|
70
70
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" windows-entry --root-intent "<ROOT_INTENT>" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
用户明确要求安装并通过 Skill 完成签约/开通或完整接入时(包括正式版保留的原任务与用户随后明确同意安装内测版的选择),当前任务已授权准备所需用户级依赖,附加 `--prepare-authorized true`;仅代码开发且未授权准备依赖时先只读检查。用户明确选择站点时才附加 `--site-selected true`。这不构成登录、签约或应用写入授权。只接受退出 0、唯一 `ALIPAY_AIPAY_INTERNAL:WINDOWS_ROUTE=<JSON>` 且 rootIntent 匹配、route 为 `READY|BLOCKED|LEGACY`。非零、缺失或冲突按 `BLOCKED` 停止,不推定站点分支。`BLOCKED` 须说明内部结果给出的实际缺项/失败原因和有限恢复动作;用户修好依赖后先只读复检,必要且获授权时才按环境文档继续准备。只有不支持的执行映射或用户明确选择站点才进入 `LEGACY
|
|
73
|
+
用户明确要求安装并通过 Skill 完成签约/开通或完整接入时(包括正式版保留的原任务与用户随后明确同意安装内测版的选择),当前任务已授权准备所需用户级依赖,附加 `--prepare-authorized true`;仅代码开发且未授权准备依赖时先只读检查。用户明确选择站点时才附加 `--site-selected true`。这不构成登录、签约或应用写入授权。只接受退出 0、唯一 `ALIPAY_AIPAY_INTERNAL:WINDOWS_ROUTE=<JSON>` 且 rootIntent 匹配、route 为 `READY|BLOCKED|LEGACY|CODE_ONLY`。非零、缺失或冲突按 `BLOCKED` 停止,不推定站点分支。`BLOCKED` 须说明内部结果给出的实际缺项/失败原因和有限恢复动作;用户修好依赖后先只读复检,必要且获授权时才按环境文档继续准备。只有不支持的执行映射或用户明确选择站点才进入 `LEGACY`。`integration_only` 入口因 Git Bash、jq、CLI 等可选工具缺失、不可运行或有限准备失败时,唯一分流可返回 `CODE_ONLY`:继续原生 Node 的独立开发分支,沙箱记 `VERIFY_PENDING`,不输出站点开通引导。Node 不足、架构探测未知、存储/ACL、状态异常及未知错误仍阻断,不由 Agent 自行降级。所有后续 Windows runtime 命令追加 `--windows-route "<READY|BLOCKED|LEGACY|CODE_ONLY>"`;`BLOCKED` 不进入业务 bootstrap/flow。仅修复后唯一、根意图匹配的 `WINDOWS_ROUTE=READY` 才更新分流事实;`READY` 的快速沙箱与本地开通使用原 flow,`LEGACY` 保留原独立开发/手工沙箱及站点开通分支。`CODE_ONLY` 仅绑定当前 `integration_only`;改为开通或完整接入前必须用新根意图重新执行 `windows-entry`,不得继承该分流。用户修好依赖或明确授权准备后,按 Windows 环境文档重新检查;未取得 READY 时继续独立开发,不循环安装。实际业务执行前仍复检能力。环境、沙箱准备或业务失败不修改采集选择、SESSION_ID、run_id、用户输入计数或阶段责任方。
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
`integration_only` 的 `integration-bootstrap` 在产品已唯一确定时必须携带 `--product-type`,并串行执行 `telemetry start-run` 与 `flow integration entry`;产品尚未唯一确定时省略产品且不创建正式 run,后续由 `integration-message start-confirm` 首次开 run并生成 `clarify_intent`。`onboarding_only` 的 `onboarding-bootstrap` 同理:产品已唯一时携带产品并先启动 run,尚未唯一时由 `mcc resolve-plan` 或 `onboarding-message plan-confirm` 首次启动。两者均为既有无业务写入动作,执行后不得重复原子命令。Windows READY 返回本地 entry 契约;Windows LEGACY 引导渲染依次使用现有平台项目 ID、正式 run_id;两者均不存在时使用已绑定 `SESSION_ID` 的稳定匿名哈希,不提前创建 run。非 Windows 返回 entry 契约。`full_process` 不使用 `integration-bootstrap`;衔接 Onboarding 也不使用带 `start-run` 的 bootstrap,仍执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message platform-entry --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"` 后按需加载 entry,避免重复 `clarify_intent`。
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"packageVersion":"1.7.6-beta.2","distTag":"beta"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"packageVersion":"1.7.6-beta.2","distTag":"beta"}
|