@alipay/alipay-aipay 1.6.6 → 1.6.7-beta
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/VERSION +1 -1
- package/skill/references/integration/flow.md +22 -20
- package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +8 -29
- package/skill/references/integration/modules/scripts/sandbox_config.sh +2 -0
- package/skill/references/normal/full-process-routing.md +13 -11
- package/skill/references/normal/integration-worker.md +79 -0
- package/skill/references/normal/scripts/alipay_cli_env.mjs +0 -3
- package/skill/references/normal/scripts/alipay_cli_env.sh +0 -4
- package/skill/references/normal/scripts/common.sh +11 -0
- package/skill/references/normal/scripts/flow_loader.mjs +0 -19
- package/skill/references/normal/scripts/integration_message_runner.mjs +26 -53
- package/skill/references/normal/scripts/interaction_reply.mjs +2 -2
- package/skill/references/normal/scripts/onboarding_discovery_runner.mjs +4 -1
- package/skill/references/normal/scripts/onboarding_message_runner.mjs +33 -23
- package/skill/references/normal/scripts/onboarding_recovery_runner.mjs +2 -2
- package/skill/references/normal/scripts/render_customer_message.mjs +3 -3
- package/skill/references/normal/scripts/runtime.mjs +5 -23
- package/skill/references/normal/scripts/telemetry.mjs +368 -434
- package/skill/references/normal/telemetry.md +3 -4
- package/skill/references/onboarding/flow.md +14 -14
- package/skill/references/onboarding/modules/scripts/app.sh +1 -0
- package/skill/references/onboarding/modules/scripts/ar_sign_apply.sh +3 -1
- package/skill/references/onboarding/modules/scripts/auth.sh +4 -1
- package/skill/references/onboarding/modules/scripts/service.sh +2 -0
- package/skill/references/runtime-entry.md +12 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alipay/alipay-aipay",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.7-beta",
|
|
4
4
|
"description": "支付宝 AI 付 Skill 安装包 - 优先安装 Agent Skill,并在 macOS/Linux 后台准备用户级 CLI 工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"dev": "tsc --watch",
|
|
17
17
|
"test": "node scripts/run-tests.mjs",
|
|
18
18
|
"test:windows-integration": "node --test test/windows-integration-contract.test.mjs test/integration-message-runner.test.mjs test/alipay-cli-env.test.mjs",
|
|
19
|
-
"prepublishOnly": "npm test && node scripts/validate-maintenance-alignment.mjs --release &&
|
|
19
|
+
"prepublishOnly": "npm test && node scripts/validate-maintenance-alignment.mjs --release && npm run build"
|
|
20
20
|
},
|
|
21
21
|
"keywords": [
|
|
22
22
|
"alipay",
|
package/skill/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.6.
|
|
1
|
+
1.6.7-beta
|
|
@@ -78,19 +78,19 @@
|
|
|
78
78
|
|
|
79
79
|
### 目标项目执行上下文
|
|
80
80
|
|
|
81
|
-
步骤 1 前先确定唯一项目根和服务端语言,所有项目检测、安装、写入、启动和校验都以该目录为 workdir。保留原始 `PROJECT_INPUT`;新项目含名称或位置时由 Agent 解析 `
|
|
81
|
+
步骤 1 前先确定唯一项目根和服务端语言,所有项目检测、安装、写入、启动和校验都以该目录为 workdir。保留原始 `PROJECT_INPUT`;新项目含名称或位置时由 Agent 解析 `PROJECT_PATH` 并显式传入,runner 只校验,不解析原话或把整句当目录;纯默认新建也先选安全路径。复用项目未知时先定位候选,“当前项目/当前目录”仅在 runner 识别为项目根时接受。所有路径经统一 runtime 的 `resolve-project`/`locate-projects` 取得规范化事实;Skill 自有文件仍从当前 Skill 目录读取。禁止改用方便的其他项目或把临时产物算作目标项目产物。
|
|
82
82
|
|
|
83
83
|
- `full_process`:步骤 1 前置准备先继承 `../normal/full-process-routing.md` 已选定的项目来源、规范化项目路径和服务端语言,此时代码开发启动方案尚未展示,不得要求目标产品或代码状态;产品确定、项目扫描并完成唯一方案展示后,进入步骤 2 时继承同一摘要中的目标产品、项目选择分类、目标产品集成状态、其他支付产品、语言和框架。两个阶段都不得重新猜测或静默改选项目。
|
|
84
84
|
- `integration_only`:优先从当前可访问业务项目确定根目录;当前目录不是可识别项目根、存在多个候选或用户要求其他/新项目时,先让用户选定并确认规范化路径,不得自行选择或扫描上层大目录。当前目录内已选定的现有项目分类为 `CURRENT_PROJECT`,用户指定的其他现有路径分类为 `OTHER_PROJECT`;本轮按下条规则初始化成功的新项目在完成步骤 1 后分类为 `PREPARED_NEW_PROJECT`。该分类只用于本轮检查器输入,不持久化。
|
|
85
85
|
- 已有项目:进入任何写操作前确认目标路径可读、在当前 Agent 权限范围内可写、包含可识别项目根标记,且仍对应用户选定的业务项目;需要环境文件权限时按当前权限机制申请,无法取得权限、路径失效或实际项目不符时停止,要求用户提供可访问路径或重新选择项目。完整保留项目结构、已有文件和其他支付能力,只对当前目标产品需要的位置做可审查的局部修改,禁止先删除文件再重建。
|
|
86
|
-
-
|
|
86
|
+
- 新项目:Agent 确定 `PROJECT_PATH`,`PROJECT_INPUT` 保留原话;runner 只调用 `prepare-new`,缺 `--project-path` 则未解析,禁止从原话猜测路径。默认新建由 Agent 选用户目录下 `alipay-aipay-projects/pay-demo`,非空占用则加安全后缀,并显式传入。仅退出码 0 且唯一 JSON 满足 `projectSelection/projectOrigin=NEW_PROJECT`、`projectOriginLabel=本轮新建项目`、`preparationStatus=READY` 才继续,并确认目标或最近父目录可写。路径非空、预检/权限失败时保留内容并改选空或不存在目录,禁止清空/覆盖。服务端语言缺失才补问;框架使用下方 runner。创建命令只来自用户指定、已有模板/项目或本轮已读官方文档,禁用覆盖选项和臆造脚手架。初始化并完成步骤 1 后转为 `PREPARED_NEW_PROJECT`,重入按现有项目重扫。
|
|
87
87
|
|
|
88
88
|
```bash
|
|
89
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --
|
|
89
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --project-path "$PROJECT_PATH" --base-path "$USER_WORKSPACE_ROOT" --intent new
|
|
90
90
|
```
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --base-path "$USER_WORKSPACE_ROOT" --intent
|
|
93
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --project-path "$PROJECT_PATH" --base-path "$USER_WORKSPACE_ROOT" --intent existing
|
|
94
94
|
```
|
|
95
95
|
- 项目准备失败时停留在步骤 1 前置准备,输出实际错误和待补条件;不得进入沙箱准备。目标项目准备成功后记录实际根目录,步骤 1、步骤 3 的沙箱配置和后续代码必须落入该项目;沙箱配置不得降级写入系统临时目录、Agent 原始工作目录或其他项目。
|
|
96
96
|
|
|
@@ -147,7 +147,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message loc
|
|
|
147
147
|
**执行规则**:
|
|
148
148
|
|
|
149
149
|
1. 只确认创建和保存沙箱所需的目标项目路径、服务端语言与操作系统;不得为了创建匿名沙箱先要求用户确定支付产品。缺少多个字段时使用“启动前上下文补问”的固定标准消息一次补齐;字段已能从用户输入和项目事实确定时,不发送环境、项目识别或准备进度消息。
|
|
150
|
-
2. Unix/macOS/Linux 从本 flow 目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env integration-check`;Windows
|
|
150
|
+
2. Unix/macOS/Linux 从本 flow 目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env integration-check`;Windows 执行同一命令。该入口在检查开始时记录环境检查事实,不单独上报 telemetry stage。Windows 只检查本 Integration Node runner 所需运行时,不要求 Bash、jq 或当前流程不会调用的 alipay-cli。唯一 `CLI_ENV:READY` 时继续且不读取完整安装文档。`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`;唯一 `ALIPAY_AIPAY_INTERNAL:JQ_PREPARE=READY` 后原样重跑 `env integration-check`。`FAILED|UNSUPPORTED`,或 `READY` 后复检仍缺 jq 时,由 Agent 按环境文档执行当前系统首选包管理器兜底并再次复检;macOS 必须从清华镜像开始,明确失败后才依次选择阿里云、中科大和直连,不并发、不回到 `prepare-jq` 循环。其他缺失项仍按当前系统分支补齐,完成后重跑检查;不得重复执行 `prepare-jq` 或新增业务确认点。其他输出、非 0 或 marker 冲突停在本步骤。
|
|
151
151
|
3. Unix/macOS/Linux 从本 flow 所在的 `references/integration/` 目录执行唯一准备入口:
|
|
152
152
|
|
|
153
153
|
```bash
|
|
@@ -195,15 +195,17 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message win
|
|
|
195
195
|
|
|
196
196
|
- `integration_only`:字段齐备后不得先输出产品判断、选择理由、待办、服务声明、执行进度或“即将确认”等内容。必须用步骤 1 确定的 `PROJECT_SELECTION` 对同一项目执行固定 runner,由 runner 内部完成检查器扫描、字段转换和 `integration.start.confirm` 渲染;项目来源、代码状态和其他支付产品不得由 Agent、用户描述或历史状态提供。下列 Node 单行命令在 Unix/macOS/Linux 与 Windows PowerShell 使用相同参数,必须执行:
|
|
197
197
|
|
|
198
|
+
`ROOT_INTENT` 取当前路线的根意图,只能是 `integration_only` 或 `full_process`。
|
|
199
|
+
|
|
198
200
|
```bash
|
|
199
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message start-confirm --product-type "$PRODUCT_TYPE" --product-name "$PRODUCT_NAME" --project-path "$PROJECT_PATH" --project-selection "$PROJECT_SELECTION" --language "$SERVER_LANGUAGE" --framework "$FRAMEWORK" --framework-source "$FRAMEWORK_SOURCE"
|
|
201
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message start-confirm --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE" --product-name "$PRODUCT_NAME" --project-path "$PROJECT_PATH" --project-selection "$PROJECT_SELECTION" --language "$SERVER_LANGUAGE" --framework "$FRAMEWORK" --framework-source "$FRAMEWORK_SOURCE"
|
|
200
202
|
```
|
|
201
203
|
|
|
202
204
|
runner 失败时不得展示手写方案或进入步骤 3。成功时必须取得唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=integration.start.confirm`;缺失或重复都视为失败。stdout 是步骤 2 唯一对客消息;命令后的下一个动作必须把 stdout 作为可见进行中消息原文送达,不得作为最终答复结束当前回合,送达前禁止调用工具。命令面板、折叠输出、内部思考或“已渲染/已展示”说明都不能替代交付;禁止添加 `<...>` 标签、“已输出完整方案”“服务声明已打印”、重复摘要或任何前后缀。送达后同一回合立即执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration development --product-type "$PRODUCT_TYPE"`,不得总结、询问、等待回复、解码内部值或再次渲染方案。
|
|
203
205
|
|
|
204
|
-
- `full_process`:`../normal/full-process-routing.md`
|
|
206
|
+
- `full_process`:`../normal/full-process-routing.md` 已用同一方案绑定检查器事实、产品、项目、语言/框架和服务声明;送达后按该路由选择唯一 Integration Worker 或当前 Agent 执行,禁止重显或确认。两者都须完成本 flow 全部适用接口、条件和 checklist。用户中断后事实变化则返回 router 重新澄清、扫描和展示。方案仍禁止提前展示 MCC、授权范围、开通材料或 onboarding 待办。
|
|
205
207
|
|
|
206
|
-
方案送达后只通过上述 development loader 进入步骤 3;loader
|
|
208
|
+
方案送达后只通过上述 development loader 进入步骤 3;loader 只继承 `clarify_intent` 已记录的正式 run 事实,不再单独记录开始态 stage。它不表示收到额外确认回复;不得另行执行 telemetry 命令或伪造用户回复。后续用户输入只按当前 active run 的 `user_input_after_clarify_intent` 计数,`summary` 收口后不再计入当前 run,方案本身不再单列计数。
|
|
207
209
|
|
|
208
210
|
**方案后的上下文锁定**:已有项目保持步骤 1 前已经唯一解析的实际根目录和原有工程结构;新项目必须已经在步骤 1 前按用户明确选择的方式完成初始化并通过构建标识检查。此处不重复准备、初始化或探测项目。路径内容与步骤 1 成功时不一致则停止并重新澄清;只有目标项目或服务端语言变化时返回步骤 1,其他情况直接进入步骤 3。
|
|
209
211
|
|
|
@@ -214,8 +216,8 @@ runner 失败时不得展示手写方案或进入步骤 3。成功时必须取
|
|
|
214
216
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_PREPARE:END -->
|
|
215
217
|
|
|
216
218
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_DEVELOPMENT:START -->
|
|
217
|
-
<!--
|
|
218
|
-
<!--
|
|
219
|
+
<!-- clarify_intent 已由 start-run 记录,这里不再单独上报开始态 stage -->
|
|
220
|
+
<!-- 前置阅读阶段不再单独上报 telemetry stage -->
|
|
219
221
|
### 步骤 3:沙箱配置复核
|
|
220
222
|
|
|
221
223
|
**任务**:步骤 1 已就绪时复核同一沙箱配置;步骤 1 已待配置时保持该状态并继续代码开发
|
|
@@ -291,12 +293,12 @@ curl -sL "<当前契约 sourceUrl 中的官方页面>"
|
|
|
291
293
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_DEVELOPMENT:END -->
|
|
292
294
|
|
|
293
295
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_IMPLEMENTATION:START -->
|
|
294
|
-
<!-- ALIPAY_AIPAY_STAGE:integration.
|
|
296
|
+
<!-- ALIPAY_AIPAY_STAGE:integration.complete_coding -->
|
|
295
297
|
### 步骤 5:代码生成
|
|
296
298
|
|
|
297
299
|
**任务**:根据用户选择的开发语言和产品,在已确认的目标项目根目录中生成集成代码
|
|
298
300
|
|
|
299
|
-
进入本 flow 的 `implementation`
|
|
301
|
+
进入本 flow 的 `implementation` 阶段时,不再单独记录开始态 stage;代码修改完成后由 `checklist-result` 统一记录 `integration.complete_coding`。该 stage 表示代码开发收口,不以最终结果是否存在 `blockingDefectState=PRESENT` 为前提;只有未进入最终收口的 `REPAIR_REQUIRED` 预览不记,不得另行执行 telemetry 命令。
|
|
300
302
|
|
|
301
303
|
**完成条件**:
|
|
302
304
|
- [INT.CODE.BASE_IMPLEMENTED] 已完成支付宝支付产品集成代码实现
|
|
@@ -316,9 +318,9 @@ curl -sL "<当前契约 sourceUrl 中的官方页面>"
|
|
|
316
318
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_IMPLEMENTATION:END -->
|
|
317
319
|
|
|
318
320
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_VERIFICATION:START -->
|
|
319
|
-
<!--
|
|
321
|
+
<!-- 配置后置校验不再单独上报开始态 stage -->
|
|
320
322
|
|
|
321
|
-
开始执行代码自检、语法/静态检查或支付配置后置校验前,进入本 flow 的 `verification`
|
|
323
|
+
开始执行代码自检、语法/静态检查或支付配置后置校验前,进入本 flow 的 `verification` 阶段;该阶段不再单独记录 telemetry 开始态,只由最终收口阶段记录结果。
|
|
322
324
|
|
|
323
325
|
**支付配置接入与后置校验**:`sandboxConfigState=READY` 时,Unix/macOS/Linux 快速沙箱由商家服务端代码使用当前语言的标准 JSON 解析器,在运行时读取步骤 1/3 已验证的 `.alipay-sandbox.json`,并从 `appIds[0]` 映射 `appId`、`alipayPublicKey` 和当前语言私钥字段;不得先用 `jq`、`cat` 或临时脚本把字段原文打印到工具输出、复制到源码或重复写入 `.env`。项目已有配置抽象时在其服务端加载边界接入该 JSON,不改变字段原值。Windows 从步骤 1 由 Agent 写入并校验的本机敏感配置读取。后置校验必须检查实际加载路径、字段选择、SDK 初始化和版本控制保护;Java 使用 `appPrivateKey`,其他四种语言使用 `appPrivatePkcsKey`。A2M 的 `seller_signature` 使用原生密码库时,只在调用边界按库要求解析密钥。失败时修正加载器或 SDK 配置,禁止猜测、转换格式或改写原始值。
|
|
324
326
|
|
|
@@ -368,12 +370,12 @@ Windows 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实际本机配置绝
|
|
|
368
370
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_VERIFICATION:END -->
|
|
369
371
|
|
|
370
372
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_ACCEPTANCE:START -->
|
|
371
|
-
<!--
|
|
373
|
+
<!-- 沙箱体验阶段不再单独上报开始态 stage -->
|
|
372
374
|
### 步骤 6:沙箱测试与体验(AI 按量付费、AI 网页应用收款)
|
|
373
375
|
|
|
374
376
|
> APP 支付跳过本步骤,直接进入步骤 7。按量付费和网站支付只有在 `sandboxConfigState=READY` 且配置后置校验通过时才执行本步骤;`CREATE_PENDING|VERIFY_PENDING` 时跳过全部沙箱依赖动作并进入步骤 7,不渲染 `a2m.test.*`、`a2m.payment.experience`、`webpay.sandbox.experience*` 或 `sandbox.android.client`。只有按量付费满足本步骤全部端到端完成条件时,才能对客输出“沙箱测试通过”或等价结论;网站支付和 APP 支付不得输出该结论。
|
|
375
377
|
|
|
376
|
-
进入本 flow 的 `acceptance`
|
|
378
|
+
进入本 flow 的 `acceptance` 阶段时,不再单独记录开始态 stage;适用沙箱联调或付款体验只在完成时由收口阶段记录结果。AI 移动应用收款不会记录该 stage。
|
|
377
379
|
|
|
378
380
|
<!-- ALIPAY_AIPAY_PRODUCT:webpay:START -->
|
|
379
381
|
#### AI 网页应用收款:提供人工沙箱付款指引
|
|
@@ -424,7 +426,7 @@ Windows 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实际本机配置绝
|
|
|
424
426
|
- [INT.A2M.DELIVERY_EVIDENCE] 已携带 `Payment-Proof` 重试原服务,并取得 HTTP 200、非空可归属资源、无明确业务失败和有效 `Payment-Validation` 的组合成功证据
|
|
425
427
|
- [INT.A2M.TEST_PASSED] 已确认 402 沙箱服务端联调流程通过
|
|
426
428
|
|
|
427
|
-
|
|
429
|
+
**测试前预检**:执行沙箱测试脚本前,只使用 `modules/sandbox/a2m-sandbox-test.md` 登记的固定 `runtime.mjs a2m precheck`,确认服务返回 HTTP 402,`Payment-Needed` 包含 `seller_signature` 等关键字段,且 `method.service_id` 等于 `api_mock_service_id`;禁止临时编写 Python、curl 管道或近似解析器。
|
|
428
430
|
|
|
429
431
|
**沙箱支付宝体验提醒**:服务端联调结论输出后,按 `modules/sandbox/a2m-sandbox-test.md` 向用户提供付款链接、沙箱买家账号和安卓客户端下载说明作为可选付款体验;该体验不新增阻塞确认点。
|
|
430
432
|
|
|
@@ -517,12 +519,12 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message saf
|
|
|
517
519
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_ACCEPTANCE:END -->
|
|
518
520
|
|
|
519
521
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_CHECKLIST:START -->
|
|
520
|
-
<!-- ALIPAY_AIPAY_STAGE:
|
|
522
|
+
<!-- ALIPAY_AIPAY_STAGE:integration_summary -->
|
|
521
523
|
### 步骤 8:代码开发校验
|
|
522
524
|
|
|
523
525
|
**完成条件**:已执行本阶段 bundle 附带的全部适用检查,并保留每项实际命令、文件检查或人工待验证依据;不得使用 Agent 自拟 attestation、空哈希或口头结论代替。
|
|
524
526
|
|
|
525
|
-
**自动执行规则**:步骤 7 完成后进入 `checklist`
|
|
527
|
+
**自动执行规则**:步骤 7 完成后进入 `checklist` 阶段;最终收口阶段统一记录 `integration_summary`,输出唯一 `ALIPAY_AIPAY_INTERNAL:CHECKLIST_SCOPE_RECEIPT=<receipt>`,并在本 bundle 末尾直接附带当前产品适用清单。该 scope receipt 仅绑定当前产品、路径与快照,防止错配或变更后沿用旧结论,不证明检查已执行。不得再单独读取整份 `modules/checklist.md`。默认只执行代码阅读、最终 runner 内固定 implementation audit、配置后置校验、语法/静态检查,以及无需安装依赖、联网或监听端口的已有定向测试,并复用步骤 5、步骤 6 已取得的校验证据,不增加“是否需要校验”的用户确认。
|
|
526
528
|
|
|
527
529
|
**执行边界**:默认禁止安装依赖或浏览器、切换运行时版本、启动长期服务、申请网络/端口权限、执行截图或 UI 自动化,也不得重复步骤 6 已完成的端到端测试。遇到 `EPERM`、网络受限、缺少浏览器等环境限制时,将对应项标记为“人工待验证”并停止扩展排查;不得据此推断代码或运行时兼容问题。只有用户明确要求继续扩展验证时,才展示拟执行动作并按原确认规则处理。
|
|
528
530
|
|
|
@@ -568,7 +570,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message che
|
|
|
568
570
|
```
|
|
569
571
|
<!-- ALIPAY_AIPAY_PRODUCT:END -->
|
|
570
572
|
|
|
571
|
-
|
|
573
|
+
用户输入计数只统计 `clarify_intent` 之后、当前 active run 内的用户输入。只有本地计数状态不可用且已重新核对时,才在 checklist 命令末尾追加 `--user-input-after-clarify-intent <count>`;runner 会拒绝明显不合理计数。
|
|
572
574
|
|
|
573
575
|
同一次代码开发流程只渲染一次最终 checklist 结果;renderer stdout 是本次默认收口的唯一对客正文,禁止在前后追加风险说明、通过项摘要、执行说明、衔接提醒或第二份待办。
|
|
574
576
|
|
|
@@ -22,40 +22,19 @@
|
|
|
22
22
|
|
|
23
23
|
## 测试前预检
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
执行沙箱测试脚本前,先用固定 `precheck` 解码服务返回的 `Payment-Needed` 并确认关键字段存在。`SERVICE_URL` 使用用户实际服务地址。所有平台统一执行当前 Skill 的受控入口;禁止临时编写 Python、curl 管道或近似解析器:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if status != "402":
|
|
34
|
-
raise SystemExit(f"HTTP 状态不是 402: {status or '未知'}")
|
|
35
|
-
value = next((line.split(":", 1)[1].strip().strip("\"") for line in headers if line.lower().startswith("payment-needed:")), "")
|
|
36
|
-
if not value:
|
|
37
|
-
raise SystemExit("未找到 Payment-Needed 响应头")
|
|
38
|
-
value += "=" * ((4 - len(value) % 4) % 4)
|
|
39
|
-
data = json.loads(base64.urlsafe_b64decode(value).decode())
|
|
40
|
-
required = [
|
|
41
|
-
("protocol", "out_trade_no"), ("protocol", "amount"), ("protocol", "currency"),
|
|
42
|
-
("protocol", "resource_id"), ("protocol", "pay_before"), ("protocol", "seller_signature"),
|
|
43
|
-
("protocol", "seller_sign_type"), ("protocol", "seller_unique_id"),
|
|
44
|
-
("method", "seller_name"), ("method", "seller_id"), ("method", "seller_app_id"),
|
|
45
|
-
("method", "goods_name"), ("method", "seller_unique_id_key"), ("method", "service_id"),
|
|
46
|
-
]
|
|
47
|
-
missing = [f"{path[0]}.{path[1]}" for path in required if not data.get(path[0], {}).get(path[1])]
|
|
48
|
-
if missing:
|
|
49
|
-
raise SystemExit("缺少字段: " + ", ".join(missing))
|
|
50
|
-
if data.get("method", {}).get("service_id") != "api_mock_service_id":
|
|
51
|
-
raise SystemExit("沙箱联调 method.service_id 必须为 api_mock_service_id")
|
|
52
|
-
print("Payment-Needed 预检通过,已确认 HTTP 402 和关键字段存在。")
|
|
53
|
-
print("已校验字段: " + ", ".join(f"{path[0]}.{path[1]}" for path in required))'
|
|
28
|
+
# GET
|
|
29
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m precheck --url "$SERVICE_URL" --method GET
|
|
30
|
+
|
|
31
|
+
# POST
|
|
32
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m precheck --url "$SERVICE_URL" --method POST --body "@$POST_BODY_FILE"
|
|
54
33
|
```
|
|
55
34
|
|
|
56
|
-
POST
|
|
35
|
+
POST body 必须来自已确认目标项目中的实际文件。`seller_signature` 由代码示例中的 `generateSellerSignature` / `generate_seller_signature` 生成,签名入参中的 `service_id` 与 `method.service_id` 都必须使用 `api_mock_service_id`;禁止使用空值、其他占位符或要求用户提供正式 `serviceId`。预检输出只打印校验结论和字段名,不打印字段值。
|
|
57
36
|
|
|
58
|
-
|
|
37
|
+
`precheck` 只请求本地服务并校验 HTTP 402/字段,不调用沙箱收银。Windows 也使用相同的 Node 单行入口,由启动器选择可用的 Python 3:
|
|
59
38
|
|
|
60
39
|
```powershell
|
|
61
40
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m precheck --url "$SERVICE_URL" --method GET
|
|
@@ -120,6 +120,7 @@ if [ "$MODE" = "ensure" ] || [ "$MODE" = "reverify" ]; then
|
|
|
120
120
|
emit_control_field "SANDBOX_ENSURE_ACTION" "$ENSURE_ACTION" || exit 1
|
|
121
121
|
emit_control_field "SANDBOX_CONFIG_PATH" "$CONFIG_PATH" || exit 1
|
|
122
122
|
emit_control "FLOW:SANDBOX_CONFIG_READY"
|
|
123
|
+
emit_stage_metric_async "integration.create_sandbox"
|
|
123
124
|
exit 0
|
|
124
125
|
fi
|
|
125
126
|
|
|
@@ -325,3 +326,4 @@ fi
|
|
|
325
326
|
|
|
326
327
|
emit_control_field "SANDBOX_CONFIG_PATH" "$CONFIG_PATH" || exit 1
|
|
327
328
|
emit_control "FLOW:SANDBOX_CONFIG_READY"
|
|
329
|
+
emit_stage_metric_async "integration.create_sandbox"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
目标项目和技术栈确定后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration entry`,只加载当前入口阶段并按步骤 1/2 准备及展示方案;代码开发满足衔接条件后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow onboarding entry`。禁止整读两个 flow。所有 Skill 自有运行时动作只用当前 Skill 绝对路径下的统一入口单命令执行,不前置 `cd`、不拼接管道;用户项目命令仍以已确认项目根为 workdir。
|
|
6
6
|
|
|
7
|
-
其他 Skill 相对命令以 `references/normal/` 为 workdir
|
|
7
|
+
其他 Skill 相对命令以 `references/normal/` 为 workdir。`PROJECT_INPUT` 保留原话;Agent 确定两类项目的真实 `PROJECT_PATH`,以 `--project-path` 交 runner 校验。复用须选定项目根,位置未知先定位候选;“当前目录”仅在 runner 识别为项目根时接受。后续只用规范化绝对路径。
|
|
8
8
|
|
|
9
9
|
## 边界
|
|
10
10
|
|
|
@@ -16,24 +16,24 @@
|
|
|
16
16
|
|
|
17
17
|
项目来源互斥:`CURRENT_PROJECT` 为当前目录内项目根,`OTHER_PROJECT` 为用户以绝对路径提供的目录外项目;未选定/不可访问/不可识别则为 `PROJECT_UNRESOLVED`,禁止凭描述生成状态。
|
|
18
18
|
|
|
19
|
-
`NEW_PROJECT`
|
|
19
|
+
`NEW_PROJECT` 只用于初始化前,新建时执行:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --
|
|
22
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --project-path "$PROJECT_PATH" --base-path "$USER_WORKSPACE_ROOT" --intent new
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
复用现有项目时执行:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --base-path "$USER_WORKSPACE_ROOT" --intent
|
|
28
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --project-path "$PROJECT_PATH" --base-path "$USER_WORKSPACE_ROOT" --intent existing
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
`--project-input` 不得代替真实路径;缺 `--project-path` 则未解析。默认新建由 Agent 选用户目录下 `alipay-aipay-projects/pay-demo`,非空占用则加安全后缀,并显式传入。仅 `preparationStatus=READY` 才继续;框架由 Integration 的 `framework-resolve` 按语言默认或用户明确值初始化,其他结果不得清空/覆盖。初始化且沙箱终态确定后成为本轮 `PREPARED_NEW_PROJECT`;不持久化,重入重扫。`NEW_PROJECT` 不扫描代码。
|
|
32
32
|
|
|
33
33
|
### 固定检查器与 runner 终态协议
|
|
34
34
|
|
|
35
35
|
- `resolve-project --intent new` 只接受退出码 0、唯一 JSON、绝对 `projectPath`、`projectSelection/projectOrigin=NEW_PROJECT`、`projectOriginLabel=本轮新建项目` 和 `preparationStatus=READY`;否则保持 `PROJECT_UNRESOLVED`。
|
|
36
|
-
- `resolve-project --intent existing` 只接受退出码 0、唯一 JSON、规范化绝对路径、`CURRENT_PROJECT|OTHER_PROJECT` 和 `EXISTING_PROJECT
|
|
36
|
+
- `resolve-project --intent existing` 只接受退出码 0、唯一 JSON、规范化绝对路径、`CURRENT_PROJECT|OTHER_PROJECT` 和 `EXISTING_PROJECT/现有项目`。两类真实路径均经 `--project-path` 传入;相对路径限 `--base-path` 内,目录外由用户提供绝对路径;失败不得以描述/cwd 代替。
|
|
37
37
|
- `locate-projects` 用于未知位置/多候选,缺省搜索词为 `当前目录`。stdout 是唯一候选消息;选择后仍执行 `resolve-project --intent existing`。
|
|
38
38
|
- `start-confirm` 内部只执行一次项目扫描,校验后将同一对象交给 renderer;失败为 `STATUS_UNKNOWN`。禁止改写命令、另跑扫描、抽取代码,或追加 `find`、`ls`、`stat`、额外 `jq` 和临时脚本复核同一结果。
|
|
39
39
|
|
|
@@ -54,7 +54,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message pro
|
|
|
54
54
|
|
|
55
55
|
## 完整接入启动方案
|
|
56
56
|
|
|
57
|
-
合法项目分类、前三种代码状态、产品、服务端语言和 runner 解析的框架全部确定后才能输出非阻塞 `integration.start.confirm`。缺项目或服务端语言时执行下列 `integration.context.required
|
|
57
|
+
合法项目分类、前三种代码状态、产品、服务端语言和 runner 解析的框架全部确定后才能输出非阻塞 `integration.start.confirm`。缺项目或服务端语言时执行下列 `integration.context.required` 标准消息;只缺新项目位置用 `integration.project_path.required` 标准消息,`启动前上下文补问` 只在这一步使用,且只补齐缺失项,只缺框架不补问。禁止使用 AskUserQuestion、request_user_input、宿主超时默认值、Agent 自创选项或自由话术替代;不得先输出扫描摘要或方案。
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
60
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message context-required --missing-items "$MISSING_ITEMS"
|
|
@@ -68,13 +68,15 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message loc
|
|
|
68
68
|
|
|
69
69
|
字段齐备后执行唯一 runner;禁止拆开执行项目扫描、`jq` 或 renderer,也不得附加解析。runner stdout 是本动作唯一对客消息;只有取得唯一 `CUSTOMER_MESSAGE_DELIVERY_REQUIRED=integration.start.confirm` 才能继续。命令后的下一个动作必须把 stdout 作为可见进行中消息原文送达,不得作为最终答复结束当前回合,送达前禁止调用工具;送达后同一回合立即进入 development loader,不得总结、询问、等待回复或再次校验项目快照。用户中断后若方案事实变化,重新澄清、扫描并输出当前方案;静态扫描只决定进入验证,不证明完成。
|
|
70
70
|
|
|
71
|
+
`ROOT_INTENT` 固定为 `full_process`。
|
|
72
|
+
|
|
71
73
|
```bash
|
|
72
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message start-confirm --product-type "$PRODUCT_TYPE" --product-name "$PRODUCT_NAME" --project-path "$PROJECT_PATH" --project-selection "$PROJECT_SELECTION" --language "$SERVER_LANGUAGE" --framework "$FRAMEWORK" --framework-source "$FRAMEWORK_SOURCE"
|
|
74
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message start-confirm --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE" --product-name "$PRODUCT_NAME" --project-path "$PROJECT_PATH" --project-selection "$PROJECT_SELECTION" --language "$SERVER_LANGUAGE" --framework "$FRAMEWORK" --framework-source "$FRAMEWORK_SOURCE"
|
|
73
75
|
```
|
|
74
76
|
|
|
75
77
|
上面命令失败时不得展示手写确认或进入子流程。成功时必须取得唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=integration.start.confirm`;缺失或重复视为失败。参数必须是当前确定值,禁止直接拼用户输入。runner 校验产品 variant 并固定服务声明;实际范围仍取当前 Integration flow 和 checklist。
|
|
76
78
|
|
|
77
|
-
|
|
79
|
+
交接事实必须来自 runner 内同一次 `scan`,不得用描述、自报或历史分类代替;`evidence` 不进 renderer,Onboarding 前不传/猜 `mccCode`。方案 stdout 按 marker 送达后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration development --product-type "$PRODUCT_TYPE"`;支持 Worker 的宿主由唯一 Worker 完成步骤 3 至步骤 8,不支持 Worker 的宿主仍由当前 Agent 串行完成步骤 3 至步骤 8。loader 仍记录兼容 stage 和预开发阅读 stage;禁止手工 telemetry、解码内部值、重复扫描或重显方案。
|
|
78
80
|
|
|
79
81
|
合法组合必须确定产品、路径/来源、代码状态、语言/框架、服务声明和顺序;发现其他产品时保留。零散信息、`新建` 选择、未选候选或新项目未准备均不能替代完整机器校验。方案送达后仍完整执行 Integration 和 checklist。
|
|
80
82
|
|
|
@@ -82,7 +84,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message sta
|
|
|
82
84
|
|
|
83
85
|
- 启动方案送达后直接进入 Integration 步骤 3;用户中断后若项目、产品、语言或框架变化,重新澄清和扫描并输出当前方案。
|
|
84
86
|
- Integration 先完整执行和校验。只有沙箱待配置,或 READY 且仅剩非阻塞人工待验证项时,保持“部分通过”进入 Onboarding;其他代码、安全或依据缺口停在 Integration,不提前登录或收集开通材料。
|
|
85
|
-
-
|
|
87
|
+
- 阶段间只复用有效的产品、Integration 结果、沙箱状态、人工待验证项和剩余待办,不再询问是否进入 Onboarding;Onboarding 只保留非阻塞方案展示。
|
|
86
88
|
- 授权后分别查询签约、应用和适用服务;分支独立,单分支失败不回滚其他成功,认证/授权不匹配或主体变化全局阻断。一次只收集一个类别,提前材料直接校验且不重复索取。
|
|
87
89
|
- 签约材料通过后直接提交;服务创建摘要后直创、修改仍确认;空应用候选材料完整或非空候选明确新建,重查未变即创建,以用户公钥生成官方确认页,校验成功后直接提审。均不增加额外确认点;按量付费沙箱测试仍属 Integration 默认动作。
|
|
88
90
|
- 当前终点汇总代码、沙箱、签约、服务、应用和待办;人工待验证项带入 Onboarding Step 6,不增加确认。有待生效/审核/验证或配置缺口时不得宣称生产就绪。
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Integration Worker
|
|
2
|
+
|
|
3
|
+
本文件仅在 `full_process` 的 `integration.start.confirm` 可见送达后、Agent 加载 development 前的唯一 Worker 转移点读取。Integration Worker 是 Agent 创建的子 Agent,负责 Unix/macOS/Linux 下步骤 3 至步骤 8 的完整 Integration 上下文隔离执行,不是第二套业务流程或状态机;原 `integration/flow.md`、产品契约、脚本和 checklist 仍是唯一执行依据。`integration_only` 保持原 Agent 串行路径,不读本文件。
|
|
4
|
+
|
|
5
|
+
## 启用条件与唯一调用
|
|
6
|
+
|
|
7
|
+
只有同时满足以下条件时才启用 Worker:
|
|
8
|
+
|
|
9
|
+
1. 当前宿主支持创建子 Agent 并可靠等待其终态;
|
|
10
|
+
2. 当前系统为 Unix、macOS 或 Linux;
|
|
11
|
+
3. 本轮根意图为 `full_process`。
|
|
12
|
+
|
|
13
|
+
任一条件不满足时不得试探、模拟或后台放任 Worker,Agent 在方案送达后串行执行步骤 3 至步骤 8。
|
|
14
|
+
|
|
15
|
+
启用后只创建一个 Integration Worker。Agent 不得创建其他子 Agent,Integration Worker 也不得创建子 Agent。Agent 必须等待同一 Worker 到终态;等待期间不得读取项目、执行 Integration、进入 Onboarding 或结束当前任务。
|
|
16
|
+
|
|
17
|
+
## 固定请求与输入
|
|
18
|
+
|
|
19
|
+
Agent 发给 Integration Worker 的任务正文只允许由下列一句固定说明和一个输入 JSON 组成:
|
|
20
|
+
|
|
21
|
+
> 完整读取 `<skill_dir>/references/normal/integration-worker.md` 并严格执行;不创建其他子 Agent,最终只返回该文件定义的单个 JSON 对象。
|
|
22
|
+
|
|
23
|
+
输入 JSON 只包含下列已由启动方案前置准备和 runner 确定的字段:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"skill_dir": "<SKILL_DIR>",
|
|
28
|
+
"product_type": "<aipay|webpay|apppay>",
|
|
29
|
+
"project_path": "<规范化绝对路径>",
|
|
30
|
+
"server_language": "<Java|Python|Node.js|C#|PHP>",
|
|
31
|
+
"framework": "<已确定框架>",
|
|
32
|
+
"sandbox_config_state": "<READY|CREATE_PENDING|VERIFY_PENDING>"
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Agent 不得复制、摘录或改写本文件的执行协议,不得在请求中手写任何 `runtime.mjs`、sandbox、verification、acceptance、audit 或 checklist 命令。禁止把完整对话、`integration.start.confirm` stdout、runner evidence、Agent 分析、源码或补丁、完整命令日志、沙箱文件内容、私钥、密码、临时 URL 或此前工具输出复制到 Worker 请求。`skill_dir` 必须是启动器确定的当前 Skill 规范化绝对路径;`sandbox_config_state` 必须是步骤 1 实际取得并在步骤 2 保持有效的终态枚举,不得包含配置内容。
|
|
37
|
+
|
|
38
|
+
调用提交成功后,Integration 执行权立即且不可逆地转移给该 Worker。Agent 不得因等待、返回格式或 Worker 失败重新取回本轮 Integration 执行权。
|
|
39
|
+
|
|
40
|
+
## 执行边界
|
|
41
|
+
|
|
42
|
+
Integration Worker 使用输入事实执行下列原 flow 入口:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration development --product-type "$PRODUCT_TYPE"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
随后严格按照该入口加载的原 `integration/flow.md`,从步骤 3 对步骤 1 的实际沙箱终态进行复核或保持待配置状态,再完整执行步骤 4 至步骤 8。阶段读取、命令、沙箱状态、代码实现、verification、acceptance、checklist 和失败转移都只以原 flow 为准;本文件不另行定义或覆盖业务流程。
|
|
49
|
+
|
|
50
|
+
Integration Worker 不执行 Onboarding、self-update、`telemetry start-run`、产品/项目重新决策或原 flow 之外的沙箱调用和诊断。不得用 Worker 自报代替原 flow 要求的实际脚本终态和校验证据。
|
|
51
|
+
|
|
52
|
+
原 flow 要求对客送达的登记 runner/script stdout 都要进入交接对象。Worker 以 flow、消息目录和 runner 契约为准收集这些对客 stdout:既包括带有 `CUSTOMER_MESSAGE_DELIVERY_REQUIRED` marker 的交付屏障,也包括未带 marker 但被定义为唯一对客正文的消息;按发生顺序剔除 `ALIPAY_AIPAY_INTERNAL:` 行后保存到 `customer_messages`。过程 stdout、分析、命令和日志不得进入交接对象。登记正文不改写、不总结;空正文不加入。沙箱账号只允许存在于原始登记正文中,不得拆出、复述或进入其他字段。返回结果只依据最终 checklist 的实际证据;只有原 flow 允许衔接时 `next_phase=ONBOARDING`,其他情况为 `STOP`。
|
|
53
|
+
|
|
54
|
+
## 返回协议
|
|
55
|
+
|
|
56
|
+
最终回复仅包含一个 JSON 对象,不附加 Markdown 代码围栏、源码、补丁、日志或说明:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"protocol": "INTEGRATION_WORKER_V1",
|
|
61
|
+
"integration_result": "已完成|部分完成,沙箱配置待完成|部分完成,人工待验证|未通过",
|
|
62
|
+
"sandbox_config_state": "READY|CREATE_PENDING|VERIFY_PENDING",
|
|
63
|
+
"manual_verification_items": ["不含敏感值的受控单行项"],
|
|
64
|
+
"remaining_actions": ["不含敏感值的确定下一步"],
|
|
65
|
+
"customer_messages": ["登记 runner/script 的完整原始正文"],
|
|
66
|
+
"next_phase": "ONBOARDING|STOP"
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
对应关系固定:
|
|
71
|
+
|
|
72
|
+
- checklist 全部通过且沙箱 `READY`:`已完成`、`ONBOARDING`;
|
|
73
|
+
- 只有沙箱待配置且无其他阻断:`部分完成,沙箱配置待完成`、`ONBOARDING`;
|
|
74
|
+
- 沙箱 `READY` 且只剩原 flow 允许的非阻塞人工项:`部分完成,人工待验证`、`ONBOARDING`;
|
|
75
|
+
- 其他代码、安全、必要依据或协议缺口:`未通过`、`STOP`。
|
|
76
|
+
|
|
77
|
+
上述七个字段都由 Integration Worker 根据原 flow 的实际结果生成。`protocol` 必须精确为 `INTEGRATION_WORKER_V1`,返回对象只允许包含这七个字段。`sandbox_config_state` 必须复用输入后按步骤 3 实际复核得到的终态,不接受 `null` 或字符串 `"null"`。`manual_verification_items` 和 `remaining_actions` 只保留最终 checklist 已证实的短项;没有时传空数组。禁止返回项目路径、语言、框架、changed files、依赖列表、源码、收据、绝对路径、配置字段或 Worker 分析。Agent 只做一次结构校验,不解释、修复、补充、改写或追问 Worker 返回。校验通过后,按数组顺序把 `customer_messages` 每一项原文作为可见消息送达,不加旁白;然后丢弃该数组。`next_phase=ONBOARDING` 时只把产品、`integration_result`、`sandbox_config_state`、`manual_verification_items` 和 `remaining_actions` 带入独立 Onboarding;不读取项目、不复查 Worker、不重跑 Integration。`protocol`、`customer_messages` 和 `next_phase` 不带入 Onboarding。`next_phase=STOP` 时在送达登记正文后停止,不进入 Onboarding。
|
|
78
|
+
|
|
79
|
+
Worker 明确失败、超时、返回非单一 JSON、字段非法或门禁矛盾时,本轮 Integration 立即停止。Agent 只报告“Integration Worker 交接失败,本轮已停止以避免重复执行”,不创建第二个 Agent,不追问 Worker,不读取项目,不执行任何 `flow integration`、`sandbox`、`a2m`、verification、acceptance、audit 或 checklist 命令,不进入 Onboarding。即使 Worker 文本中包含可猜测的沙箱状态,也不得由 Agent 补跑或重新展示 `integration.start.confirm`。
|
|
@@ -5,7 +5,6 @@ import path from 'node:path';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
|
|
7
7
|
import { checkCliEnvironment, isWindowsPlatform } from './platform_compat.mjs';
|
|
8
|
-
import { emitStageMetricAsync } from './telemetry.mjs';
|
|
9
8
|
|
|
10
9
|
export function runAlipayCliEnvCli(argv = process.argv) {
|
|
11
10
|
const mode = argv[2];
|
|
@@ -15,8 +14,6 @@ export function runAlipayCliEnvCli(argv = process.argv) {
|
|
|
15
14
|
return;
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
if (mode === 'integration-check') emitStageMetricAsync('integration.env_prepare.start');
|
|
19
|
-
|
|
20
17
|
const windows = isWindowsPlatform();
|
|
21
18
|
const missing = checkCliEnvironment({
|
|
22
19
|
requireJq: !windows,
|
|
@@ -180,6 +180,16 @@ init_dev_tool_name() {
|
|
|
180
180
|
export DEV_TOOL_NAME="${DEV_TOOL_NAME:-unknown}"
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
init_root_intent_context() {
|
|
184
|
+
local candidate="${ALIPAY_AIPAY_ROOT_INTENT:-${ROOT_INTENT:-}}"
|
|
185
|
+
case "$candidate" in
|
|
186
|
+
integration_only|onboarding_only|full_process)
|
|
187
|
+
ALIPAY_AIPAY_ROOT_INTENT="$candidate"
|
|
188
|
+
export ALIPAY_AIPAY_ROOT_INTENT
|
|
189
|
+
;;
|
|
190
|
+
esac
|
|
191
|
+
}
|
|
192
|
+
|
|
183
193
|
platform_project_id() {
|
|
184
194
|
local candidate
|
|
185
195
|
|
|
@@ -285,6 +295,7 @@ machine_user_id_for_biz_info() {
|
|
|
285
295
|
|
|
286
296
|
init_alipay_cli_context() {
|
|
287
297
|
init_dev_tool_name
|
|
298
|
+
init_root_intent_context
|
|
288
299
|
init_platform_id
|
|
289
300
|
init_alipay_cli_biz_info || return 1
|
|
290
301
|
export PLATFORM="${DEV_TOOL_NAME:-unknown}"
|
|
@@ -7,7 +7,6 @@ import { fileURLToPath } from 'node:url';
|
|
|
7
7
|
|
|
8
8
|
import { checklistForProduct } from './checklist_sections.mjs';
|
|
9
9
|
import { createChecklistScopeReceipt } from './integration_message_runner.mjs';
|
|
10
|
-
import { emitStageMetricAsync, markTelemetryFlowStart } from './telemetry.mjs';
|
|
11
10
|
|
|
12
11
|
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
|
13
12
|
const referencesDir = path.resolve(scriptDir, '../..');
|
|
@@ -118,17 +117,6 @@ function filterProductSections(source, productType) {
|
|
|
118
117
|
return filtered;
|
|
119
118
|
}
|
|
120
119
|
|
|
121
|
-
function stageDeclarations(block, productType) {
|
|
122
|
-
const stages = [];
|
|
123
|
-
const pattern = /<!-- ALIPAY_AIPAY_STAGE:([a-z0-9._-]+)(?: products=([a-z,]+))? -->/gu;
|
|
124
|
-
for (const match of block.matchAll(pattern)) {
|
|
125
|
-
const products = match[2]?.split(',') || null;
|
|
126
|
-
if (products?.some((product) => !productTypes.has(product))) throw new Error('flow telemetry 产品声明非法');
|
|
127
|
-
if (!products || !productType || products.includes(productType)) stages.push(match[1]);
|
|
128
|
-
}
|
|
129
|
-
return stages;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
120
|
function cleanDirectives(block, productType, sharedGuard) {
|
|
133
121
|
return filterProductSections(block, productType)
|
|
134
122
|
.replace(/<!-- GENERATED:([A-Z0-9-]+):START -->([\s\S]*?)<!-- GENERATED:\1:END -->/gu,
|
|
@@ -236,13 +224,6 @@ export function runFlowCli(argv = process.argv) {
|
|
|
236
224
|
process.stderr.write(`ALIPAY_AIPAY_INTERNAL:CHECKLIST_SCOPE_RECEIPT=${createChecklistScopeReceipt(productType, projectPath)}\n`);
|
|
237
225
|
}
|
|
238
226
|
const source = flowSource(flow);
|
|
239
|
-
const phaseBlock = extractFlowBlock(source, phaseBlockName(flow, phase));
|
|
240
|
-
for (const stage of stageDeclarations(phaseBlock, productType)) {
|
|
241
|
-
emitStageMetricAsync(stage, { productType });
|
|
242
|
-
if (stage === 'integration.user_confirmed' || stage === 'onboarding.user_confirmed') {
|
|
243
|
-
markTelemetryFlowStart(process.env, Date.now(), productType);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
227
|
process.stdout.write(`${loadFlowBundle(flow, phase, { productType })}\n`);
|
|
247
228
|
}
|
|
248
229
|
|