mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
* fix: 修复状态栏 context 计数器在 loading 时闪现为 0 的问题 第三方 API(如智谱)在 message_start 中可能不返回完整 usage 数据, 导致 getCurrentUsage 返回全零 usage 对象,使 ctx 显示为 0%。 双重保护: - getCurrentUsage: 跳过全零 usage,继续往前找有真实数据的 message - calculateContextPercentages: totalInputTokens 为 0 时返回 null Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 外部化 ESM 包使用 createRequire 替代裸 require color-diff-napi、image-processor-napi、audio-capture-napi 声明 "type": "module" 但使用裸 require(),Node.js ESM 中 require 不可用。改用 createRequire(import.meta.url) 或顶层 import。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: getDefaultSonnetModel 优先使用用户配置的模型,修复第三方 provider 模型不存在错误 当用户通过 ANTHROPIC_MODEL 或 settings 配置了自定义 provider 支持的模型时, getDefaultSonnetModel/Haiku/Opus 现在会优先使用该配置,而非硬编码 Anthropic 官方模型 ID。 同时改进 Langfuse 可观测性:sideQuery 失败时记录错误信息到 span, optional 模式下标记 WARNING 而非 ERROR。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 将 auto_mode classifier 的 side-query span 绑定到父 trace classifyYoloAction 及 classifyYoloActionXml 接收 parentSpan 参数, 透传给 sideQuery 调用,使 auto_mode 的 side-query span 嵌套在主 agent trace 下。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 穷鬼模式下跳过 memdir_relevance side-query Poor mode 启用时不执行 findRelevantMemories 的预取调用, 避免额外的 API token 消耗。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: 添加 test:all 脚本用于完成任务后的全量检查 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: Vite 构建补齐缺失的 feature flags,修复 auto mode 不可见 Vite 构建插件的 DEFAULT_BUILD_FEATURES 缺少 BUDDY、TRANSCRIPT_CLASSIFIER、 BRIDGE_MODE、ACP、BG_SESSIONS、TEMPLATES,导致 feature('TRANSCRIPT_CLASSIFIER') 被替换为 false,auto mode 从 Shift+Tab 循环中消失。与 build.ts 对齐。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 统一 feature flags 到 defines.ts,修复 Vite 构建缺失 auto mode 将 DEFAULT_BUILD_FEATURES 列表从 build.ts、dev.ts、vite-plugin-feature-flags.ts 三处内联定义统一到 scripts/defines.ts 单一导出。之前的 Vite 插件缺少 TRANSCRIPT_CLASSIFIER 等 feature flag,导致 auto mode 在 Vite 构建中不可见。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
97 lines
3.2 KiB
TypeScript
97 lines
3.2 KiB
TypeScript
import { readdir, readFile, writeFile, cp } from 'fs/promises'
|
|
import { join } from 'path'
|
|
import { getMacroDefines } from './scripts/defines.ts'
|
|
import { DEFAULT_BUILD_FEATURES } from './scripts/defines.ts'
|
|
|
|
const outdir = 'dist'
|
|
|
|
// Step 1: Clean output directory
|
|
const { rmSync } = await import('fs')
|
|
rmSync(outdir, { recursive: true, force: true })
|
|
|
|
// Collect FEATURE_* env vars → Bun.build features
|
|
const envFeatures = Object.keys(process.env)
|
|
.filter(k => k.startsWith('FEATURE_'))
|
|
.map(k => k.replace('FEATURE_', ''))
|
|
const features = [...new Set([...DEFAULT_BUILD_FEATURES, ...envFeatures])]
|
|
|
|
// Step 2: Bundle with splitting
|
|
const result = await Bun.build({
|
|
entrypoints: ['src/entrypoints/cli.tsx'],
|
|
outdir,
|
|
target: 'bun',
|
|
splitting: true,
|
|
define: getMacroDefines(),
|
|
features,
|
|
})
|
|
|
|
if (!result.success) {
|
|
console.error('Build failed:')
|
|
for (const log of result.logs) {
|
|
console.error(log)
|
|
}
|
|
process.exit(1)
|
|
}
|
|
|
|
// Step 3: Post-process — replace Bun-only `import.meta.require` with Node.js compatible version
|
|
const files = await readdir(outdir)
|
|
const IMPORT_META_REQUIRE = 'var __require = import.meta.require;'
|
|
const COMPAT_REQUIRE = `var __require = typeof import.meta.require === "function" ? import.meta.require : (await import("module")).createRequire(import.meta.url);`
|
|
|
|
let patched = 0
|
|
for (const file of files) {
|
|
if (!file.endsWith('.js')) continue
|
|
const filePath = join(outdir, file)
|
|
const content = await readFile(filePath, 'utf-8')
|
|
if (content.includes(IMPORT_META_REQUIRE)) {
|
|
await writeFile(
|
|
filePath,
|
|
content.replace(IMPORT_META_REQUIRE, COMPAT_REQUIRE),
|
|
)
|
|
patched++
|
|
}
|
|
}
|
|
|
|
// Also patch unguarded globalThis.Bun destructuring from third-party deps
|
|
// (e.g. @anthropic-ai/sandbox-runtime) so Node.js doesn't crash at import time.
|
|
let bunPatched = 0
|
|
const BUN_DESTRUCTURE = /var \{([^}]+)\} = globalThis\.Bun;?/g
|
|
const BUN_DESTRUCTURE_SAFE = 'var {$1} = typeof globalThis.Bun !== "undefined" ? globalThis.Bun : {};'
|
|
for (const file of files) {
|
|
if (!file.endsWith('.js')) continue
|
|
const filePath = join(outdir, file)
|
|
const content = await readFile(filePath, 'utf-8')
|
|
if (BUN_DESTRUCTURE.test(content)) {
|
|
await writeFile(
|
|
filePath,
|
|
content.replace(BUN_DESTRUCTURE, BUN_DESTRUCTURE_SAFE),
|
|
)
|
|
bunPatched++
|
|
}
|
|
}
|
|
BUN_DESTRUCTURE.lastIndex = 0
|
|
|
|
console.log(
|
|
`Bundled ${result.outputs.length} files to ${outdir}/ (patched ${patched} for import.meta.require, ${bunPatched} for Bun destructure)`,
|
|
)
|
|
|
|
// Step 4: Copy native .node addon files (audio-capture)
|
|
const vendorDir = join(outdir, 'vendor', 'audio-capture')
|
|
await cp('vendor/audio-capture', vendorDir, { recursive: true })
|
|
console.log(`Copied vendor/audio-capture/ → ${vendorDir}/`)
|
|
|
|
// Step 5: Generate cli-bun and cli-node executable entry points
|
|
const cliBun = join(outdir, 'cli-bun.js')
|
|
const cliNode = join(outdir, 'cli-node.js')
|
|
|
|
await writeFile(cliBun, '#!/usr/bin/env bun\nimport "./cli.js"\n')
|
|
|
|
await writeFile(cliNode, '#!/usr/bin/env node\nimport "./cli.js"\n')
|
|
|
|
// Make both executable
|
|
const { chmodSync } = await import('fs')
|
|
chmodSync(cliBun, 0o755)
|
|
chmodSync(cliNode, 0o755)
|
|
|
|
console.log(`Generated ${cliBun} (shebang: bun) and ${cliNode} (shebang: node)`)
|