@alipay/alipay-aipay 1.5.6 → 1.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/utils/jq.js CHANGED
@@ -1,226 +1,117 @@
1
+ import { execFile } from 'child_process';
2
+ import fs from 'fs';
3
+ import os from 'os';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { promisify } from 'util';
1
7
  import chalk from 'chalk';
2
- import { execCommand, execInteractive } from './shell.js';
3
- // ============================================================
4
- // 国内 Bottle 镜像源(只用于加速二进制包下载)
5
- // formula 索引走 brew 默认的 formulae.brew.sh,不设 API_DOMAIN
6
- // ============================================================
7
- const BREW_BOTTLE_MIRRORS = [
8
- { name: '清华', domain: 'https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles' },
9
- { name: '阿里云', domain: 'https://mirrors.aliyun.com/homebrew-bottles' },
10
- { name: '中科大', domain: 'https://mirrors.ustc.edu.cn/homebrew-bottles' },
11
- ];
8
+ const execFileAsync = promisify(execFile);
9
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
10
+ const packageRoot = path.resolve(moduleDir, '../..');
11
+ const manifestPath = path.join(packageRoot, 'skill', 'references', 'normal', 'json', 'managed-jq-assets.json');
12
+ const installerPath = path.join(packageRoot, 'skill', 'references', 'normal', 'scripts', 'managed_jq.mjs');
13
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
14
+ if (manifest.schemaVersion !== 1 || !/^\d+\.\d+\.\d+$/.test(manifest.version)) {
15
+ throw new Error('managed jq 资产清单非法');
16
+ }
17
+ export const MANAGED_JQ_VERSION = manifest.version;
18
+ export const MANAGED_JQ_DOWNLOAD_TIMEOUT_MS = manifest.downloadTimeoutMs;
12
19
  function formatErrorTail(error) {
13
20
  const message = error instanceof Error ? error.message : String(error);
14
- return message
15
- .split('\n')
16
- .map((line) => line.trimEnd())
17
- .filter((line) => line.length > 0)
18
- .slice(-6)
19
- .join('\n');
20
- }
21
- /**
22
- * 生成 brew install jq 命令
23
- *
24
- * 关键环境变量说明:
25
- * - HOMEBREW_BOTTLE_DOMAIN: bottle(二进制包)下载走国内镜像
26
- * - HOMEBREW_NO_AUTO_UPDATE=1: 跳过 brew update
27
- * - HOMEBREW_NO_INSTALL_CLEANUP=1: 安装后不自动清理旧版本
28
- * - 不设 HOMEBREW_API_DOMAIN: 让 formula 索引走 brew 默认 API,避免镜像索引不完整
29
- */
30
- function buildBrewInstallCommand(bottleDomain) {
31
- return [
32
- `export HOMEBREW_BOTTLE_DOMAIN="${bottleDomain}"`,
33
- 'export HOMEBREW_NO_AUTO_UPDATE=1',
34
- 'export HOMEBREW_NO_INSTALL_CLEANUP=1',
35
- 'yes | brew install jq',
36
- ].join(' && ');
21
+ return message.split('\n').map((line) => line.trimEnd()).filter(Boolean).slice(-4).join('\n');
37
22
  }
38
- /**
39
- * 检测 Linux 包管理器
40
- */
41
- async function detectLinuxPackageManager() {
42
- try {
43
- await execCommand('which apt-get 2>/dev/null', 3000);
44
- return 'apt';
23
+ function managedHomeDir() {
24
+ const home = process.env.HOME || os.homedir();
25
+ if (!path.isAbsolute(home) || path.resolve(home) === path.parse(home).root) {
26
+ throw new Error('无法确定安全的用户 Home 目录');
45
27
  }
46
- catch {
47
- // ignore
28
+ return path.resolve(home);
29
+ }
30
+ export function managedJqPath(homeDir = managedHomeDir()) {
31
+ if (!path.isAbsolute(homeDir) || path.resolve(homeDir) === path.parse(homeDir).root) {
32
+ throw new Error('jq 用户安装目录必须位于绝对 Home 路径下');
48
33
  }
34
+ return path.join(path.resolve(homeDir), '.local', 'bin', 'jq');
35
+ }
36
+ export function resolveManagedJqAsset(platform = process.platform, arch = process.arch) {
37
+ const asset = manifest.assets[`${platform}-${arch}`];
38
+ return asset ? { ...asset, version: manifest.version } : null;
39
+ }
40
+ export function isJqRequiredPlatform(platform = process.platform) {
41
+ return platform !== 'win32';
42
+ }
43
+ async function checkJqAtPath(jqPath) {
49
44
  try {
50
- await execCommand('which yum 2>/dev/null', 3000);
51
- return 'yum';
45
+ const [{ stdout }, { stdout: smokeOutput }] = await Promise.all([
46
+ execFileAsync(jqPath, ['--version'], {
47
+ encoding: 'utf8', timeout: 5000, windowsHide: true,
48
+ }),
49
+ execFileAsync(jqPath, ['-n', '-c', '--arg', 'value', 'ok', '{value:$value}'], { encoding: 'utf8', timeout: 5000, windowsHide: true }),
50
+ ]);
51
+ const version = String(stdout).trim().replace(/^jq-/, '');
52
+ if (String(smokeOutput).trim() !== '{"value":"ok"}')
53
+ return { name: 'jq', installed: false };
54
+ return { name: 'jq', installed: true, version: version || 'unknown', path: jqPath };
52
55
  }
53
56
  catch {
54
- // ignore
57
+ return { name: 'jq', installed: false };
55
58
  }
56
- return 'unknown';
57
59
  }
58
- /**
59
- * 检查 jq 是否已安装
60
- */
61
60
  export async function checkJq() {
61
+ const pathCheck = await checkJqAtPath('jq');
62
+ if (pathCheck.installed)
63
+ return pathCheck;
62
64
  try {
63
- const { stdout } = await execCommand('jq --version', 5000);
64
- const version = stdout.trim().replace(/^jq-/, '');
65
- let jqPath = '';
66
- try {
67
- const { stdout: whichOut } = await execCommand('which jq', 3000);
68
- jqPath = whichOut.trim();
69
- }
70
- catch {
71
- // ignore
72
- }
73
- return {
74
- name: 'jq',
75
- installed: true,
76
- version: version || 'unknown',
77
- path: jqPath || undefined,
78
- };
65
+ return await checkJqAtPath(managedJqPath());
79
66
  }
80
67
  catch {
81
68
  return { name: 'jq', installed: false };
82
69
  }
83
70
  }
84
- /**
85
- * macOS 安装 jq:遍历镜像源自动重试
86
- */
87
- async function installJqMacos() {
88
- try {
89
- await execCommand('which brew', 3000);
90
- }
91
- catch {
92
- console.log(chalk.red(' ✗ 未检测到 Homebrew,无法自动安装 jq'));
93
- console.log(chalk.gray(' 请先安装 Homebrew,或手动安装 jq: brew install jq'));
71
+ /** 复用发布 Skill 内的固定安装器,不调用 Homebrew、apt、yum 或 sudo。 */
72
+ export async function installJq() {
73
+ const asset = resolveManagedJqAsset();
74
+ if (!asset) {
75
+ console.log(chalk.yellow(` ○ 当前平台暂不支持自动准备用户级 jq: ${process.platform}/${process.arch}`));
94
76
  return false;
95
77
  }
96
- console.log(chalk.cyan(' ⏳ 使用 Homebrew 安装 jq...\n'));
97
- // 依次尝试每个镜像源
98
- for (let i = 0; i < BREW_BOTTLE_MIRRORS.length; i++) {
99
- const mirror = BREW_BOTTLE_MIRRORS[i];
100
- const command = buildBrewInstallCommand(mirror.domain);
101
- if (!process.stdin.isTTY) {
102
- console.log(chalk.gray(` [${i + 1}/${BREW_BOTTLE_MIRRORS.length}] 使用${mirror.name}镜像源...`));
103
- }
104
- try {
105
- await execInteractive(command, 120000);
106
- const verify = await checkJq();
107
- if (verify.installed) {
108
- console.log(chalk.green(` ✓ jq 安装成功 (${verify.version})`));
109
- return true;
110
- }
111
- }
112
- catch (error) {
113
- if (!process.stdin.isTTY) {
114
- const detail = formatErrorTail(error);
115
- if (detail)
116
- console.log(chalk.gray(` 失败原因: ${detail}\n`));
117
- }
118
- }
119
- if (i < BREW_BOTTLE_MIRRORS.length - 1) {
120
- console.log(chalk.yellow(` ⚠ ${mirror.name}镜像源失败,尝试下一个...\n`));
121
- }
122
- }
123
- // 所有镜像源都失败,最后一次尝试:不用任何镜像,裸装
124
- console.log(chalk.gray(' [兜底] 不使用镜像源,直连安装...'));
78
+ let targetPath;
125
79
  try {
126
- await execInteractive('export HOMEBREW_NO_AUTO_UPDATE=1 && export HOMEBREW_NO_INSTALL_CLEANUP=1 && yes | brew install jq', 180000);
127
- const verify = await checkJq();
128
- if (verify.installed) {
129
- console.log(chalk.green(` ✓ jq 安装成功 (${verify.version})`));
130
- return true;
131
- }
80
+ targetPath = managedJqPath();
132
81
  }
133
82
  catch (error) {
134
- if (!process.stdin.isTTY) {
135
- const detail = formatErrorTail(error);
136
- if (detail)
137
- console.log(chalk.gray(` 失败原因: ${detail}\n`));
138
- }
139
- }
140
- console.log(chalk.red(' ✗ jq 自动安装失败'));
141
- console.log(chalk.gray(' 请手动在终端执行:'));
142
- console.log(chalk.cyan(' brew install jq'));
143
- console.log(chalk.gray(' 如果下载慢,设置 bottle 镜像后重试:'));
144
- console.log(chalk.cyan(' export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"'));
145
- console.log(chalk.cyan(' export HOMEBREW_NO_AUTO_UPDATE=1'));
146
- console.log(chalk.cyan(' brew install jq'));
147
- return false;
148
- }
149
- /**
150
- * Linux 安装 jq
151
- */
152
- async function installJqLinux() {
153
- const pkgManager = await detectLinuxPackageManager();
154
- let command;
155
- if (pkgManager === 'apt') {
156
- command = 'sudo apt-get update -qq && sudo apt-get install -y jq';
157
- }
158
- else if (pkgManager === 'yum') {
159
- command = 'sudo yum install -y jq';
160
- }
161
- else {
162
- console.log(chalk.red(' ✗ 无法识别的 Linux 包管理器'));
163
- console.log(chalk.gray(' 请手动安装 jq:'));
164
- console.log(chalk.gray(' apt: sudo apt install -y jq'));
165
- console.log(chalk.gray(' yum: sudo yum install -y jq'));
83
+ console.log(chalk.yellow(` ○ 无法准备用户级 jq: ${formatErrorTail(error)}`));
166
84
  return false;
167
85
  }
168
- console.log(chalk.cyan(' ⏳ 安装 jq(可能需要输入 sudo 密码)...\n'));
86
+ console.log(chalk.cyan(` ⏳ 下载官方 jq ${MANAGED_JQ_VERSION} 到 ${targetPath}(无需 sudo)...`));
169
87
  try {
170
- await execInteractive(command, 300000);
171
- const verify = await checkJq();
172
- if (verify.installed) {
173
- console.log(chalk.green(` ✓ jq 安装成功 (${verify.version})`));
174
- return true;
175
- }
176
- console.log(chalk.yellow(' ⚠ jq 安装命令已执行,但验证失败'));
177
- return false;
88
+ await execFileAsync(process.execPath, [installerPath, 'prepare'], {
89
+ encoding: 'utf8',
90
+ timeout: MANAGED_JQ_DOWNLOAD_TIMEOUT_MS + 15000,
91
+ windowsHide: true,
92
+ maxBuffer: 64 * 1024,
93
+ });
94
+ const check = await checkJqAtPath(targetPath);
95
+ if (!check.installed || check.version !== MANAGED_JQ_VERSION)
96
+ throw new Error('jq 安装后验证失败');
97
+ console.log(chalk.green(` ✓ jq 已安装到用户目录 (${check.version})`));
98
+ return true;
178
99
  }
179
100
  catch (error) {
180
- console.log(chalk.red(' ✗ jq 安装失败'));
101
+ console.log(chalk.yellow(' ○ jq 用户级后台准备未完成,Skill 文件安装不受影响'));
181
102
  const detail = formatErrorTail(error);
182
103
  if (detail)
183
- console.log(chalk.gray(` 失败原因: ${detail}`));
184
- console.log(chalk.gray(' 请手动安装:'));
185
- console.log(chalk.cyan(` ${pkgManager === 'apt' ? 'sudo apt install -y jq' : 'sudo yum install -y jq'}`));
186
- return false;
187
- }
188
- }
189
- /**
190
- * 安装 jq
191
- */
192
- export async function installJq() {
193
- const platform = process.platform;
194
- if (platform === 'darwin') {
195
- return await installJqMacos();
196
- }
197
- else if (platform === 'linux') {
198
- return await installJqLinux();
199
- }
200
- else if (platform === 'win32') {
201
- console.log(chalk.red(' ✗ Windows 暂不自动安装 jq'));
202
- console.log(chalk.gray(' 请手动安装 jq 后重新打开终端:'));
203
- console.log(chalk.cyan(' winget install jqlang.jq'));
204
- console.log(chalk.gray(' 如未安装 winget,也可使用 Chocolatey:'));
205
- console.log(chalk.cyan(' choco install jq'));
206
- return false;
207
- }
208
- else {
209
- console.log(chalk.red(` ✗ 不支持的操作系统: ${platform}`));
210
- console.log(chalk.gray(' 请手动安装 jq'));
104
+ console.log(chalk.gray(` 原因: ${detail}`));
211
105
  return false;
212
106
  }
213
107
  }
214
- /**
215
- * 确保 jq 已安装,未安装则自动安装
216
- */
217
108
  export async function ensureJq() {
218
109
  const check = await checkJq();
219
110
  if (check.installed) {
220
111
  console.log(chalk.green(` ✓ jq 已安装 (${check.version})`));
221
112
  return true;
222
113
  }
223
- console.log(chalk.yellow(' ⚠ jq 未安装,正在自动安装...'));
224
- return await installJq();
114
+ console.log(chalk.yellow(' ○ jq 未安装,开始用户级后台准备...'));
115
+ return installJq();
225
116
  }
226
117
  //# sourceMappingURL=jq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jq.js","sourceRoot":"","sources":["../../src/utils/jq.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jq.js","sourceRoot":"","sources":["../../src/utils/jq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;AAC/G,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAgB3G,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAsB,CAAC;AACxF,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9E,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC;AACnD,MAAM,CAAC,MAAM,8BAA8B,GAAG,QAAQ,CAAC,iBAAiB,CAAC;AAEzE,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,cAAc,EAAE;IACtD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,WAA4B,OAAO,CAAC,QAAQ,EAC5C,IAAI,GAAG,OAAO,CAAC,IAAI;IAEnB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAA4B,OAAO,CAAC,QAAQ;IAC/E,OAAO,QAAQ,KAAK,OAAO,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9D,aAAa,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;gBACnC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI;aACnD,CAAC;YACF,aAAa,CACX,MAAM,EACN,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,EACtD,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CACvD;SACF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,KAAK,gBAAgB;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7F,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,SAAS,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAE1C,IAAI,CAAC;QACH,OAAO,MAAM,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,aAAa,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,kBAAkB,MAAM,UAAU,cAAc,CAAC,CAAC,CAAC;IACzF,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE;YAChE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,8BAA8B,GAAG,KAAM;YAChD,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI;SACrB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,KAAK,GAAG,MAAM,OAAO,EAAE,CAAC;IAC9B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACrD,OAAO,SAAS,EAAE,CAAC;AACrB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@alipay/alipay-aipay",
3
- "version": "1.5.6",
4
- "description": "支付宝 AI 付 Skill 安装包 - 安装 Agent Skill,并检测/后台准备 alipay-cli;jq 可通过 --with-jq 尝试准备",
3
+ "version": "1.5.7",
4
+ "description": "支付宝 AI 付 Skill 安装包 - 优先安装 Agent Skill,并在 macOS/Linux 后台准备用户级 CLI 工具",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "alipay-aipay": "bin/alipay-aipay.js"
package/skill/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.6
1
+ 1.5.7
@@ -90,18 +90,30 @@
90
90
  - `full_process`:步骤 1 前置准备先继承 `../normal/full-process-routing.md` 已选定的项目来源、规范化项目路径和服务端语言,此时代码开发启动方案尚未展示,不得要求目标产品或代码状态;产品确定、项目扫描并完成唯一方案展示后,进入步骤 2 时继承同一摘要中的目标产品、项目选择分类、目标产品集成状态、其他支付产品、语言和框架。两个阶段都不得重新猜测或静默改选项目。
91
91
  - `integration_only`:优先从当前可访问业务项目确定根目录;当前目录不是可识别项目根、存在多个候选或用户要求其他/新项目时,先让用户选定并确认规范化路径,不得自行选择或扫描上层大目录。当前目录内已选定的现有项目分类为 `CURRENT_PROJECT`,用户指定的其他现有路径分类为 `OTHER_PROJECT`;本轮按下条规则初始化成功的新项目在完成步骤 1 后分类为 `PREPARED_NEW_PROJECT`。该分类只用于本轮检查器输入,不持久化。
92
92
  - 已有项目:进入任何写操作前确认目标路径可读、在当前 Agent 权限范围内可写、包含可识别项目根标记,且仍对应用户选定的业务项目;需要环境文件权限时按当前权限机制申请,无法取得权限、路径失效或实际项目不符时停止,要求用户提供可访问路径或重新选择项目。完整保留项目结构、已有文件和其他支付能力,只对当前目标产品需要的位置做可审查的局部修改,禁止先删除文件再重建。
93
- - 新项目:用户可以说明“在当前目录新建 pay-demo”、当前目录下的新子目录名、绝对路径,或只说“新建/新建项目/帮我新建默认项目”。目标路径必须先从本 flow 所在目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --base-path "$USER_WORKSPACE_ROOT" --intent new`;该 runner 内部调用固定检查器 `prepare-new`。用户明确要新建但未指定地址时,runner 默认选择用户目录下的 `alipay-aipay-projects/pay-demo`;若已被非空目录占用,则自动选择安全后缀,不清空或覆盖。只有退出码 0 且唯一 JSON 同时满足 `projectSelection=NEW_PROJECT`、`projectOrigin=NEW_PROJECT`、`projectOriginLabel=本轮新建项目`、`preparationStatus=READY`,才能继续确认目标路径或其最近已有父目录在当前 Agent 权限范围内可写。路径非空、预检失败或无法取得写权限时停止,保留其中全部内容,让用户改选明确的空子目录、空同级目录、默认项目或其他尚不存在或为空的目录,禁止清空、覆盖或把该目录强行当作新项目。步骤 1 前只确认创建项目必需的技术栈,不要求用户先确定支付产品;收到针对当前路径和技术栈的明确回复后,才能按确认方式创建目录和初始化项目。创建命令只能来自用户指定方式、可访问模板/项目中的既有命令或本轮已读取的官方文档,且不得使用 `--force` 等覆盖既有文件的选项;禁止凭记忆编造脚手架、依赖或默认工程结构。初始化并完成步骤 1 后,当前会话分类单向转为 `PREPARED_NEW_PROJECT`;重新进入时只按现有项目重新分类,不读取历史状态。
93
+ - 新项目:用户可以说明“在当前目录新建 pay-demo”、当前目录下的新子目录名、绝对路径,或只说“新建/新建项目/帮我新建默认项目”。目标路径必须先从本 flow 所在目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --base-path "$USER_WORKSPACE_ROOT" --intent new`;该 runner 内部调用固定检查器 `prepare-new`。用户明确要新建但未指定地址时,runner 默认选择用户目录下的 `alipay-aipay-projects/pay-demo`;若已被非空目录占用,则自动选择安全后缀,不清空或覆盖。只有退出码 0 且唯一 JSON 同时满足 `projectSelection=NEW_PROJECT`、`projectOrigin=NEW_PROJECT`、`projectOriginLabel=本轮新建项目`、`preparationStatus=READY`,才能继续确认目标路径或其最近已有父目录在当前 Agent 权限范围内可写。路径非空、预检失败或无法取得写权限时停止,保留其中全部内容,让用户改选明确的空子目录、空同级目录、默认项目或其他尚不存在或为空的目录,禁止清空、覆盖或把该目录强行当作新项目。步骤 1 前只要求创建项目必需的服务端语言;用户未指定框架时使用下方 runner 固定默认,不再追问。创建命令只能来自用户指定方式、可访问模板/项目中的既有命令或本轮已读取的官方文档,且不得使用 `--force` 等覆盖既有文件的选项;禁止凭记忆编造脚手架、依赖或默认工程结构。初始化并完成步骤 1 后,当前会话分类单向转为 `PREPARED_NEW_PROJECT`;重新进入时只按现有项目重新分类,不读取历史状态。
94
94
  - 项目准备失败时停留在步骤 1 前置准备,输出实际错误和待补条件;不得进入沙箱准备。目标项目准备成功后记录实际根目录,步骤 1、步骤 3 的沙箱配置和后续代码必须落入该项目;沙箱配置不得降级写入系统临时目录、Agent 原始工作目录或其他项目。
95
95
 
96
96
  **项目选择保护规则**:当前目录已包含项目时,只能让用户选择“保留并在该项目新增目标支付能力”“保留并在指定的新子目录创建独立项目”或“保留并使用指定的其他路径”,不得展示清空或删除选项。用户明确要求“新建/创建”项目、网站、商城、应用或同类新产物时,必须保留完整原始表达并执行 `resolve-project --intent new`;当前目录中恰好已有项目不能把该意图改写为 `--intent existing`。用户未指定地址时走用户目录默认项目规则并返回规范化地址,不得反复要求用户补绝对路径。对 `full_process`,此时必须留在或返回 `../normal/full-process-routing.md` 主编排,取得 `NEW_PROJECT` 的规范化路径、技术栈和初始化结果前不得进入子流程;对 `integration_only`,取得可安全创建的新项目路径前不得进入沙箱准备或代码开发。取得并确认尚不存在或为空的精确路径前不得执行文件操作。
97
97
 
98
- **启动前上下文补问**:缺少项目位置或技术栈时,必须从本 flow 所在目录执行下列标准消息,一次补齐;只缺少新项目精确位置时仍使用上方 `integration.project_path.required`。禁止使用 AskUserQuestion、request_user_input、宿主超时默认值、Agent 自创选项或自由话术替代;用户未明确补齐前不得创建目录、初始化项目、安装依赖或修改文件。
98
+ **启动前上下文补问**:缺少项目位置或服务端语言时,必须从本 flow 所在目录执行下列标准消息,一次补齐;只缺少新项目精确位置时仍使用上方 `integration.project_path.required`。框架缺失本身不触发补问。禁止使用 AskUserQuestion、request_user_input、宿主超时默认值、Agent 自创选项或自由话术替代;用户未明确补齐前不得创建目录、初始化项目、安装依赖或修改文件。
99
99
 
100
100
  ```bash
101
101
  node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message context-required --missing-items "$MISSING_ITEMS"
102
102
  ```
103
103
 
104
- `MISSING_ITEMS` 只允许由 `项目路径`、`技术栈` 按缺失项用顿号连接生成。产品不明确时使用 `product.clarify`,不得混入本消息。该消息必须把 stdout 原文作为当前回复正文发给用户,发出后立即停止并等待用户自由回复;用户回复后重新计算缺失项,不得靠超时或默认值推进。用户回复“当前项目”、相对路径或新建子目录时,先执行 `resolve-project` 得到规范化绝对路径和 `projectSelection`,再进入后续检查器、沙箱准备和启动方案展示;相对路径必须位于 `--base-path` 内,目录外项目必须由用户提供绝对路径。
104
+ `MISSING_ITEMS` 只允许由 `项目路径`、`技术栈` 按缺失项用顿号连接生成,其中 `技术栈` 只在服务端语言无法确定时缺失,不因框架未知而出现。产品不明确时使用 `product.clarify`,不得混入本消息。该消息必须把 stdout 原文作为当前回复正文发给用户,发出后立即停止并等待用户自由回复;用户回复后重新计算缺失项,不得靠超时或默认值推进。用户回复“当前项目”、相对路径或新建子目录时,先执行 `resolve-project` 得到规范化绝对路径和 `projectSelection`,再进入后续检查器、沙箱准备和启动方案展示;相对路径必须位于 `--base-path` 内,目录外项目必须由用户提供绝对路径。
105
+
106
+ 项目路径与服务端语言确定后,初始化新项目或展示方案前必须执行一次框架解析。用户未明确框架时使用第一条;用户明确指定 Django、NestJS 等框架时使用第二条并以用户值优先:
107
+
108
+ ```bash
109
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message framework-resolve --project-selection "$PROJECT_SELECTION" --project-path "$PROJECT_PATH" --language "$SERVER_LANGUAGE"
110
+ ```
111
+
112
+ ```bash
113
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message framework-resolve --project-selection "$PROJECT_SELECTION" --project-path "$PROJECT_PATH" --language "$SERVER_LANGUAGE" --framework "$USER_FRAMEWORK"
114
+ ```
115
+
116
+ 只接受退出码 0 和唯一 JSON 中规范化后的 `language`、非空 `framework`、合法 `frameworkSource=EXPLICIT|DEFAULT_NEW_PROJECT|PROJECT_INFERRED|PROJECT_STRUCTURE_FALLBACK`;该 JSON 是内部机器事实,不对客展示。`NEW_PROJECT|PREPARED_NEW_PROJECT` 默认固定为 Java / Spring Boot、PHP / Laravel、Python / FastAPI、C# / ASP.NET Core、Node.js / Express。`CURRENT_PROJECT|OTHER_PROJECT` 先从当前项目依赖标记推导;无法推导时固定为 `沿用现有项目结构`,表示不迁移现有框架,不阻止继续。得到的 `FRAMEWORK` 和 `FRAMEWORK_SOURCE` 必须贯穿项目初始化和同一次 `start-confirm`,不得由 Agent 二次猜测或改写;`start-confirm` 会复核非 `EXPLICIT` 来源仍与当前项目事实一致。
105
117
 
106
118
  用户回复“不知道项目在哪”“帮我找项目”、提供子目录但该目录不是项目根,或当前目录解析失败且需要候选时,从本 flow 所在目录执行下列轻量定位命令。`SEARCH_INPUT` 取用户给出的搜索范围;未给出时固定为 `当前目录`。该命令只查找项目标记文件并跳过常见重目录,不扫描源码内容;stdout 是本动作唯一对客消息,发出后立即停止并等待用户选择候选序号、具体目录或新建目录。用户选择候选后,仍必须再执行 `resolve-project --intent existing` 取得规范化绝对路径;候选列表不能直接替代项目确认。
107
119
 
@@ -134,7 +146,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message loc
134
146
  **执行规则**:
135
147
 
136
148
  1. 只确认创建和保存沙箱所需的目标项目路径、服务端语言与操作系统;不得为了创建匿名沙箱先要求用户确定支付产品。缺少多个字段时使用“启动前上下文补问”的固定标准消息一次补齐;字段已能从用户输入和项目事实确定时,不发送环境、项目识别或准备进度消息。
137
- 2. Unix/macOS/Linux 从本 flow 目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env integration-check`;Windows 执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env integration-check`。该入口在检查开始时自动记录 `integration.env_prepare.start`。Windows 只检查本 Integration Node runner 所需运行时,不要求 Bash、jq 或当前流程不会调用的 alipay-cli。唯一 `CLI_ENV:READY` 时继续且不读取完整安装文档;`CLI_ENV:NEEDS_SETUP` 时才读取 `../normal/alipay-cli-env.md` 并按当前系统分支补齐后重跑;其他输出、非 0 或 marker 冲突停在本步骤。
149
+ 2. Unix/macOS/Linux 从本 flow 目录执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env integration-check`;Windows 执行同一命令。该入口在检查开始时自动记录 `integration.env_prepare.start`。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 冲突停在本步骤。
138
150
  3. Unix/macOS/Linux 从本 flow 所在的 `references/integration/` 目录执行唯一准备入口:
139
151
 
140
152
  ```bash
@@ -177,12 +189,12 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message win
177
189
  | APP、移动应用支付、手机 APP、iOS、Android、鸿蒙 | AI 移动应用收款 |
178
190
  | 模糊场景 | 引用 modules/product-decision.md 进行澄清 |
179
191
 
180
- **阻塞规则(执行约束,不是对客正文)**:步骤 2 只在必要时用当前标准消息补问仍无法可靠确定的产品或技术栈;产品不明确用 `product.clarify`,技术栈不明确用 `integration.context.required`;不得重复询问步骤 1 已确认的项目路径和服务端语言。
192
+ **阻塞规则(执行约束,不是对客正文)**:步骤 2 只在必要时用当前标准消息补问仍无法可靠确定的产品、项目路径或服务端语言;产品不明确用 `product.clarify`,项目路径或服务端语言不明确用 `integration.context.required`。框架由已登记 runner 解析,不因框架未知追问;不得重复询问步骤 1 已确认的项目路径和服务端语言。
181
193
 
182
194
  - `integration_only`:字段齐备后不得先输出产品判断、选择理由、待办、服务声明、执行进度或“即将确认”等内容。必须用步骤 1 确定的 `PROJECT_SELECTION` 对同一项目执行固定 runner,由 runner 内部完成检查器扫描、字段转换和 `integration.start.confirm` 渲染;项目来源、代码状态和其他支付产品不得由 Agent、用户描述或历史状态提供。下列 Node 单行命令在 Unix/macOS/Linux 与 Windows PowerShell 使用相同参数,必须执行:
183
195
 
184
196
  ```bash
185
- 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"
197
+ 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"
186
198
  ```
187
199
 
188
200
  runner 失败时不得展示手写方案或进入步骤 3。成功时必须同时取得唯一 `ALIPAY_AIPAY_INTERNAL:PROJECT_CONFIRM_RECEIPT=<receipt>`;缺失、重复或不可解析都视为失败。stdout 是步骤 2 唯一对客消息;Agent 必须把 stdout 原文作为非阻塞消息发给用户,不能用命令面板里的 stdout、折叠输出或“已渲染/已展示”说明替代。禁止添加 `<...>` 标签、“已输出完整方案”“服务声明已打印”、重复摘要或任何前后缀。发送后不停止、不等待回复,立即执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration development --product-type "$PRODUCT_TYPE" --project-confirm-receipt "$PROJECT_CONFIRM_RECEIPT"`。loader 返回 `PROJECT_CONFIRMATION=VALID` 才能进入步骤 3;返回 `STALE` 时 stdout 已重新渲染当前标准方案并给出新 receipt,必须原文发送后使用新 receipt 立即重试一次;连续变化说明项目事实不稳定,停在步骤 2 核对,不要求用户输入确认口令。
@@ -192,17 +192,19 @@ ensure_config_permissions() {
192
192
  validate_data() {
193
193
  local data="$1"
194
194
  echo "$data" | jq -e --arg language "$LANGUAGE" '
195
- (.appIds|type)=="array" and (.appIds|length)>0 and .appIds[0] as $app |
196
- ($app.appId|type)=="string" and ($app.appId|length)>0 and
197
- ($app.alipayPublicKey|type)=="string" and ($app.alipayPublicKey|length)>0 and
198
- ($app.appPublicKey|type)=="string" and ($app.appPublicKey|length)>0 and
199
- (if $language=="Java" then ($app.appPrivateKey|type)=="string" and ($app.appPrivateKey|length)>0
200
- else ($app.appPrivatePkcsKey|type)=="string" and ($app.appPrivatePkcsKey|length)>0 end) and
201
- (.sandboxAccounts.partner.userId|type)=="string" and (.sandboxAccounts.partner.userId|length)>0 and
202
- (.sandboxAccounts.user.userId|type)=="string" and (.sandboxAccounts.user.userId|length)>0 and
203
- (.sandboxAccounts.user.email|type)=="string" and (.sandboxAccounts.user.email|length)>0 and
204
- (.sandboxAccounts.user.logonPassword|type)=="string" and (.sandboxAccounts.user.logonPassword|length)>0 and
205
- (.sandboxAccounts.user.payPassword|type)=="string" and (.sandboxAccounts.user.payPassword|length)>0
195
+ (.appIds|type)=="array" and (.appIds|length)>0 and
196
+ (.appIds[0] as $app |
197
+ ($app.appId|type)=="string" and ($app.appId|length)>0 and
198
+ ($app.alipayPublicKey|type)=="string" and ($app.alipayPublicKey|length)>0 and
199
+ ($app.appPublicKey|type)=="string" and ($app.appPublicKey|length)>0 and
200
+ (if $language=="Java" then ($app.appPrivateKey|type)=="string" and ($app.appPrivateKey|length)>0
201
+ else ($app.appPrivatePkcsKey|type)=="string" and ($app.appPrivatePkcsKey|length)>0 end) and
202
+ (.sandboxAccounts.partner.userId|type)=="string" and (.sandboxAccounts.partner.userId|length)>0 and
203
+ (.sandboxAccounts.user.userId|type)=="string" and (.sandboxAccounts.user.userId|length)>0 and
204
+ (.sandboxAccounts.user.email|type)=="string" and (.sandboxAccounts.user.email|length)>0 and
205
+ (.sandboxAccounts.user.logonPassword|type)=="string" and (.sandboxAccounts.user.logonPassword|length)>0 and
206
+ (.sandboxAccounts.user.payPassword|type)=="string" and (.sandboxAccounts.user.payPassword|length)>0
207
+ )
206
208
  ' >/dev/null 2>&1
207
209
  }
208
210
 
@@ -49,7 +49,7 @@ which alipay-cli 2>/dev/null && alipay-cli version
49
49
 
50
50
  ---
51
51
 
52
- ## 3. 前置依赖:GPG 与 jq
52
+ ## 3. 前置依赖:GPG 与用户级 jq
53
53
 
54
54
  `npx -y @alipay/alipay-aipay@latest install` 会优先保障 `alipay-cli` 可用;如果 `alipay-cli` 已安装或可直接安装成功,不需要额外安装 GPG。
55
55
 
@@ -79,31 +79,33 @@ which gpg 2>/dev/null
79
79
  > 可替换的 bottle 镜像源:清华 `https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles`、阿里云 `https://mirrors.aliyun.com/homebrew-bottles`、中科大 `https://mirrors.ustc.edu.cn/homebrew-bottles`。
80
80
  > 不要额外设置 `HOMEBREW_API_DOMAIN`;formula 索引保持使用 Homebrew 默认 API,避免镜像索引不完整导致安装失败。
81
81
 
82
- 签约脚本和 Unix/macOS/Linux 快速沙箱脚本需要 jq 解析 JSON,先检查:
82
+ 签约与 Unix/macOS/Linux 快速沙箱仍需 jq,手工验证命令为:
83
+
83
84
  ```bash
84
85
  jq --version
85
86
  ```
86
87
 
87
- 未安装时先安装 jq:
88
+ 自动检测与恢复顺序固定如下:
88
89
 
89
- | 操作系统 | 安装命令 |
90
- |----------|----------|
91
- | macOS | `brew install jq` |
92
- | Linux (Debian/Ubuntu) | `sudo apt-get install -y jq` |
93
- | Linux (CentOS/RHEL) | `sudo yum install -y jq` |
90
+ 1. `env check|integration-check` 先使用 PATH 中已有且能通过实际 filter 的 jq;受控 Shell 发现可执行的 `~/.local/bin/jq` 时把该目录追加到 PATH,因此有效系统 jq 仍优先。若 PATH 前方 jq 能启动但无法执行实际 filter,而用户级 jq 验证通过,则当前受控 Shell 改用用户级 jq,避免恢复后仍被损坏的 PATH 项遮蔽。
91
+ 2. 缺 jq 时,当前 flow 只执行一次 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env prepare-jq`。该动作需要访问 GitHub,并需要对 `~/.local/bin` 创建、写入和 rename;宿主支持权限申请时,只为同一条受控命令取得这些权限,不新增业务确认。
92
+ 3. macOS/Linux `x64|arm64` 只从固定官方 GitHub 资产下载 jq 1.7.1,在 60 秒总预算内校验固定 SHA-256,并于私有临时文件验证精确版本和实际 JSON filter 后,以 `0755` 原子写入 `~/.local/bin/jq`。成功后原样重跑环境检查。
93
+ 4. `JQ_PREPARE=FAILED|UNSUPPORTED`,或返回 `READY` 后重跑环境检查仍缺 jq,表示 GitHub 下载、校验、执行或落盘链路未使 jq 可用。此时由 Agent 执行一个当前系统首选包管理器兜底:macOS 优先清华 Homebrew bottle 镜像,Debian/Ubuntu 使用 apt,CentOS/RHEL 使用 yum;执行后必须同时通过 `jq --version` 和环境检查的实际 filter 验证。macOS 首选镜像明确失败后,才按阿里云、中科大、直连顺序选择下一条,不并发、不回到 `prepare-jq` 循环。Linux 包管理器可能需要宿主系统权限,该权限只属于兜底安装,不改变 Skill 用户目录写入边界,也不构成业务确认。
94
94
 
95
- > ⚠️ macOS 如遇下载慢,可与 GPG 使用同一套 Homebrew bottle 下载源配置。默认 `install` 只检测 jq;执行 `install --with-jq` 且本机缺少 jq 时,后台准备任务按“清华 → 阿里云 → 中科大 → 直连”重试。
96
- >
97
- > 手动执行时可任选一个镜像源,例如清华:
98
- > ```bash
99
- > export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
100
- > export HOMEBREW_NO_AUTO_UPDATE=1
101
- > export HOMEBREW_NO_INSTALL_CLEANUP=1
102
- > brew install jq
103
- > ```
104
- > 可替换镜像同上;不要额外设置 `HOMEBREW_API_DOMAIN`。
95
+ 首次 `npx ... install` 与 Skill 环境恢复复用同一个资产清单和安装器。首次安装缺 jq 时只启动 detached 后台任务,不等待下载结果;失败会清理探测/临时文件,不阻塞 Skill、不写系统目录、不请求 sudo。其他架构不自动下载,`--with-jq` 仅兼容旧命令。
96
+
97
+ 以下是 GitHub 用户级安装失败后的 Agent/手工兜底命令;首次 `npx ... install` 和 detached 后台任务不得自动调用:
98
+
99
+ | 系统/来源 | 完整命令 |
100
+ |---|---|
101
+ | macOS 清华 bottle(首选) | `env HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles" HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install jq` |
102
+ | macOS 阿里云 bottle | `env HOMEBREW_BOTTLE_DOMAIN="https://mirrors.aliyun.com/homebrew-bottles" HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install jq` |
103
+ | macOS 中科大 bottle | `env HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles" HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install jq` |
104
+ | macOS 直连(最后) | `env HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install jq` |
105
+ | Linux (Debian/Ubuntu) | `sudo apt-get update && sudo apt-get install -y jq` |
106
+ | Linux (CentOS/RHEL) | `sudo yum install -y jq` |
105
107
 
106
- Windows Integration 代码开发路径通过 Node runner 完成项目解析、项目扫描和标准消息渲染,只要求当前 Node 运行时,不把 Bash、jq 或该路径不会调用的 alipay-cli 作为 Step 1 阻断项;进入产品开通或执行既有 shell/CLI 脚本时仍按对应 flow 补齐依赖。Unix/macOS/Linux 和 Onboarding 的既有检查边界不变。
108
+ Windows Integration 的 Node runner 路径只要求 Node,不以 Bash、jq 或 alipay-cli 阻断 Step 1;进入产品开通或既有 shell/CLI 脚本时仍按 flow 补齐依赖。其他系统和 Onboarding 的检查边界不变。
107
109
 
108
110
  ---
109
111
 
@@ -194,7 +196,7 @@ AI 工具由 `scripts/detect_dev_tool.sh` 检测;`init_alipay_cli_context` 设
194
196
  │ ↓ │
195
197
  │ 验证安装结果并检查 ~/.local/bin 是否在 PATH 中
196
198
  │ ↓
197
- │ 检测 jq ─────┼──无→ 默认提示;install --with-jq 时后台尝试安装
199
+ │ 检测 jq ─────┼──无→ macOS/Linux 默认无 sudo 后台准备到 ~/.local/bin;Windows 跳过
198
200
  ↓
199
201
  继续下一步
200
202
  ```
@@ -9,7 +9,7 @@
9
9
  ## 边界
10
10
 
11
11
  - 只编排 Integration 与 Onboarding,不复制其状态、完成条件和红线。完整接入复用 Integration 步骤 2 的唯一非阻塞 `integration.start.confirm`、同一检查器事实和模板,本轮只渲染一次。
12
- - 先确定项目、语言和创建方式。`NEW_PROJECT` 空路径检查后初始化最小骨架,再执行 Integration 步骤 1;沙箱不依赖产品、不传 `PRODUCT`、不展示摘要,待配置仍继续。代码开发方案送达前禁止读取/展示 MCC、授权范围和开通材料/待办。
12
+ - 先确定项目、服务端语言和创建方式;框架按 Integration 登记的 `framework-resolve` 解析,不把框架未知当作补问条件。`NEW_PROJECT` 空路径检查后使用该 runner 默认或用户明确框架初始化最小骨架,再执行 Integration 步骤 1;沙箱不依赖产品、不传 `PRODUCT`、不展示摘要,待配置仍继续。代码开发方案送达前禁止读取/展示 MCC、授权范围和开通材料/待办。
13
13
  - 项目事实只来自 runner 与实际文件。未知位置用 `locate-projects --search-input "$SEARCH_INPUT" --format message` 查标记并等待选择;不得扫描上层大目录。完整性仍以 Integration 全部适用项和 checklist 为准。
14
14
 
15
15
  ## 新项目准备与路由分类
@@ -22,7 +22,7 @@
22
22
  node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message resolve-project --project-input "$PROJECT_INPUT" --base-path "$USER_WORKSPACE_ROOT" --intent new
23
23
  ```
24
24
 
25
- 未指定位置时使用用户目录下 `alipay-aipay-projects/pay-demo`,非空占用则加安全后缀。只有 `preparationStatus=READY` 才初始化;其他结果不得清空/覆盖。初始化且沙箱终态确定后单向成为当前会话的 `PREPARED_NEW_PROJECT`;不持久化,重入重扫。`NEW_PROJECT` 不扫描代码,`PREPARED_NEW_PROJECT` 不恢复为空目录状态。
25
+ 未指定位置时使用用户目录下 `alipay-aipay-projects/pay-demo`,非空占用则加安全后缀。只有 `preparationStatus=READY` 才继续;服务端语言已知且用户未指定框架时,先执行 Integration flow 登记的 `framework-resolve`,按 Java / Spring Boot、PHP / Laravel、Python / FastAPI、C# / ASP.NET Core、Node.js / Express 的固定默认初始化,用户明确框架时优先使用其值;其他结果不得清空/覆盖。初始化且沙箱终态确定后单向成为当前会话的 `PREPARED_NEW_PROJECT`;不持久化,重入重扫。`NEW_PROJECT` 不扫描代码,`PREPARED_NEW_PROJECT` 不恢复为空目录状态。
26
26
 
27
27
  ### 固定检查器与 runner 终态协议
28
28
 
@@ -48,13 +48,13 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message pro
48
48
 
49
49
  ## 完整接入启动方案
50
50
 
51
- 合法项目分类、前三种代码状态、产品、语言和框架全部确定后才能输出非阻塞 `integration.start.confirm`。缺项目/技术栈时执行下列 `integration.context.required`;只缺新项目位置用 `integration.project_path.required`。禁止使用 AskUserQuestion、request_user_input、宿主超时默认值、Agent 自创选项或自由话术替代;不得先输出扫描摘要或方案。
51
+ 合法项目分类、前三种代码状态、产品、服务端语言和 runner 解析的框架全部确定后才能输出非阻塞 `integration.start.confirm`。缺项目或服务端语言时执行下列 `integration.context.required`;只缺新项目位置用 `integration.project_path.required`,只缺框架不补问。禁止使用 AskUserQuestion、request_user_input、宿主超时默认值、Agent 自创选项或自由话术替代;不得先输出扫描摘要或方案。
52
52
 
53
53
  ```bash
54
54
  node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message context-required --missing-items "$MISSING_ITEMS"
55
55
  ```
56
56
 
57
- `MISSING_ITEMS` 只由 `项目路径`、`技术栈` 组成;产品不明确仍用 `product.clarify`。stdout 原文发出后等待,未补齐前不得初始化、安装或修改。路径输入均先 `resolve-project`;未知位置或需候选时执行:
57
+ `MISSING_ITEMS` 只由 `项目路径`、`技术栈` 组成,其中 `技术栈` 仅表示服务端语言缺失;产品不明确仍用 `product.clarify`。stdout 原文发出后等待,未补齐前不得初始化、安装或修改。路径输入均先 `resolve-project`;未知位置或需候选时执行:
58
58
 
59
59
  ```bash
60
60
  node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message locate-projects --base-path "$USER_WORKSPACE_ROOT" --search-input "$SEARCH_INPUT" --format message
@@ -63,7 +63,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message loc
63
63
  字段齐备后执行唯一 runner;禁止拆开执行项目扫描、`jq` 或 renderer,也不得附加解析。runner stdout 是本动作唯一对客消息,必须把 stdout 原文作为非阻塞消息发给用户;发送后不停止、不等待回复,立即使用同一次 runner 输出的 receipt 进入 development loader。方案事实变化时重新扫描并输出,不使用确认口令;静态扫描只决定进入验证,不证明完成。
64
64
 
65
65
  ```bash
66
- 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"
66
+ 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"
67
67
  ```
68
68
 
69
69
  上面命令失败时不得展示手写确认或进入子流程。成功时必须同时保存唯一 `ALIPAY_AIPAY_INTERNAL:PROJECT_CONFIRM_RECEIPT=<receipt>`;缺失、重复或不可解析视为失败。参数必须是当前确定值,禁止直接拼用户输入。runner 校验产品 variant 并固定服务声明;实际范围仍取当前 Integration flow 和 checklist。
@@ -0,0 +1 @@
1
+ {"schemaVersion":1,"version":"1.7.1","downloadTimeoutMs":60000,"idleTimeoutMs":15000,"maxBytes":8388608,"maxRedirects":5,"assets":{"darwin-x64":{"name":"jq-macos-amd64","sha256":"4155822bbf5ea90f5c79cf254665975eb4274d426d0709770c21774de5407443","url":"https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-macos-amd64"},"darwin-arm64":{"name":"jq-macos-arm64","sha256":"0bbe619e663e0de2c550be2fe0d240d076799d6f8a652b70fa04aea8a8362e8a","url":"https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-macos-arm64"},"linux-x64":{"name":"jq-linux-amd64","sha256":"5942c9b0934e510ee61eb3e30273f1b3fe2590df93933a93d7c58b81d19c8ff5","url":"https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64"},"linux-arm64":{"name":"jq-linux-arm64","sha256":"4dd2d8a0661df0b22f1bb9a1f9830f06b6f3b8f7d91211a1ef5d7c4f06a8b4a5","url":"https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-arm64"}}}