claude-code-best/scripts/dev.ts
Askhz 9062511428 fix: 禁用 CONTEXT_COLLAPSE 修复自动压缩不触发的问题
CONTEXT_COLLAPSE 是空壳 stub,启用后会在 shouldAutoCompact() 中抑制
autocompact,但自身的 collapse 能力并未实现,导致上下文超限后不会触发
自动压缩,一直涨到 API 返回 413 硬报错。

上游已在 0290fe32 修复,CSC 在合并 upstream/main v2.4.2 时漏掉了这个
变更。此次修复与上游一致:注释掉 defines.ts 和 dev.ts 中的
CONTEXT_COLLAPSE feature flag。

Co-Authored-By: CoStrict-DeepSeek-V4-Pro <deepseek-ai@claude-code-best.win>
2026-05-18 16:11:19 +08:00

113 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bun
/**
* Dev entrypoint — launches cli.tsx with MACRO.* defines injected
* via Bun's -d flag (bunfig.toml [define] doesn't propagate to
* dynamically imported modules at runtime).
*/
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { getMacroDefines } from "./defines.ts";
// Resolve project root from this script's location
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const projectRoot = join(__dirname, "..");
const cliPath = join(projectRoot, "src/entrypoints/cli.tsx");
const defines = getMacroDefines();
const defineArgs = Object.entries(defines).flatMap(([k, v]) => [
"-d",
`${k}:${v}`,
]);
// Bun --feature flags: enable feature() gates at runtime.
// Default features enabled in dev mode.
const DEFAULT_FEATURES = [
"BUDDY", "TRANSCRIPT_CLASSIFIER", "BRIDGE_MODE",
"AGENT_TRIGGERS_REMOTE", "CHICAGO_MCP", "VOICE_MODE",
"SHOT_STATS", "PROMPT_CACHE_BREAK_DETECTION", "TOKEN_BUDGET",
// P0: local features
"AGENT_TRIGGERS",
"ULTRATHINK",
"BUILTIN_EXPLORE_PLAN_AGENTS",
"LODESTONE",
// P1: API-dependent features
"EXTRACT_MEMORIES", "VERIFICATION_AGENT",
"KAIROS_BRIEF", "AWAY_SUMMARY", "ULTRAPLAN",
// P2: daemon + remote control server
"DAEMON",
// PR-package restored features
"WORKFLOW_SCRIPTS",
"HISTORY_SNIP",
// "CONTEXT_COLLAPSE", // 已禁用:实现是空壳 stub启用后会抑制 auto compact 导致上下文管理完全失效
"MONITOR_TOOL",
"FORK_SUBAGENT",
"UDS_INBOX",
"KAIROS",
"COORDINATOR_MODE",
"LAN_PIPES",
// "REVIEW_ARTIFACT", // API 请求无响应,需进一步排查 schema 兼容性
// P3: poor mode (disable extract_memories + prompt_suggestion)
"POOR",
// P3: serve mode (HTTP API server)
"DIRECT_CONNECT",
];
// Any env var matching FEATURE_<NAME>=1 will also enable that feature.
// e.g. FEATURE_PROACTIVE=1 bun run dev
const envFeatures = Object.entries(process.env)
.filter(([k]) => k.startsWith("FEATURE_"))
.map(([k]) => k.replace("FEATURE_", ""));
const allFeatures = [...new Set([...DEFAULT_FEATURES, ...envFeatures])];
const featureArgs = allFeatures.flatMap((name) => ["--feature", name]);
// If BUN_INSPECT is set, pass --inspect-wait to the child process
const inspectArgs = process.env.BUN_INSPECT
? ["--inspect-wait=" + process.env.BUN_INSPECT]
: [];
// Use process.execPath to get the absolute path of the currently running Bun
// executable. This works regardless of how Bun was installed (native installer,
// npm, etc.) and on all platforms.
const bunCmd = process.execPath;
// Generate review builtin files before dev launch (skip with SKIP_REVIEW_BUILTIN=1)
if (process.env.SKIP_REVIEW_BUILTIN) {
console.log('[dev] Skipping review builtin generation (SKIP_REVIEW_BUILTIN is set)');
} else {
console.log('[dev] Generating review builtin files...');
const genResult = Bun.spawnSync(['bun', 'run', 'scripts/generate-review-builtin.ts'], {
stdio: ["inherit", "inherit", "inherit"],
cwd: projectRoot,
});
if (!genResult.success) {
console.warn('[dev] Warning: generate-review-builtin.ts failed, using existing files');
}
}
const args = [bunCmd, ...inspectArgs, "run", ...defineArgs, ...featureArgs, cliPath, ...process.argv.slice(2)];
if (process.platform === "win32") {
const child = Bun.spawn(args, {
stdio: ["inherit", "inherit", "inherit"],
cwd: projectRoot,
onExit(proc, exitCode) {
process.exit(exitCode ?? 0);
},
});
const cleanup = (sig: string) => {
child.kill(sig as Bun.Signal);
setTimeout(() => process.exit(1), 3000);
};
process.on("SIGINT", () => cleanup("SIGINT"));
process.on("SIGTERM", () => cleanup("SIGTERM"));
} else {
const result = Bun.spawnSync(args, {
stdio: ["inherit", "inherit", "inherit"],
cwd: projectRoot,
});
process.exit(result.exitCode ?? 0);
}