@@ -0,0 +1,58 @@
|
||||
{
|
||||
"numStartups": 80,
|
||||
"installMethod": "global",
|
||||
"hasSeenTasksHint": true,
|
||||
"autoInstallIdeExtension": false,
|
||||
"cachedStatsigGates": {
|
||||
"tengu_prompt_suggestion": false
|
||||
},
|
||||
"mcpServers": {
|
||||
"zai-mcp-server": {
|
||||
"type": "stdio",
|
||||
"command": "npx",
|
||||
"args": [
|
||||
"-y",
|
||||
"@z_ai/mcp-server"
|
||||
],
|
||||
"env": {
|
||||
"Z_AI_MODE": "ZHIPU",
|
||||
"Z_AI_API_KEY": "{{your_api_key}}"
|
||||
}
|
||||
},
|
||||
"web-search-prime": {
|
||||
"type": "http",
|
||||
"url": "https://open.bigmodel.cn/api/mcp/web_search_prime/mcp",
|
||||
"headers": {
|
||||
"Authorization": "Bearer {{your_api_key}}"
|
||||
}
|
||||
},
|
||||
"web-reader": {
|
||||
"type": "http",
|
||||
"url": "https://open.bigmodel.cn/api/mcp/web_reader/mcp",
|
||||
"headers": {
|
||||
"Authorization": "Bearer {{your_api_key}}"
|
||||
}
|
||||
},
|
||||
"zread": {
|
||||
"type": "http",
|
||||
"url": "https://open.bigmodel.cn/api/mcp/zread/mcp",
|
||||
"headers": {
|
||||
"Authorization": "Bearer {{your_api_key}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"firstStartTime": "2026-01-01T01:02:03.004Z",
|
||||
"unpinOpus47LaunchEffort": true,
|
||||
"opusProMigrationComplete": true,
|
||||
"sonnet1m45MigrationComplete": true,
|
||||
"thinkingMigrationComplete": true,
|
||||
"hasCompletedOnboarding": true,
|
||||
"migrationVersion": 11,
|
||||
"lastReleaseNotesSeen": "2.1.112",
|
||||
"hasIdeOnboardingBeenShown": {
|
||||
"vscode": true
|
||||
},
|
||||
"officialMarketplaceAutoInstallAttempted": true,
|
||||
"officialMarketplaceAutoInstalled": true,
|
||||
"showSpinnerTree": false
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
# ============================================================================
|
||||
# DevContainer .bashrc 追加配置
|
||||
# 由 Dockerfile 通过 sed 替换占位符后追加到 ~/.bashrc
|
||||
# ============================================================================
|
||||
|
||||
# 本地二进制路径(必须优先于 NVM)
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
|
||||
# NVM 配置
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||
|
||||
# Node.js 镜像配置
|
||||
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
|
||||
export npm_config_registry=https://registry.npmmirror.com
|
||||
export YARN_REGISTRY=https://registry.npmmirror.com
|
||||
export ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
|
||||
|
||||
# Python/UV 配置
|
||||
export PATH="{{NODE_PATH}}:{{BIN_PATH}}:$PATH"
|
||||
export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
export UV_LINK_MODE=copy
|
||||
export PYTHONUNBUFFERED=1
|
||||
alias uv-python='uv run python'
|
||||
alias uv-pip='uv run pip'
|
||||
|
||||
# 语言和区域设置
|
||||
export LC_ALL=zh_CN.UTF-8
|
||||
export LC_TIME=zh_CN.UTF-8
|
||||
export LANG=zh_CN.UTF-8
|
||||
|
||||
# 其他配置
|
||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=false
|
||||
export EDITOR=vim
|
||||
export VISUAL=vim
|
||||
export LESSCHARSET=utf-8
|
||||
|
||||
# Jujutsu (jj) 补全
|
||||
if command -v jj >/dev/null 2>&1; then
|
||||
source <(jj util completion bash 2>/dev/null)
|
||||
fi
|
||||
|
||||
# 别名配置
|
||||
alias ll='ls -alhF --color=auto'
|
||||
alias date='date "+%F %T %p %A %B"'
|
||||
export TIME_STYLE='+%Y-%m-%d %H:%M:%S'
|
||||
|
||||
# Python 路径
|
||||
export PYTHONPATH=/workspace:$PYTHONPATH
|
||||
|
||||
# NVM IO.js 镜像
|
||||
export NVM_IOJS_ORG_MIRROR="https://iojs.org/dist"
|
||||
|
||||
# Claude Code 启动函数(参数透传至 runcc.sh,支持 -n/--name 走 /rename 持久化)
|
||||
cc() { {{BIN_PATH}}/runcc.sh "$@"; }
|
||||
|
||||
# 模型快捷方式: cc51, cc51 -n 后端, cc -n 后端 51 ...
|
||||
alias cc45='cc 45'
|
||||
alias cc45a='cc 45a'
|
||||
alias cc46='cc 46'
|
||||
alias cc47='cc 47'
|
||||
alias cc5='cc 5'
|
||||
alias cc5t='cc 5t'
|
||||
alias cc51='cc 51'
|
||||
|
||||
# OpenCode 启动函数(参数透传至 runoc.sh)
|
||||
oc() { {{BIN_PATH}}/runoc.sh "$@"; }
|
||||
|
||||
# 模型快捷方式: oc51, oc 51 ...
|
||||
alias oc45='oc 45'
|
||||
alias oc45a='oc 45a'
|
||||
alias oc45f='oc 45f'
|
||||
alias oc46='oc 46'
|
||||
alias oc46v='oc 46v'
|
||||
alias oc46vf='oc 46vf'
|
||||
alias oc47='oc 47'
|
||||
alias oc5='oc 5'
|
||||
alias oc5t='oc 5t'
|
||||
alias oc51='oc 51'
|
||||
|
||||
# tmux pane 级模型继承:从 pane option 读取模型配置(由 runcc.sh 写入)
|
||||
# 覆盖 session 级环境变量,实现同 session 不同 pane 的模型隔离
|
||||
if [ -n "${TMUX:-}" ]; then
|
||||
_model="$(tmux show-option -pv @anthropic_model 2>/dev/null || true)"
|
||||
if [ -n "$_model" ]; then
|
||||
export ANTHROPIC_DEFAULT_HAIKU_MODEL="$_model"
|
||||
export ANTHROPIC_DEFAULT_SONNET_MODEL="$_model"
|
||||
export ANTHROPIC_DEFAULT_OPUS_MODEL="$_model"
|
||||
fi
|
||||
unset _model
|
||||
|
||||
_oc_model="$(tmux show-option -pv @opencode_model 2>/dev/null || true)"
|
||||
if [ -n "$_oc_model" ]; then
|
||||
export OPENCODE_MODEL="$_oc_model"
|
||||
fi
|
||||
unset _oc_model
|
||||
fi
|
||||
|
||||
# Docker 组提示(仅在需要时显示)
|
||||
if [ "${DOCKER_ENABLED:-true}" = "true" ] && [ -S /var/run/docker.sock ] && ! groups | grep -q docker; then
|
||||
export DOCKER_GROUP_REQUIRED=1
|
||||
fi
|
||||
|
||||
# ============================================================================
|
||||
# VCS 感知提示符(覆盖 devcontainer 默认,支持 jj bookmark 显示)
|
||||
# ============================================================================
|
||||
# 在 bashrc 加载时检测 jj 仓库(只需一次,避免每次提示都调用 jj root)
|
||||
__JJ_REPO=0
|
||||
if command -v jj >/dev/null 2>&1 && jj root >/dev/null 2>&1; then
|
||||
__JJ_REPO=1
|
||||
fi
|
||||
|
||||
__vcs_prompt() {
|
||||
local userpart='`export XIT=$? \
|
||||
&& [ ! -z "${GITHUB_USER:-}" ] && echo -n "\[\033[0;32m\]@${GITHUB_USER:-} " || echo -n "\[\033[0;32m\]\u " \
|
||||
&& [ "$XIT" -ne "0" ] && echo -n "\[\033[1;31m\]➜" || echo -n "\[\033[0m\]➜"`'
|
||||
local vcsbranch='`\
|
||||
if [ "${__JJ_REPO:-0}" = "1" ]; then \
|
||||
BRANCH=$(jj bookmark list -r @- 2>/dev/null | sed "s/[*:].*//" | head -1); \
|
||||
if [ -z "${BRANCH:-}" ]; then \
|
||||
BRANCH=$(jj log -r "@-" --no-graph -T "change_id.short()" 2>/dev/null); \
|
||||
fi; \
|
||||
if [ -n "${BRANCH:-}" ]; then \
|
||||
echo -n "\[\033[0;36m\](\[\033[1;31m\]${BRANCH}\[\033[0;36m\]) "; \
|
||||
fi; \
|
||||
else \
|
||||
BRANCH="$(git --no-optional-locks symbolic-ref --short HEAD 2>/dev/null || git --no-optional-locks rev-parse --short HEAD 2>/dev/null)"; \
|
||||
if [ -n "${BRANCH:-}" ]; then \
|
||||
echo -n "\[\033[0;36m\](\[\033[1;31m\]${BRANCH}\[\033[0;36m\]) "; \
|
||||
fi; \
|
||||
fi`'
|
||||
local lightblue='\[\033[1;34m\]'
|
||||
local removecolor='\[\033[0m\]'
|
||||
PS1="${userpart} ${lightblue}\w ${vcsbranch}${removecolor}\$ "
|
||||
}
|
||||
__vcs_prompt
|
||||
@@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
# Claude Code 启动脚本,支持通过参数选择 GLM 模型版本
|
||||
#
|
||||
# 固定版本: 2.1.112 (来自 /workspace/.devcontainer/.cache/npm/anthropic-ai-claude-code-2.1.112.tgz)
|
||||
# 注意: 不再执行自动更新,以保持版本稳定
|
||||
|
||||
SETTINGS_FILE="/workspace/.devcontainer/.volumes/claude/settings.json"
|
||||
|
||||
# 参数解析: runcc.sh [--name <名称>] [模型]
|
||||
SESSION_NAME=""
|
||||
MODEL_KEY=""
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--name|-n)
|
||||
[ $# -ge 2 ] || { echo "错误: --name 需要参数" >&2; exit 1; }
|
||||
SESSION_NAME="$2"; shift 2
|
||||
;;
|
||||
-h|--help)
|
||||
echo "用法: runcc.sh [--name <名称>] [模型]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " --name, -n <名称> Claude Code 会话显示名称"
|
||||
echo ""
|
||||
echo "模型: 45|45a|46|47|5|5t|51 (默认 51)"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
MODEL_KEY="$1"; shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
MODEL_KEY="${MODEL_KEY:-51}" # 默认使用 glm-5.1
|
||||
case "$MODEL_KEY" in
|
||||
45) MODEL="glm-4.5" ;;
|
||||
45a) MODEL="glm-4.5-air" ;;
|
||||
46) MODEL="glm-4.6" ;;
|
||||
47) MODEL="glm-4.7" ;;
|
||||
5) MODEL="glm-5" ;;
|
||||
5t) MODEL="glm-5-turbo" ;;
|
||||
51) MODEL="glm-5.1" ;;
|
||||
*)
|
||||
echo "未知模型: $MODEL_KEY (可选: 45|45a|46|47|5|5t|51)"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# 从 settings.json 中移除模型相关配置(避免覆盖 shell 环境变量)
|
||||
if command -v jq &>/dev/null && [ -f "$SETTINGS_FILE" ]; then
|
||||
jq 'del(.env.ANTHROPIC_DEFAULT_OPUS_MODEL, .env.ANTHROPIC_DEFAULT_HAIKU_MODEL, .env.ANTHROPIC_DEFAULT_SONNET_MODEL)' \
|
||||
"$SETTINGS_FILE" > "${SETTINGS_FILE}.tmp" \
|
||||
&& mv "${SETTINGS_FILE}.tmp" "$SETTINGS_FILE"
|
||||
fi
|
||||
|
||||
# ── 模型环境变量(三个层级统一为同一模型)────────────────
|
||||
export ANTHROPIC_DEFAULT_HAIKU_MODEL="$MODEL"
|
||||
export ANTHROPIC_DEFAULT_SONNET_MODEL="$MODEL"
|
||||
export ANTHROPIC_DEFAULT_OPUS_MODEL="$MODEL"
|
||||
|
||||
# ── tmux 模型传播(确保子 pane 能获取正确模型)─────────
|
||||
if [ -n "${TMUX:-}" ]; then
|
||||
SESSION_ID="$(tmux display-message -p '#{session_id}')"
|
||||
|
||||
# 层级 2: session 级环境变量(不同 session 隔离)
|
||||
tmux setenv -t "$SESSION_ID" ANTHROPIC_DEFAULT_OPUS_MODEL "$MODEL"
|
||||
tmux setenv -t "$SESSION_ID" ANTHROPIC_DEFAULT_HAIKU_MODEL "$MODEL"
|
||||
tmux setenv -t "$SESSION_ID" ANTHROPIC_DEFAULT_SONNET_MODEL "$MODEL"
|
||||
|
||||
# 层级 3: pane 级选项(同 session 不同 pane 隔离)
|
||||
# .bashrc 会在新 shell 启动时读取此选项,覆盖 session 级设置
|
||||
tmux set-option -p @anthropic_model "$MODEL"
|
||||
fi
|
||||
|
||||
# 构建启动参数
|
||||
CC_ARGS=(--ide --dangerously-skip-permissions --allow-dangerously-skip-permissions)
|
||||
|
||||
# --name 不可靠(不写 custom-title/agent-name JSONL 记录),
|
||||
# 改用 /rename 斜杠命令作为初始提示,确保名称正确持久化
|
||||
if [ -n "$SESSION_NAME" ]; then
|
||||
INITIAL_PROMPT="/rename $SESSION_NAME"
|
||||
fi
|
||||
|
||||
echo "启动 Claude Code (模型: $MODEL${SESSION_NAME:+, 会话: $SESSION_NAME})"
|
||||
claude "${CC_ARGS[@]}" ${INITIAL_PROMPT:+"$INITIAL_PROMPT"}
|
||||
Executable
+73
@@ -0,0 +1,73 @@
|
||||
#!/bin/bash
|
||||
# OpenCode 启动脚本,支持通过参数选择 GLM 模型版本
|
||||
#
|
||||
# 用法: runoc.sh [模型]
|
||||
#
|
||||
# 模型: 45|45a|45f|46|46v|46vf|47|5|5t|51 (默认 51)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
PROJECT_CONFIG="/workspace/opencode.json"
|
||||
GLOBAL_CONFIG="$HOME/.config/opencode/opencode.json"
|
||||
|
||||
# 参数解析
|
||||
MODEL_KEY=""
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-h|--help)
|
||||
echo "用法: runoc.sh [模型]"
|
||||
echo ""
|
||||
echo "模型: 45|45a|45f|46|46v|46vf|47|5|5t|51 (默认 51)"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
MODEL_KEY="$1"; shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
MODEL_KEY="${MODEL_KEY:-51}"
|
||||
case "$MODEL_KEY" in
|
||||
45) MODEL="zhipuai-coding-plan/glm-4.5" ;;
|
||||
45a) MODEL="zhipuai-coding-plan/glm-4.5-air" ;;
|
||||
45f) MODEL="zhipuai-coding-plan/glm-4.5-flash" ;;
|
||||
46) MODEL="zhipuai-coding-plan/glm-4.6" ;;
|
||||
46v) MODEL="zhipuai-coding-plan/glm-4.6v" ;;
|
||||
46vf) MODEL="zhipuai-coding-plan/glm-4.6v-flash" ;;
|
||||
47) MODEL="zhipuai-coding-plan/glm-4.7" ;;
|
||||
5) MODEL="zhipuai-coding-plan/glm-5" ;;
|
||||
5t) MODEL="zhipuai-coding-plan/glm-5-turbo" ;;
|
||||
51) MODEL="zhipuai-coding-plan/glm-5.1" ;;
|
||||
*)
|
||||
echo "未知模型: $MODEL_KEY (可选: 45|45a|45f|46|46v|46vf|47|5|5t|51)"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# ── tmux 模型传播(确保子 pane 能获取正确模型)─────────
|
||||
if [ -n "${TMUX:-}" ]; then
|
||||
SESSION_ID="$(tmux display-message -p '#{session_id}')"
|
||||
|
||||
# session 级环境变量
|
||||
tmux setenv -t "$SESSION_ID" OPENCODE_MODEL "$MODEL"
|
||||
|
||||
# pane 级选项(.bashrc 会在新 shell 启动时读取)
|
||||
tmux set-option -p @opencode_model "$MODEL"
|
||||
fi
|
||||
|
||||
# ── OpenCode 自更新检查(每日一次)──
|
||||
LAST_UPDATE_FILE="$HOME/.cache/opencode_update_last_run"
|
||||
TODAY=$(date +%Y-%m-%d)
|
||||
mkdir -p "$(dirname "$LAST_UPDATE_FILE")"
|
||||
|
||||
if [ ! -f "$LAST_UPDATE_FILE" ] || [ "$(cat "$LAST_UPDATE_FILE" 2>/dev/null)" != "$TODAY" ]; then
|
||||
opencode upgrade 2>/dev/null || true
|
||||
echo "$TODAY" > "$LAST_UPDATE_FILE"
|
||||
fi
|
||||
|
||||
# ── 构建启动参数 ──
|
||||
OC_ARGS=(-m "$MODEL")
|
||||
|
||||
echo "启动 OpenCode (模型: $MODEL)"
|
||||
opencode "${OC_ARGS[@]}"
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"env": {
|
||||
"ANTHROPIC_AUTH_TOKEN": "{{your_api_key}}",
|
||||
"ANTHROPIC_BASE_URL": "https://open.bigmodel.cn/api/anthropic",
|
||||
"API_TIMEOUT_MS": "3000000",
|
||||
"CLAUDE_CODE_AUTO_COMPACT_WINDOW": "200000",
|
||||
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
|
||||
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1",
|
||||
"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "75",
|
||||
"CLAUDE_CODE_NO_FLICKER": "1"
|
||||
},
|
||||
"enabledPlugins": {
|
||||
"code-simplifier@claude-plugins-official": true,
|
||||
"code-review@claude-plugins-official": true,
|
||||
"hookify@claude-plugins-official": true,
|
||||
"ralph-loop@claude-plugins-official": true,
|
||||
"skill-creator@claude-plugins-official": true,
|
||||
"typescript-lsp@claude-plugins-official": true,
|
||||
"pyright-lsp@claude-plugins-official": true,
|
||||
"superpowers@claude-plugins-official": true,
|
||||
"glm-plan-usage@zai-coding-plugins": true
|
||||
},
|
||||
"language": "Chinese",
|
||||
"skipDangerousModePermissionPrompt": true
|
||||
}
|
||||
Reference in New Issue
Block a user