@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):不再提
@@ -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: 'apps/front',
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(' 1. VERCEL_TOKEN: vercel login 后查看 ~/Library/Application Support/com.vercel.cli/auth.json')
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(`部署目录不存在: target=${t} deployCwd=${targetConfig.deployCwd || '.'} resolved=${runCwd}`)
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`, { stdio: 'ignore' })
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
- ['build', '--local-config', configPath, '--yes'],
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)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ranger1/dx",
3
- "version": "0.1.58",
3
+ "version": "0.1.60",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {