ccman 1.0.1 → 2.0.0
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.
- package/.github/workflows/release.yml +5 -5
- package/CLAUDE.md +246 -185
- package/README.md +282 -249
- package/README_zh.md +283 -250
- package/dev-test.sh +40 -0
- package/dist/cli.js +421 -369
- package/dist/cli.js.map +1 -1
- package/dist/commands/lang.d.ts +3 -0
- package/dist/commands/lang.d.ts.map +1 -0
- package/dist/commands/lang.js +99 -0
- package/dist/commands/lang.js.map +1 -0
- package/dist/core/CCMConfigManager.d.ts +52 -0
- package/dist/core/CCMConfigManager.d.ts.map +1 -0
- package/dist/core/CCMConfigManager.js +203 -0
- package/dist/core/CCMConfigManager.js.map +1 -0
- package/dist/core/ClaudeConfigManager.d.ts +35 -0
- package/dist/core/ClaudeConfigManager.d.ts.map +1 -0
- package/dist/core/ClaudeConfigManager.js +151 -0
- package/dist/core/ClaudeConfigManager.js.map +1 -0
- package/dist/i18n/LanguageManager.d.ts +43 -0
- package/dist/i18n/LanguageManager.d.ts.map +1 -0
- package/dist/i18n/LanguageManager.js +157 -0
- package/dist/i18n/LanguageManager.js.map +1 -0
- package/dist/i18n/messages.d.ts +65 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +144 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -8
- package/dist/index.js.map +1 -1
- package/dist/providers/ProviderManager.d.ts +55 -0
- package/dist/providers/ProviderManager.d.ts.map +1 -0
- package/dist/providers/ProviderManager.js +326 -0
- package/dist/providers/ProviderManager.js.map +1 -0
- package/dist/types/index.d.ts +78 -38
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/version.d.ts +2 -64
- package/dist/utils/version.d.ts.map +1 -1
- package/dist/utils/version.js +12 -158
- package/dist/utils/version.js.map +1 -1
- package/package.json +2 -2
- package/release-temp/README.md +282 -249
- package/release-temp/package.json +2 -2
- package/scripts/modules/create-tag.sh +53 -10
- package/scripts/modules/monitor-release.sh +40 -12
- package/scripts/modules/version-bump.sh +14 -17
- package/scripts/smart-release-v3.sh +20 -26
- package/src/cli.ts +458 -394
- package/src/commands/lang.ts +105 -0
- package/src/core/CCMConfigManager.ts +185 -0
- package/src/core/ClaudeConfigManager.ts +127 -0
- package/src/i18n/LanguageManager.ts +169 -0
- package/src/i18n/messages.ts +233 -0
- package/src/index.ts +4 -5
- package/src/providers/ProviderManager.ts +380 -0
- package/src/types/index.ts +80 -39
- package/src/utils/version.ts +11 -184
- package/dist/config/ConfigManager.d.ts +0 -67
- package/dist/config/ConfigManager.d.ts.map +0 -1
- package/dist/config/ConfigManager.js +0 -226
- package/dist/config/ConfigManager.js.map +0 -1
- package/dist/config/EnvironmentManager.d.ts +0 -83
- package/dist/config/EnvironmentManager.d.ts.map +0 -1
- package/dist/config/EnvironmentManager.js +0 -280
- package/dist/config/EnvironmentManager.js.map +0 -1
- package/dist/config/constants.d.ts +0 -40
- package/dist/config/constants.d.ts.map +0 -1
- package/dist/config/constants.js +0 -97
- package/dist/config/constants.js.map +0 -1
- package/dist/shell/ShellManager.d.ts +0 -81
- package/dist/shell/ShellManager.d.ts.map +0 -1
- package/dist/shell/ShellManager.js +0 -490
- package/dist/shell/ShellManager.js.map +0 -1
- package/src/config/ConfigManager.ts +0 -227
- package/src/config/EnvironmentManager.ts +0 -327
- package/src/config/constants.ts +0 -64
- package/src/shell/ShellManager.ts +0 -526
|
@@ -43,12 +43,40 @@ check_tag_exists() {
|
|
|
43
43
|
fi
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
# 创建tag
|
|
46
|
+
# 创建tag(静默模式,只返回tag名称)
|
|
47
47
|
create_tag() {
|
|
48
48
|
local version=$1
|
|
49
49
|
local tag_name="v$version"
|
|
50
50
|
local force_flag=""
|
|
51
51
|
|
|
52
|
+
# 静默检查tag是否存在
|
|
53
|
+
if check_tag_exists "$tag_name"; then
|
|
54
|
+
# 静默删除现有tag
|
|
55
|
+
git tag -d "$tag_name" >/dev/null 2>&1
|
|
56
|
+
force_flag="--force"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# 静默创建tag
|
|
60
|
+
local tag_message="Release v$version
|
|
61
|
+
|
|
62
|
+
📦 发布版本 v$version
|
|
63
|
+
⏰ $(date '+%Y-%m-%d %H:%M:%S')
|
|
64
|
+
|
|
65
|
+
🤖 Generated with [Claude Code](https://claude.ai/code)
|
|
66
|
+
|
|
67
|
+
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
68
|
+
|
|
69
|
+
git tag -a "$tag_name" -m "$tag_message" >/dev/null 2>&1
|
|
70
|
+
|
|
71
|
+
# 只输出tag名称
|
|
72
|
+
echo "$tag_name"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
# 创建tag(交互模式,带打印信息)
|
|
76
|
+
create_tag_interactive() {
|
|
77
|
+
local version=$1
|
|
78
|
+
local tag_name="v$version"
|
|
79
|
+
|
|
52
80
|
print_info "检查tag: $tag_name"
|
|
53
81
|
|
|
54
82
|
if check_tag_exists "$tag_name"; then
|
|
@@ -59,7 +87,6 @@ create_tag() {
|
|
|
59
87
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
60
88
|
print_info "删除现有tag: $tag_name"
|
|
61
89
|
git tag -d "$tag_name"
|
|
62
|
-
force_flag="--force"
|
|
63
90
|
else
|
|
64
91
|
print_info "跳过tag创建,使用现有tag"
|
|
65
92
|
echo "$tag_name" # 返回tag名称
|
|
@@ -121,11 +148,11 @@ push_to_remote_quiet() {
|
|
|
121
148
|
# 推送提交(如果有)
|
|
122
149
|
if [ "$has_commit" = "true" ]; then
|
|
123
150
|
local current_branch=$(git branch --show-current)
|
|
124
|
-
git push origin "$current_branch"
|
|
151
|
+
git push origin "$current_branch" >/dev/null 2>&1
|
|
125
152
|
fi
|
|
126
153
|
|
|
127
154
|
# 推送tag
|
|
128
|
-
git push origin "$tag_name"
|
|
155
|
+
git push origin "$tag_name" >/dev/null 2>&1 || git push origin "$tag_name" --force >/dev/null 2>&1
|
|
129
156
|
}
|
|
130
157
|
|
|
131
158
|
# 推送tag和提交到远程(交互模式)
|
|
@@ -158,8 +185,8 @@ create_tag_quietly() {
|
|
|
158
185
|
# 检查tag是否已存在
|
|
159
186
|
if check_tag_exists "$tag_name"; then
|
|
160
187
|
# 如果tag存在,删除并重新创建
|
|
161
|
-
git tag -d "$tag_name"
|
|
162
|
-
git push origin --delete "$tag_name"
|
|
188
|
+
git tag -d "$tag_name" >/dev/null 2>&1
|
|
189
|
+
git push origin --delete "$tag_name" >/dev/null 2>&1
|
|
163
190
|
fi
|
|
164
191
|
|
|
165
192
|
# 创建tag
|
|
@@ -172,10 +199,10 @@ create_tag_quietly() {
|
|
|
172
199
|
|
|
173
200
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
174
201
|
|
|
175
|
-
git tag -a "$tag_name" -m "$tag_message"
|
|
202
|
+
git tag -a "$tag_name" -m "$tag_message" >/dev/null 2>&1
|
|
176
203
|
|
|
177
|
-
#
|
|
178
|
-
push_to_remote_quiet "$tag_name" "
|
|
204
|
+
# 静默推送(始终推送当前分支和tag)
|
|
205
|
+
push_to_remote_quiet "$tag_name" "true"
|
|
179
206
|
|
|
180
207
|
# 输出tag名称
|
|
181
208
|
echo "$tag_name"
|
|
@@ -199,8 +226,24 @@ create_tag_and_commit() {
|
|
|
199
226
|
exit 0
|
|
200
227
|
fi
|
|
201
228
|
|
|
202
|
-
# 创建tag
|
|
229
|
+
# 创建tag(显示交互信息)
|
|
230
|
+
print_info "检查tag: v$version"
|
|
231
|
+
if check_tag_exists "v$version"; then
|
|
232
|
+
print_warning "tag v$version 已存在"
|
|
233
|
+
read -p "是否要重新创建此tag? (y/N): " -n 1 -r
|
|
234
|
+
echo
|
|
235
|
+
|
|
236
|
+
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
237
|
+
print_info "删除现有tag: v$version"
|
|
238
|
+
git tag -d "v$version"
|
|
239
|
+
else
|
|
240
|
+
print_info "跳过tag创建,使用现有tag"
|
|
241
|
+
fi
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
print_info "创建tag: v$version"
|
|
203
245
|
local tag_name=$(create_tag "$version")
|
|
246
|
+
print_success "tag $tag_name 创建成功"
|
|
204
247
|
|
|
205
248
|
# 提交更改(如果有)
|
|
206
249
|
local has_commit="false"
|
|
@@ -74,12 +74,13 @@ check_github_actions() {
|
|
|
74
74
|
# 检查最新的workflow运行状态
|
|
75
75
|
local api_response=$(curl -s "https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/actions/runs?per_page=1" 2>/dev/null || echo "")
|
|
76
76
|
|
|
77
|
-
if [ -n "$api_response" ]; then
|
|
77
|
+
if [ -n "$api_response" ] && ! echo "$api_response" | grep -q '"message"'; then
|
|
78
78
|
local run_status=$(echo "$api_response" | grep -o '"status":"[^"]*"' | head -1 | cut -d'"' -f4 2>/dev/null || echo "unknown")
|
|
79
79
|
local run_conclusion=$(echo "$api_response" | grep -o '"conclusion":"[^"]*"' | head -1 | cut -d'"' -f4 2>/dev/null || echo "null")
|
|
80
80
|
|
|
81
81
|
case "$run_status" in
|
|
82
82
|
"completed")
|
|
83
|
+
echo # 换行
|
|
83
84
|
if [ "$run_conclusion" = "success" ]; then
|
|
84
85
|
print_success "GitHub Actions 构建成功! ✨"
|
|
85
86
|
return 0
|
|
@@ -156,9 +157,13 @@ check_github_release() {
|
|
|
156
157
|
|
|
157
158
|
if [ -n "$release_response" ] && ! echo "$release_response" | grep -q '"message":"Not Found"'; then
|
|
158
159
|
# 检查release状态
|
|
159
|
-
local release_draft=$(echo "$release_response" | grep -o '"draft":[^,}]*' | cut -d':' -f2 2>/dev/null || echo "true")
|
|
160
|
+
local release_draft=$(echo "$release_response" | grep -o '"draft":[^,}]*' | cut -d':' -f2 | tr -d ' ' 2>/dev/null || echo "true")
|
|
161
|
+
|
|
162
|
+
# 调试输出
|
|
163
|
+
# echo "[DEBUG] release_draft = '$release_draft'" >&2
|
|
160
164
|
|
|
161
165
|
if [ "$release_draft" = "false" ]; then
|
|
166
|
+
echo # 换行
|
|
162
167
|
print_success "GitHub Release v$version 创建成功! 🎉"
|
|
163
168
|
return 0
|
|
164
169
|
else
|
|
@@ -220,7 +225,7 @@ generate_summary() {
|
|
|
220
225
|
fi
|
|
221
226
|
}
|
|
222
227
|
|
|
223
|
-
# 主函数:
|
|
228
|
+
# 主函数: 监控发布状态(只监控NPM和Release)
|
|
224
229
|
monitor_release() {
|
|
225
230
|
local version=$(get_version_info)
|
|
226
231
|
local commit_id=$(get_latest_commit)
|
|
@@ -232,8 +237,12 @@ monitor_release() {
|
|
|
232
237
|
print_info "超时: ${MAX_WAIT_MINUTES} 分钟"
|
|
233
238
|
echo ""
|
|
234
239
|
|
|
235
|
-
#
|
|
236
|
-
|
|
240
|
+
# 显示监控链接(只显示需要的)
|
|
241
|
+
print_info "📊 监控链接:"
|
|
242
|
+
echo " 🔗 NPM Package: https://www.npmjs.com/package/${PACKAGE_NAME}"
|
|
243
|
+
echo " 🔗 NPM Version: https://www.npmjs.com/package/${PACKAGE_NAME}/v/${version}"
|
|
244
|
+
echo " 🔗 GitHub Release: https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/tag/v${version}"
|
|
245
|
+
echo ""
|
|
237
246
|
|
|
238
247
|
# 检查curl是否可用
|
|
239
248
|
if ! command -v curl &> /dev/null; then
|
|
@@ -242,16 +251,11 @@ monitor_release() {
|
|
|
242
251
|
return 1
|
|
243
252
|
fi
|
|
244
253
|
|
|
245
|
-
# 并行监控各个状态
|
|
246
254
|
print_info "开始监控发布状态... (最长等待 ${MAX_WAIT_MINUTES} 分钟)"
|
|
247
255
|
echo ""
|
|
248
256
|
|
|
249
|
-
# 检查GitHub Actions
|
|
250
|
-
check_github_actions
|
|
251
|
-
local actions_status=$?
|
|
252
|
-
|
|
253
257
|
# 检查NPM包发布
|
|
254
|
-
check_npm_package "$version"
|
|
258
|
+
check_npm_package "$version"
|
|
255
259
|
local npm_status=$?
|
|
256
260
|
|
|
257
261
|
# 检查GitHub Release
|
|
@@ -259,7 +263,31 @@ monitor_release() {
|
|
|
259
263
|
local release_status=$?
|
|
260
264
|
|
|
261
265
|
# 生成总结报告
|
|
262
|
-
|
|
266
|
+
echo ""
|
|
267
|
+
echo "📋 发布监控总结"
|
|
268
|
+
echo "================"
|
|
269
|
+
echo " 版本: v$version"
|
|
270
|
+
echo " NPM 包发布: $(get_status_icon $npm_status)"
|
|
271
|
+
echo " GitHub Release: $(get_status_icon $release_status)"
|
|
272
|
+
echo ""
|
|
273
|
+
|
|
274
|
+
# 结果判断
|
|
275
|
+
if [ $npm_status -eq 0 ] && [ $release_status -eq 0 ]; then
|
|
276
|
+
print_success "🎉 发布完成!NPM包和GitHub Release都已正常发布"
|
|
277
|
+
return 0
|
|
278
|
+
elif [ $npm_status -eq 2 ] || [ $release_status -eq 2 ]; then
|
|
279
|
+
print_warning "⚠️ 发布监控超时 (${MAX_WAIT_MINUTES}分钟),请手动检查:"
|
|
280
|
+
if [ $npm_status -eq 2 ]; then
|
|
281
|
+
echo " • NPM包状态: https://www.npmjs.com/package/${PACKAGE_NAME}/v/${version}"
|
|
282
|
+
fi
|
|
283
|
+
if [ $release_status -eq 2 ]; then
|
|
284
|
+
echo " • GitHub Release: https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/tag/v${version}"
|
|
285
|
+
fi
|
|
286
|
+
return 2
|
|
287
|
+
else
|
|
288
|
+
print_warning "⚠️ 发布部分失败,请手动检查上述链接"
|
|
289
|
+
return 1
|
|
290
|
+
fi
|
|
263
291
|
}
|
|
264
292
|
|
|
265
293
|
# 如果直接运行此脚本
|
|
@@ -37,8 +37,10 @@ get_current_version() {
|
|
|
37
37
|
calculate_version_preview() {
|
|
38
38
|
local version_type=$1
|
|
39
39
|
local preview=$(pnpm version $version_type --dry-run 2>/dev/null)
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
|
|
41
|
+
if [ -n "$preview" ]; then
|
|
42
|
+
# 移除前缀v并返回
|
|
43
|
+
echo "$preview" | sed 's/^v//'
|
|
42
44
|
else
|
|
43
45
|
echo "计算失败"
|
|
44
46
|
fi
|
|
@@ -64,9 +66,9 @@ version_bump() {
|
|
|
64
66
|
local version_type=${1:-""}
|
|
65
67
|
|
|
66
68
|
# 安静模式检测:如果被其他脚本调用,则静默运行
|
|
67
|
-
if [ "$0" != "${BASH_SOURCE[0]}" ] || [ "$version_type" = "test" ]; then
|
|
69
|
+
if [ "$0" != "${BASH_SOURCE[0]}" ] || [ "$version_type" = "test" ] || [ "$version_type" = "--quiet" ]; then
|
|
68
70
|
# 静默模式:只返回结果,不显示菜单
|
|
69
|
-
if [ -n "$version_type" ] && [ "$version_type" != "test" ]; then
|
|
71
|
+
if [ -n "$version_type" ] && [ "$version_type" != "test" ] && [ "$version_type" != "--quiet" ]; then
|
|
70
72
|
execute_version_bump_quiet "$version_type" "$current_version"
|
|
71
73
|
return $?
|
|
72
74
|
else
|
|
@@ -94,23 +96,18 @@ version_bump() {
|
|
|
94
96
|
show_version_menu "$current_version" "$suggested_type"
|
|
95
97
|
|
|
96
98
|
# 获取用户选择
|
|
97
|
-
read -p "请选择版本升级类型 (1-
|
|
99
|
+
read -p "请选择版本升级类型 (1-4, 回车默认选择推荐): " choice
|
|
98
100
|
|
|
99
101
|
# 处理用户选择
|
|
100
102
|
case ${choice:-""} in
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
elif [ "$suggested_type" == "minor" ]; then
|
|
105
|
-
version_type="minor"
|
|
106
|
-
else
|
|
107
|
-
version_type="major"
|
|
108
|
-
fi
|
|
103
|
+
"")
|
|
104
|
+
# 回车默认选择推荐版本
|
|
105
|
+
version_type="$suggested_type"
|
|
109
106
|
;;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
107
|
+
1) version_type="patch" ;;
|
|
108
|
+
2) version_type="minor" ;;
|
|
109
|
+
3) version_type="major" ;;
|
|
110
|
+
4) handle_custom_version ;;
|
|
114
111
|
*)
|
|
115
112
|
print_error "无效选择"
|
|
116
113
|
exit 1
|
|
@@ -119,32 +119,26 @@ step_version_bump() {
|
|
|
119
119
|
print_info "当前版本: v$current_version"
|
|
120
120
|
NEW_VERSION="$current_version"
|
|
121
121
|
else
|
|
122
|
-
print_info "
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
NEW_VERSION="$current_version"
|
|
143
|
-
;;
|
|
144
|
-
*)
|
|
145
|
-
print_error "无效选择"
|
|
146
|
-
;;
|
|
147
|
-
esac
|
|
122
|
+
print_info "启动版本升级流程..."
|
|
123
|
+
# 如果指定了版本类型,静默调用
|
|
124
|
+
if [ -n "$VERSION_TYPE" ]; then
|
|
125
|
+
# 使用source方式调用,然后直接调用静默函数
|
|
126
|
+
source "$MODULE_DIR/version-bump.sh"
|
|
127
|
+
NEW_VERSION=$(execute_version_bump_quiet "$VERSION_TYPE" "$(get_current_version)")
|
|
128
|
+
if [ -z "$NEW_VERSION" ]; then
|
|
129
|
+
print_error "版本升级失败"
|
|
130
|
+
fi
|
|
131
|
+
else
|
|
132
|
+
# 没有指定版本类型,调用交互模式
|
|
133
|
+
"$MODULE_DIR/version-bump.sh"
|
|
134
|
+
local version_result=$?
|
|
135
|
+
if [ $version_result -eq 0 ]; then
|
|
136
|
+
NEW_VERSION=$(node -p "require('./package.json').version")
|
|
137
|
+
else
|
|
138
|
+
print_error "版本升级失败"
|
|
139
|
+
fi
|
|
140
|
+
fi
|
|
141
|
+
print_success "版本升级成功: v$NEW_VERSION"
|
|
148
142
|
fi
|
|
149
143
|
|
|
150
144
|
echo ""
|