@ranger1/dx 0.1.58 → 0.1.60
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.
|
@@ -96,6 +96,7 @@ agent: sisyphus
|
|
|
96
96
|
- `decisionLogFile: ./.cache/decision-log-pr{{PR_NUMBER}}.md`(如存在)
|
|
97
97
|
- reviewer 默认读 `contextFile`;如果 `decisionLogFile` 存在,reviewer 应在 prompt 中提供该文件路径以参考前轮决策;必要时允许用 `git/gh` 只读命令拿 diff
|
|
98
98
|
- 忽略问题:1.格式化代码引起的噪音 2.已经lint检查以外的格式问题 3.忽略单元测试不足的问题
|
|
99
|
+
- 对于重构代码,不必考虑和以前版本数据的兼容性问题,直接切换就行
|
|
99
100
|
- 特别关注: 逻辑、安全、性能、可维护性
|
|
100
101
|
- 遵守 Decision Log:
|
|
101
102
|
- 已修复(Fixed):不再提
|
package/lib/vercel-deploy.js
CHANGED
|
@@ -11,21 +11,21 @@ const TARGET_CONFIGS = {
|
|
|
11
11
|
front: {
|
|
12
12
|
configFile: 'vercel.front.json',
|
|
13
13
|
projectIdEnvVar: 'VERCEL_PROJECT_ID_FRONT',
|
|
14
|
-
deployCwd: '
|
|
14
|
+
deployCwd: '.',
|
|
15
15
|
deployMode: 'prebuilt',
|
|
16
|
-
prebuiltCwd: '.'
|
|
16
|
+
prebuiltCwd: '.'
|
|
17
17
|
},
|
|
18
18
|
admin: {
|
|
19
19
|
configFile: 'vercel.admin.json',
|
|
20
20
|
projectIdEnvVar: 'VERCEL_PROJECT_ID_ADMIN',
|
|
21
21
|
deployCwd: 'apps/admin-front',
|
|
22
|
-
deployMode: 'prebuilt'
|
|
22
|
+
deployMode: 'prebuilt'
|
|
23
23
|
},
|
|
24
24
|
'telegram-bot': {
|
|
25
25
|
configFile: 'vercel.telegram-bot.json',
|
|
26
26
|
projectIdEnvVar: 'VERCEL_PROJECT_ID_TELEGRAM_BOT',
|
|
27
|
-
deployMode: 'prebuilt'
|
|
28
|
-
}
|
|
27
|
+
deployMode: 'prebuilt'
|
|
28
|
+
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const ALLOWED_DEPLOY_MODES = ['prebuilt']
|
|
@@ -33,7 +33,7 @@ const ALLOWED_DEPLOY_MODES = ['prebuilt']
|
|
|
33
33
|
const APP_ENV_MAP = {
|
|
34
34
|
development: 'dev',
|
|
35
35
|
staging: 'staging',
|
|
36
|
-
production: 'prod'
|
|
36
|
+
production: 'prod'
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
const VERCEL_PROJECT_LINK_PATH = '.vercel/project.json'
|
|
@@ -150,7 +150,7 @@ function readLinkedProjectContext(contextRoot) {
|
|
|
150
150
|
path,
|
|
151
151
|
orgId: parsed?.orgId || null,
|
|
152
152
|
projectId: parsed?.projectId || null,
|
|
153
|
-
parseError: null
|
|
153
|
+
parseError: null
|
|
154
154
|
}
|
|
155
155
|
} catch (error) {
|
|
156
156
|
return {
|
|
@@ -158,7 +158,7 @@ function readLinkedProjectContext(contextRoot) {
|
|
|
158
158
|
path,
|
|
159
159
|
orgId: null,
|
|
160
160
|
projectId: null,
|
|
161
|
-
parseError: error
|
|
161
|
+
parseError: error
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
164
|
}
|
|
@@ -176,7 +176,7 @@ async function runVercel(args, options = {}) {
|
|
|
176
176
|
const child = spawn('vercel', args, {
|
|
177
177
|
cwd: cwd || process.cwd(),
|
|
178
178
|
env: env || process.env,
|
|
179
|
-
stdio: ['inherit', 'pipe', 'pipe']
|
|
179
|
+
stdio: ['inherit', 'pipe', 'pipe']
|
|
180
180
|
})
|
|
181
181
|
|
|
182
182
|
let stdout = ''
|
|
@@ -229,7 +229,7 @@ export async function deployPrebuiltWithFallback(options) {
|
|
|
229
229
|
},
|
|
230
230
|
onMissingFiles = () => {
|
|
231
231
|
logger.warn('检测到 missing_files,自动使用 --archive=tgz 重试一次')
|
|
232
|
-
}
|
|
232
|
+
}
|
|
233
233
|
} = options || {}
|
|
234
234
|
|
|
235
235
|
try {
|
|
@@ -251,7 +251,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
251
251
|
environment = 'staging',
|
|
252
252
|
telegramWebhook = null,
|
|
253
253
|
strictContext = true,
|
|
254
|
-
run = runVercel
|
|
254
|
+
run = runVercel
|
|
255
255
|
} = options
|
|
256
256
|
|
|
257
257
|
// 校验环境参数
|
|
@@ -298,7 +298,9 @@ export async function deployToVercel(target, options = {}) {
|
|
|
298
298
|
logger.info(' VERCEL_PROJECT_ID_TELEGRAM_BOT=prj_xxx')
|
|
299
299
|
logger.info('')
|
|
300
300
|
logger.info('获取方式:')
|
|
301
|
-
logger.info(
|
|
301
|
+
logger.info(
|
|
302
|
+
' 1. VERCEL_TOKEN: vercel login 后查看 ~/Library/Application Support/com.vercel.cli/auth.json'
|
|
303
|
+
)
|
|
302
304
|
logger.info(' 2. PROJECT_ID: vercel project ls --scope <org> 或通过 Vercel Dashboard 获取')
|
|
303
305
|
logger.info('')
|
|
304
306
|
logger.info('提示:部署命令会显式校验 --scope 与环境变量上下文,避免环境漂移。')
|
|
@@ -334,7 +336,9 @@ export async function deployToVercel(target, options = {}) {
|
|
|
334
336
|
const prebuiltCwd = resolveTargetPrebuiltCwd(projectRoot, targetConfig, runCwd)
|
|
335
337
|
|
|
336
338
|
if (!existsSync(runCwd)) {
|
|
337
|
-
logger.error(
|
|
339
|
+
logger.error(
|
|
340
|
+
`部署目录不存在: target=${t} deployCwd=${targetConfig.deployCwd || '.'} resolved=${runCwd}`
|
|
341
|
+
)
|
|
338
342
|
process.exitCode = 1
|
|
339
343
|
return
|
|
340
344
|
}
|
|
@@ -348,7 +352,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
348
352
|
|
|
349
353
|
if (!existsSync(prebuiltCwd)) {
|
|
350
354
|
logger.error(
|
|
351
|
-
`预构建部署目录不存在: target=${t} prebuiltCwd=${targetConfig.prebuiltCwd || targetConfig.deployCwd || '.'} resolved=${prebuiltCwd}
|
|
355
|
+
`预构建部署目录不存在: target=${t} prebuiltCwd=${targetConfig.prebuiltCwd || targetConfig.deployCwd || '.'} resolved=${prebuiltCwd}`
|
|
352
356
|
)
|
|
353
357
|
process.exitCode = 1
|
|
354
358
|
return
|
|
@@ -364,7 +368,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
364
368
|
|
|
365
369
|
if (linkedContext.exists && linkedContext.parseError) {
|
|
366
370
|
logger.warn(
|
|
367
|
-
`检测到 ${VERCEL_PROJECT_LINK_PATH} 但解析失败: ${linkedContext.parseError.message}
|
|
371
|
+
`检测到 ${VERCEL_PROJECT_LINK_PATH} 但解析失败: ${linkedContext.parseError.message}`
|
|
368
372
|
)
|
|
369
373
|
if (strictContext) {
|
|
370
374
|
logger.error('strictContext 已开启,已阻止继续部署以避免回退污染')
|
|
@@ -377,7 +381,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
377
381
|
logger.error('检测到 .vercel 链接冲突')
|
|
378
382
|
logger.error(` 当前目标: org=${maskIdentifier(orgId)} project=${maskIdentifier(projectId)}`)
|
|
379
383
|
logger.error(
|
|
380
|
-
` 本地链接: org=${maskIdentifier(linkedContext.orgId)} project=${maskIdentifier(linkedContext.projectId)}
|
|
384
|
+
` 本地链接: org=${maskIdentifier(linkedContext.orgId)} project=${maskIdentifier(linkedContext.projectId)}`
|
|
381
385
|
)
|
|
382
386
|
if (strictContext) {
|
|
383
387
|
logger.error('strictContext 已开启,已阻止部署(请清理 .vercel 或修正环境变量)')
|
|
@@ -388,7 +392,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
388
392
|
}
|
|
389
393
|
|
|
390
394
|
logger.info(
|
|
391
|
-
`[deploy-context] env=${environment} target=${t} mode=${deployMode} runCwd=${runCwd} prebuiltCwd=${prebuiltCwd} strict=${strictContext ? 1 : 0} org=${maskIdentifier(orgId)} project=${maskIdentifier(projectId)} linked=${linkedContext.exists ? 'yes' : 'no'} token=env
|
|
395
|
+
`[deploy-context] env=${environment} target=${t} mode=${deployMode} runCwd=${runCwd} prebuiltCwd=${prebuiltCwd} strict=${strictContext ? 1 : 0} org=${maskIdentifier(orgId)} project=${maskIdentifier(projectId)} linked=${linkedContext.exists ? 'yes' : 'no'} token=env`
|
|
392
396
|
)
|
|
393
397
|
|
|
394
398
|
const envVars = {
|
|
@@ -396,7 +400,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
396
400
|
VERCEL_PROJECT_ID: projectId,
|
|
397
401
|
APP_ENV: buildEnv,
|
|
398
402
|
NODE_ENV: envManager.mapAppEnvToNodeEnv(environment),
|
|
399
|
-
VERCEL_ORG_ID: orgId
|
|
403
|
+
VERCEL_ORG_ID: orgId
|
|
400
404
|
}
|
|
401
405
|
|
|
402
406
|
// 不通过 CLI args 传递 token,避免出现在错误信息/日志中
|
|
@@ -409,7 +413,9 @@ export async function deployToVercel(target, options = {}) {
|
|
|
409
413
|
try {
|
|
410
414
|
originalAuthor = execSync('git log -1 --format="%an <%ae>"', { encoding: 'utf8' }).trim()
|
|
411
415
|
const authorName = authorEmail.split('@')[0]
|
|
412
|
-
execSync(`git commit --amend --author="${authorName} <${authorEmail}>" --no-edit`, {
|
|
416
|
+
execSync(`git commit --amend --author="${authorName} <${authorEmail}>" --no-edit`, {
|
|
417
|
+
stdio: 'ignore'
|
|
418
|
+
})
|
|
413
419
|
logger.info(`临时修改 commit author: ${originalAuthor} -> ${authorName} <${authorEmail}>`)
|
|
414
420
|
} catch (e) {
|
|
415
421
|
logger.warn(`修改 commit author 失败: ${e.message}`)
|
|
@@ -424,12 +430,9 @@ export async function deployToVercel(target, options = {}) {
|
|
|
424
430
|
|
|
425
431
|
// 第一步:本地构建
|
|
426
432
|
logger.step(`本地构建 ${t} (${environment})`)
|
|
427
|
-
const buildArgs = appendTargetArgs(
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
orgId,
|
|
431
|
-
},
|
|
432
|
-
)
|
|
433
|
+
const buildArgs = appendTargetArgs(['build', '--local-config', configPath, '--yes'], {
|
|
434
|
+
orgId
|
|
435
|
+
})
|
|
433
436
|
|
|
434
437
|
// staging 和 production 环境需要 --prod 标志,确保构建产物与部署环境匹配
|
|
435
438
|
if (environment === 'staging' || environment === 'production') {
|
|
@@ -444,8 +447,8 @@ export async function deployToVercel(target, options = {}) {
|
|
|
444
447
|
const baseDeployArgs = appendTargetArgs(
|
|
445
448
|
['deploy', '--prebuilt', '--local-config', configPath, '--yes'],
|
|
446
449
|
{
|
|
447
|
-
orgId
|
|
448
|
-
}
|
|
450
|
+
orgId
|
|
451
|
+
}
|
|
449
452
|
)
|
|
450
453
|
|
|
451
454
|
// staging 和 production 环境都添加 --prod 标志以绑定固定域名
|
|
@@ -457,7 +460,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
457
460
|
baseArgs: baseDeployArgs,
|
|
458
461
|
env: envVars,
|
|
459
462
|
cwd: prebuiltCwd,
|
|
460
|
-
run
|
|
463
|
+
run
|
|
461
464
|
})
|
|
462
465
|
|
|
463
466
|
const deployOutput = [deployResult?.result?.stdout, deployResult?.result?.stderr]
|
|
@@ -470,7 +473,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
470
473
|
await handleTelegramBotDeploy(environment, projectId, orgId, token, {
|
|
471
474
|
deployOutput,
|
|
472
475
|
projectNameHint: 'telegram-bot',
|
|
473
|
-
...(telegramWebhook || {})
|
|
476
|
+
...(telegramWebhook || {})
|
|
474
477
|
})
|
|
475
478
|
logger.success(`${t} 部署成功(Webhook 已校验)`)
|
|
476
479
|
} else {
|
|
@@ -479,7 +482,7 @@ export async function deployToVercel(target, options = {}) {
|
|
|
479
482
|
} catch (error) {
|
|
480
483
|
if (deployMode === 'prebuilt' && isNextPrebuiltMissingPathError(error)) {
|
|
481
484
|
logger.error(
|
|
482
|
-
'高优先级提示:检测到 Next.js 预构建产物缺失(next-server.js/node_modules/.pnpm)。请检查 front prebuiltCwd 与构建产物路径是否一致。'
|
|
485
|
+
'高优先级提示:检测到 Next.js 预构建产物缺失(next-server.js/node_modules/.pnpm)。请检查 front prebuiltCwd 与构建产物路径是否一致。'
|
|
483
486
|
)
|
|
484
487
|
}
|
|
485
488
|
const message = error?.message || String(error)
|