[FEATURE] Claudecode自带的Bun版本太低,导致奔溃严重。更新Bun版本。

Resolved 💬 2 comments Opened Apr 13, 2026 by jack-xian05 Closed Apr 23, 2026

Preflight Checklist

  • [x] I have searched existing requests and this feature hasn't been requested yet
  • [x] This is a single feature request (not multiple features)

Problem Statement

Claudecode自带的Bun,会导致Windows在Android Studio上创建游戏是报错,目前不能升级Bun,替换Bun,不能单独更新Bun,Claudecode2.1.104强制捆版1.3.12,这个Bun版本太低,希望Claudecode更新版本,创建一个快捷键去对老用户快速更新版本,提升兼容能力。Claude Code 大量依赖 Bun 内部 API、bug、行为
升级 Bun 会导致:
API 变动 → JS 代码报错
终端渲染(Ink+React)崩溃
文件读写、权限、进程调用行为变化
商业产品 宁可旧版稳定,也不冒险升级

Proposed Solution

Anthropic锁死Bun,这个版本太低造成软件不兼容问题性太大,我认为是可以加速升级Bun,而且是一定要升级,Anthropic官方亲自下场处理Bun版本太低问题

Alternative Solutions

目前想不出新替代方案,需官方自行解决。

Priority

Critical - Blocking my work

Feature Category

Developer tools/SDK

Use Case Example

我在开发一段Android 2D 游戏(猫咪进化)的 HUD(抬头显示)绘制代码,负责在屏幕上绘制玩家猫咪的生命值、饥饿、水分、体力、等级、经验、属性等 UI 面板,使用原生 Canvas 绘制 2D 图形。

Additional Context

package com.catevolution.game.ui

import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import com.catevolution.game.Constants
import com.catevolution.game.entities.PlayerCat
import com.catevolution.game.entities.EvolutionTier

class HUD {
// ==================== 常量定义(统一管理,方便修改) ====================
private companion object {
// 面板尺寸
private const val PANEL_WIDTH = 200f
private const val PANEL_HEIGHT = 170f
private const val MINI_PANEL_WIDTH = 160f
private const val MINI_PANEL_HEIGHT = 56f
private const val CORNER_RADIUS = 12f
private const val BAR_WIDTH = 140f
private const val EXP_BAR_WIDTH = 140f

// 间距与偏移
private const val MARGIN = 12f
private const val BAR_SPACING = 8f
private const val TEXT_BOTTOM_OFFSET = 4f

// 警告阈值
private const val WARN_RATIO = 0.25f
}

// ==================== 画笔初始化(全局唯一,避免重复创建) ====================
// 背景画笔
private val bgPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.argb(160, 0, 0, 0)
}
// 标签画笔
private val labelPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.WHITE
isFakeBoldText = true
}
// 数值画笔
private val valuePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.LTGRAY
}
// 进度条背景
private val barBgPaint = Paint().apply {
color = Color.argb(180, 40, 40, 40)
}
// 经验条画笔
private val expBarPaint = Paint().apply {
color = Color.YELLOW
}
// 等级画笔
private val tierPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
textSize = 20f
isFakeBoldText = true
textAlign = Paint.Align.CENTER
}
// 属性画笔
private val statsPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.WHITE
}
// 状态画笔
private val statePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.rgb(200, 230, 255)
}

// 进度条配置
data class BarConfig(
val label: String,
val color: Int,
val warnColor: Int = Color.RED
)

private val bars = listOf(
BarConfig("HP", Color.rgb(220, 50, 50)),
BarConfig("饥", Color.rgb(230, 160, 30)),
BarConfig("水", Color.rgb(60, 160, 230)),
BarConfig("力", Color.rgb(80, 200, 80))
)

// 复用矩形对象(避免频繁创建对象)
private val drawRect = RectF()

fun draw(canvas: Canvas, player: PlayerCat, screenW: Float, screenH: Float) {
val panelX = MARGIN
val panelY = MARGIN

// 1. 绘制主面板背景
drawRect.set(panelX, panelY, panelX + PANEL_WIDTH, panelY + PANEL_HEIGHT)
canvas.drawRoundRect(drawRect, CORNER_RADIUS, CORNER_RADIUS, bgPaint)

// 2. 绘制进化等级
drawEvolutionTier(canvas, player, panelX, panelY)

// 3. 绘制四大属性进度条
drawStatusBars(canvas, player, panelX, panelY)

// 4. 绘制经验条
drawExpBar(canvas, player, panelX, panelY)

// 5. 绘制猫咪状态
drawPlayerState(canvas, player, panelX, panelY)

// 6. 绘制右侧迷你属性面板
drawMiniStats(canvas, player, screenW)
}

/** 绘制进化等级 */
private fun drawEvolutionTier(canvas: Canvas, player: PlayerCat, panelX: Float, panelY: Float) {
tierPaint.color = when (player.evolutionTier) {
EvolutionTier.TIER1 -> Color.rgb(200, 200, 200)
EvolutionTier.TIER2 -> Color.rgb(100, 220, 100)
EvolutionTier.TIER3 -> Color.rgb(100, 160, 255)
EvolutionTier.TIER4 -> Color.rgb(255, 180, 0)
EvolutionTier.TIER5 -> Color.rgb(220, 80, 255)
}
canvas.drawText(
"猫·${player.evolutionTier.label}",
panelX + PANEL_WIDTH / 2,
panelY + 26f,
tierPaint
)
}

/** 绘制HP/饥饿/水分/体力进度条 */
private fun drawStatusBars(canvas: Canvas, player: PlayerCat, panelX: Float, panelY: Float) {
val values = listOf(
player.hp to player.maxHp,
player.hunger to player.maxHunger,
player.hydration to player.maxHydration,
player.stamina to player.maxStamina
)
val barH = Constants.HUD_BAR_H
val startY = panelY + 38f

for (i in bars.indices) {
val cfg = bars[i]
val (current, max) = values[i]
// 安全计算比例
val ratio = if (max <= 0) 0f else (current / max).coerceIn(0f, 1f)
val bx = panelX + 52f
val by = startY + i * (barH + BAR_SPACING)

// 绘制标签
labelPaint.textSize = 15f
canvas.drawText(cfg.label, panelX + 10f, by + barH, labelPaint)

// 绘制进度条背景
drawRect.set(bx, by, bx + BAR_WIDTH, by + barH)
canvas.drawRoundRect(drawRect, 4f, 4f, barBgPaint)

// 绘制进度条填充(低数值变红)
val fillColor = if (ratio < WARN_RATIO) cfg.warnColor else cfg.color
if (ratio > 0f) {
drawRect.set(bx, by, bx + BAR_WIDTH * ratio, by + barH)
canvas.drawRoundRect(drawRect, 4f, 4f, barBgPaint.apply { color = fillColor })
}

// 绘制数值
valuePaint.textSize = 13f
canvas.drawText("${current.toInt()}/${max.toInt()}", bx + BAR_WIDTH + 4f, by + barH, valuePaint)
}
}

/** 绘制经验条 */
private fun drawExpBar(canvas: Canvas, player: PlayerCat, panelX: Float, panelY: Float) {
val barH = Constants.HUD_BAR_H
val expBarY = panelY + 38f + bars.size * (barH + BAR_SPACING) + 4f

// 计算经验比例
val currentTierOrdinal = player.evolutionTier.ordinal
val nextThresh = if (player.evolutionTier == EvolutionTier.TIER5)
Int.MAX_VALUE else Constants.EVO_THRESHOLDS.getOrElse(currentTierOrdinal + 1) { Int.MAX_VALUE }
val prevThresh = Constants.EVO_THRESHOLDS.getOrElse(currentTierOrdinal) { 0 }
val expRange = (nextThresh - prevThresh).toFloat().coerceAtLeast(1f)
val expRatio = ((player.evolutionExp - prevThresh).toFloat() / expRange).coerceIn(0f, 1f)

// 绘制EXP标签
labelPaint.textSize = 14f
canvas.drawText("EXP", panelX + 10f, expBarY + 12f, labelPaint)

// 绘制经验条背景
drawRect.set(panelX + 52f, expBarY, panelX + 192f, expBarY + 12f)
canvas.drawRoundRect(drawRect, 4f, 4f, barBgPaint)

// 绘制经验条填充(修复宽度错误)
if (expRatio > 0f) {
drawRect.set(panelX + 52f, expBarY, panelX + 192f * expRatio, expBarY + 12f)
canvas.drawRoundRect(drawRect, 4f, 4f, expBarPaint)
}

// 绘制经验数值
valuePaint.textSize = 12f
canvas.drawText("${player.evolutionExp}/$nextThresh", panelX + 196f, expBarY + 12f, valuePaint)
}

/** 绘制玩家状态 */
private fun drawPlayerState(canvas: Canvas, player: PlayerCat, panelX: Float, panelY: Float) {
statePaint.textSize = 14f
val stateText = "状态: ${getStateChinese(player.state.name)}"
canvas.drawText(stateText, panelX + 8f, panelY + PANEL_HEIGHT - 8f, statePaint)
}

/** 绘制右侧迷你属性面板 */
private fun drawMiniStats(canvas: Canvas, player: PlayerCat, screenW: Float) {
val panelX = screenW - MINI_PANEL_WIDTH - MARGIN
val panelY = MARGIN

// 背景
drawRect.set(panelX, panelY, panelX + MINI_PANEL_WIDTH, panelY + MINI_PANEL_HEIGHT)
canvas.drawRoundRect(drawRect, 10f, 10f, bgPaint)

// 属性文字
statsPaint.textSize = 13f
statsPaint.color = Color.WHITE
canvas.drawText(
"⚔ ${player.attack.toInt()} 🛡 ${player.defense.toInt()} ⚡ ${player.speed.toInt()}",
panelX + 10f, panelY + 22f, statsPaint
)

// 体重
statsPaint.color = Color.rgb(255, 200, 100)
canvas.drawText(
"体重: ${(player.effectiveSize * 0.5f).toInt()} kg",
panelX + 10f, panelY + 44f, statsPaint
)
}

/** 状态中文映射 */
private fun getStateChinese(state: String): String = when (state) {
"IDLE" -> "休闲"
"WALKING" -> "行走"
"SPRINTING" -> "疾跑"
"POUNCING" -> "突进"
"JUMPING" -> "跳跃"
"HUNTING" -> "追猎"
"EATING" -> "进食"
"RESTING" -> "休息"
"NURTURING" -> "哺育"
"BREEDING" -> "繁殖"
"DEAD" -> "死亡"
else -> state
}
}

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗