ccman 0.0.1

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.
Files changed (58) hide show
  1. package/.editorconfig +15 -0
  2. package/.eslintrc.js +28 -0
  3. package/.github/workflows/release.yml +213 -0
  4. package/.prettierrc +10 -0
  5. package/CLAUDE.md +215 -0
  6. package/README.md +361 -0
  7. package/README_zh.md +361 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +476 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/config/ConfigManager.d.ts +67 -0
  13. package/dist/config/ConfigManager.d.ts.map +1 -0
  14. package/dist/config/ConfigManager.js +226 -0
  15. package/dist/config/ConfigManager.js.map +1 -0
  16. package/dist/config/EnvironmentManager.d.ts +83 -0
  17. package/dist/config/EnvironmentManager.d.ts.map +1 -0
  18. package/dist/config/EnvironmentManager.js +280 -0
  19. package/dist/config/EnvironmentManager.js.map +1 -0
  20. package/dist/config/constants.d.ts +40 -0
  21. package/dist/config/constants.d.ts.map +1 -0
  22. package/dist/config/constants.js +97 -0
  23. package/dist/config/constants.js.map +1 -0
  24. package/dist/index.d.ts +5 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +26 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/shell/ShellManager.d.ts +73 -0
  29. package/dist/shell/ShellManager.d.ts.map +1 -0
  30. package/dist/shell/ShellManager.js +391 -0
  31. package/dist/shell/ShellManager.js.map +1 -0
  32. package/dist/types/index.d.ts +55 -0
  33. package/dist/types/index.d.ts.map +1 -0
  34. package/dist/types/index.js +6 -0
  35. package/dist/types/index.js.map +1 -0
  36. package/dist/utils/version.d.ts +67 -0
  37. package/dist/utils/version.d.ts.map +1 -0
  38. package/dist/utils/version.js +199 -0
  39. package/dist/utils/version.js.map +1 -0
  40. package/docs/npm-publish-guide.md +71 -0
  41. package/docs/release-guide.md +86 -0
  42. package/docs/version-management.md +64 -0
  43. package/jest.config.js +22 -0
  44. package/package.json +57 -0
  45. package/release-temp/README.md +361 -0
  46. package/release-temp/package.json +57 -0
  47. package/scripts/publish-local.sh +91 -0
  48. package/scripts/quick-release.sh +100 -0
  49. package/scripts/release.sh +430 -0
  50. package/src/cli.ts +510 -0
  51. package/src/config/ConfigManager.ts +227 -0
  52. package/src/config/EnvironmentManager.ts +327 -0
  53. package/src/config/constants.ts +64 -0
  54. package/src/index.ts +5 -0
  55. package/src/shell/ShellManager.ts +416 -0
  56. package/src/types/index.ts +60 -0
  57. package/src/utils/version.ts +189 -0
  58. package/tsconfig.json +25 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Claude Code Manager 类型定义
3
+ */
4
+ export interface ClaudeEnv {
5
+ /** 环境名称 */
6
+ name: string;
7
+ /** API 基础 URL */
8
+ baseUrl: string;
9
+ /** API 密钥 */
10
+ apiKey: string;
11
+ /** 创建时间 */
12
+ createdAt: string;
13
+ /** 最后使用时间 */
14
+ lastUsed?: string;
15
+ }
16
+ export interface Config {
17
+ /** 当前使用的环境名称 */
18
+ current: string | null;
19
+ /** 环境配置列表 */
20
+ environments: {
21
+ [name: string]: ClaudeEnv;
22
+ };
23
+ /** 全局设置 */
24
+ settings: GlobalSettings;
25
+ }
26
+ export interface GlobalSettings {
27
+ /** 是否自动写入 shell 配置文件 */
28
+ autoWriteShell: boolean;
29
+ /** 首选的 shell 类型 */
30
+ preferredShell: 'bash' | 'zsh' | 'auto';
31
+ /** shell 配置文件路径(可自定义) */
32
+ shellConfigPath?: string;
33
+ }
34
+ export interface ShellEnvVars {
35
+ ANTHROPIC_BASE_URL: string;
36
+ ANTHROPIC_AUTH_TOKEN: string;
37
+ }
38
+ export interface AddEnvOptions {
39
+ name: string;
40
+ baseUrl: string;
41
+ apiKey: string;
42
+ autoWriteShell?: boolean;
43
+ }
44
+ export interface ShellWriteResult {
45
+ success: boolean;
46
+ filePath: string;
47
+ message: string;
48
+ error?: string;
49
+ }
50
+ export interface EnvironmentListItem extends ClaudeEnv {
51
+ /** 是否为当前使用的环境 */
52
+ isCurrent: boolean;
53
+ }
54
+ export type ShellType = 'bash' | 'zsh' | 'fish' | 'unknown';
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,gBAAgB;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa;IACb,YAAY,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC5C,WAAW;IACX,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB;IACnB,cAAc,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACxC,yBAAyB;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,iBAAiB;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Claude Code Manager 类型定义
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * 版本信息接口
3
+ */
4
+ export interface VersionInfo {
5
+ version: string;
6
+ major: number;
7
+ minor: number;
8
+ patch: number;
9
+ prerelease?: string;
10
+ }
11
+ /**
12
+ * 版本工具类
13
+ */
14
+ export declare class VersionManager {
15
+ private static instance;
16
+ private cachedVersion?;
17
+ private constructor();
18
+ /**
19
+ * 获取单例实例
20
+ */
21
+ static getInstance(): VersionManager;
22
+ /**
23
+ * 获取当前版本信息
24
+ */
25
+ getCurrentVersion(): VersionInfo;
26
+ /**
27
+ * 获取版本字符串
28
+ */
29
+ getVersionString(): string;
30
+ /**
31
+ * 解析版本字符串
32
+ */
33
+ private parseVersion;
34
+ /**
35
+ * 获取 package.json 路径
36
+ */
37
+ private getPackageJsonPath;
38
+ /**
39
+ * 预测下一个版本
40
+ */
41
+ getNextVersion(type: 'patch' | 'minor' | 'major'): string;
42
+ /**
43
+ * 获取版本变更建议(基于 git 历史分析)
44
+ */
45
+ getVersionSuggestion(): Promise<'patch' | 'minor' | 'major'>;
46
+ /**
47
+ * 清除缓存(测试用)
48
+ */
49
+ clearCache(): void;
50
+ }
51
+ /**
52
+ * 便捷函数:获取当前版本字符串
53
+ */
54
+ export declare function getCurrentVersion(): string;
55
+ /**
56
+ * 便捷函数:获取版本信息
57
+ */
58
+ export declare function getVersionInfo(): VersionInfo;
59
+ /**
60
+ * 便捷函数:获取下一个版本
61
+ */
62
+ export declare function getNextVersion(type: 'patch' | 'minor' | 'major'): string;
63
+ /**
64
+ * 便捷函数:获取版本建议
65
+ */
66
+ export declare function getVersionSuggestion(): Promise<'patch' | 'minor' | 'major'>;
67
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,aAAa,CAAC,CAAc;IAEpC,OAAO;IAEP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,cAAc;IAOpC;;OAEG;IACH,iBAAiB,IAAI,WAAW;IAmBhC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM;IAezD;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IA0BlE;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAExE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,CAEjF"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.VersionManager = void 0;
37
+ exports.getCurrentVersion = getCurrentVersion;
38
+ exports.getVersionInfo = getVersionInfo;
39
+ exports.getNextVersion = getNextVersion;
40
+ exports.getVersionSuggestion = getVersionSuggestion;
41
+ const fs_1 = require("fs");
42
+ const path_1 = require("path");
43
+ /**
44
+ * 版本工具类
45
+ */
46
+ class VersionManager {
47
+ constructor() { }
48
+ /**
49
+ * 获取单例实例
50
+ */
51
+ static getInstance() {
52
+ if (!VersionManager.instance) {
53
+ VersionManager.instance = new VersionManager();
54
+ }
55
+ return VersionManager.instance;
56
+ }
57
+ /**
58
+ * 获取当前版本信息
59
+ */
60
+ getCurrentVersion() {
61
+ if (this.cachedVersion) {
62
+ return this.cachedVersion;
63
+ }
64
+ try {
65
+ const packageJsonPath = this.getPackageJsonPath();
66
+ const packageJson = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf8'));
67
+ const version = packageJson.version;
68
+ this.cachedVersion = this.parseVersion(version);
69
+ return this.cachedVersion;
70
+ }
71
+ catch (error) {
72
+ console.warn('⚠️ 无法读取版本信息,使用默认版本');
73
+ this.cachedVersion = this.parseVersion('0.0.1');
74
+ return this.cachedVersion;
75
+ }
76
+ }
77
+ /**
78
+ * 获取版本字符串
79
+ */
80
+ getVersionString() {
81
+ return this.getCurrentVersion().version;
82
+ }
83
+ /**
84
+ * 解析版本字符串
85
+ */
86
+ parseVersion(versionString) {
87
+ const match = versionString.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/);
88
+ if (!match) {
89
+ throw new Error(`无效的版本格式: ${versionString}`);
90
+ }
91
+ const [, major, minor, patch, prerelease] = match;
92
+ return {
93
+ version: versionString,
94
+ major: parseInt(major, 10),
95
+ minor: parseInt(minor, 10),
96
+ patch: parseInt(patch, 10),
97
+ prerelease
98
+ };
99
+ }
100
+ /**
101
+ * 获取 package.json 路径
102
+ */
103
+ getPackageJsonPath() {
104
+ // 在构建后的环境中,package.json 在 ../package.json
105
+ // 在开发环境中,可能在不同的位置
106
+ const paths = [
107
+ (0, path_1.join)(__dirname, '../package.json'), // 构建后
108
+ (0, path_1.join)(__dirname, '../../package.json'), // 开发环境
109
+ (0, path_1.join)(process.cwd(), 'package.json') // 当前工作目录
110
+ ];
111
+ for (const path of paths) {
112
+ try {
113
+ (0, fs_1.readFileSync)(path, 'utf8');
114
+ return path;
115
+ }
116
+ catch {
117
+ continue;
118
+ }
119
+ }
120
+ throw new Error('找不到 package.json 文件');
121
+ }
122
+ /**
123
+ * 预测下一个版本
124
+ */
125
+ getNextVersion(type) {
126
+ const current = this.getCurrentVersion();
127
+ switch (type) {
128
+ case 'patch':
129
+ return `${current.major}.${current.minor}.${current.patch + 1}`;
130
+ case 'minor':
131
+ return `${current.major}.${current.minor + 1}.0`;
132
+ case 'major':
133
+ return `${current.major + 1}.0.0`;
134
+ default:
135
+ throw new Error(`不支持的版本类型: ${type}`);
136
+ }
137
+ }
138
+ /**
139
+ * 获取版本变更建议(基于 git 历史分析)
140
+ */
141
+ async getVersionSuggestion() {
142
+ try {
143
+ // 这里可以添加 git 历史分析逻辑
144
+ // 比如分析提交信息中的关键词来推荐版本类型
145
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
146
+ const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
147
+ const execAsync = promisify(exec);
148
+ // 获取最近的提交信息
149
+ const { stdout } = await execAsync('git log --oneline -10');
150
+ const commits = stdout.toLowerCase();
151
+ // 简单的启发式规则
152
+ if (commits.includes('breaking') || commits.includes('major')) {
153
+ return 'major';
154
+ }
155
+ else if (commits.includes('feat') || commits.includes('feature') || commits.includes('add')) {
156
+ return 'minor';
157
+ }
158
+ else {
159
+ return 'patch';
160
+ }
161
+ }
162
+ catch {
163
+ // 默认推荐 patch
164
+ return 'patch';
165
+ }
166
+ }
167
+ /**
168
+ * 清除缓存(测试用)
169
+ */
170
+ clearCache() {
171
+ this.cachedVersion = undefined;
172
+ }
173
+ }
174
+ exports.VersionManager = VersionManager;
175
+ /**
176
+ * 便捷函数:获取当前版本字符串
177
+ */
178
+ function getCurrentVersion() {
179
+ return VersionManager.getInstance().getVersionString();
180
+ }
181
+ /**
182
+ * 便捷函数:获取版本信息
183
+ */
184
+ function getVersionInfo() {
185
+ return VersionManager.getInstance().getCurrentVersion();
186
+ }
187
+ /**
188
+ * 便捷函数:获取下一个版本
189
+ */
190
+ function getNextVersion(type) {
191
+ return VersionManager.getInstance().getNextVersion(type);
192
+ }
193
+ /**
194
+ * 便捷函数:获取版本建议
195
+ */
196
+ async function getVersionSuggestion() {
197
+ return VersionManager.getInstance().getVersionSuggestion();
198
+ }
199
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ # NPM 发布配置指南
2
+
3
+ ## 🔐 步骤一:获取 NPM Token
4
+
5
+ ```bash
6
+ # 1. 登录 NPM
7
+ npm login
8
+
9
+ # 2. 创建发布权限的 token
10
+ npm token create --read-only=false
11
+ ```
12
+
13
+ 复制生成的 token(格式:`npm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`)
14
+
15
+ ## 🔧 步骤二:设置 GitHub Secrets
16
+
17
+ 1. 访问:`https://github.com/2ue/ccm/settings/secrets/actions`
18
+ 2. 点击 **"New repository secret"**
19
+ 3. 设置:
20
+ - **Name**: `NPM_TOKEN`
21
+ - **Secret**: 粘贴你的 NPM token
22
+ 4. 点击 **"Add secret"**
23
+
24
+ ### 验证设置
25
+ 设置完成后,应看到:
26
+ ```
27
+ Repository secrets:
28
+ • NPM_TOKEN ••••••••••••••••••••••••••••••••••••••••
29
+ ```
30
+
31
+ ### 关于 GITHUB_TOKEN
32
+ **无需手动设置** - GitHub Actions 自动提供此 token
33
+
34
+ ## 🚀 步骤三:发布
35
+
36
+ ### 自动发布(推荐)
37
+ ```bash
38
+ # 交互式选择版本
39
+ pnpm run release:interactive
40
+
41
+ # 或指定版本类型
42
+ pnpm run release:patch
43
+ pnpm run release:minor
44
+ pnpm run release:major
45
+ ```
46
+
47
+ ### 本地发布(备用)
48
+ ```bash
49
+ pnpm run publish:local
50
+ ```
51
+
52
+ ## 🔍 故障排查
53
+
54
+ ### 401 Unauthorized
55
+ - 检查 NPM token 是否正确设置
56
+ - 重新生成 token: `npm token create --read-only=false`
57
+
58
+ ### 403 Forbidden
59
+ - 包名已存在:修改 package.json 中的 name
60
+ - 检查发布权限:`npm owner ls ccman`
61
+
62
+ ### 测试发布权限
63
+ ```bash
64
+ npm publish --dry-run
65
+ ```
66
+
67
+ ## 🛡️ 安全提醒
68
+
69
+ - NPM token 只存储在 GitHub Secrets 中
70
+ - 定期轮换 token(建议 90 天)
71
+ - Token 泄露时立即删除并重新创建
@@ -0,0 +1,86 @@
1
+ # 发布指南
2
+
3
+ ## 📋 发布前准备
4
+
5
+ 1. **设置 NPM Token**:参见 [setup-github-secrets.md](./setup-github-secrets.md)
6
+ 2. **确保工作目录干净**:`git status`
7
+ 3. **确保在主分支**:`git checkout main`
8
+
9
+ ## 🚀 发布方式
10
+
11
+ ### 方式一:交互式发布(推荐)
12
+ ```bash
13
+ # 交互选择版本类型
14
+ pnpm run release:interactive
15
+ ```
16
+
17
+ ### 方式二:快速发布
18
+ ```bash
19
+ # 指定版本类型
20
+ pnpm run release:patch # 0.0.1 → 0.0.2
21
+ pnpm run release:minor # 0.0.1 → 0.1.0
22
+ pnpm run release:major # 0.0.1 → 1.0.0
23
+ ```
24
+
25
+ ### 方式三:完整发布流程
26
+ ```bash
27
+ # 包含分支管理的完整流程
28
+ pnpm run release
29
+ ```
30
+
31
+ ### 方式四:本地发布(备用)
32
+ ```bash
33
+ # 直接发布到 NPM(跳过 GitHub Actions)
34
+ pnpm run publish:local
35
+ ```
36
+
37
+ ## 📊 发布后验证
38
+
39
+ ### 1. 检查 GitHub Actions
40
+ 访问:https://github.com/2ue/ccm/actions
41
+ - 等待构建完成(约 2-3 分钟)
42
+ - 确认状态为 ✅ 成功
43
+
44
+ ### 2. 验证结果
45
+ - **NPM 包**:https://www.npmjs.com/package/ccman
46
+ - **GitHub Release**:https://github.com/2ue/ccm/releases
47
+ - **测试安装**:`npm install -g ccman`
48
+
49
+ ## 🔧 故障排查
50
+
51
+ ### GitHub Actions 失败
52
+ 1. 检查 `NPM_TOKEN` 设置是否正确
53
+ 2. 查看 Actions 日志获取详细错误信息
54
+ 3. 确认包名未被占用
55
+
56
+ ### 版本冲突
57
+ ```bash
58
+ # 检查已存在的版本
59
+ npm view ccman versions --json
60
+
61
+ # 使用新版本号重新发布
62
+ pnpm run release:patch
63
+ ```
64
+
65
+ ### 手动创建标签(高级)
66
+ ```bash
67
+ # 如果脚本失败,可手动操作
68
+ pnpm version patch --no-git-tag-version
69
+ git add . && git commit -m "chore: 发布版本 v0.0.2"
70
+ git tag -a v0.0.2 -m "Release v0.0.2"
71
+ git push origin main && git push origin v0.0.2
72
+ ```
73
+
74
+ ## ✅ 发布检查清单
75
+
76
+ ### 发布前
77
+ - [ ] NPM token 已设置
78
+ - [ ] 工作目录干净
79
+ - [ ] 在主分支
80
+ - [ ] 构建和测试通过
81
+
82
+ ### 发布后
83
+ - [ ] GitHub Actions 成功
84
+ - [ ] NPM 包可安装
85
+ - [ ] GitHub Release 创建
86
+ - [ ] 版本号正确
@@ -0,0 +1,64 @@
1
+ # 版本管理
2
+
3
+ ## 🎯 版本工具
4
+
5
+ 项目使用独立的版本工具模块 `src/utils/version.ts`:
6
+
7
+ ```typescript
8
+ import { getCurrentVersion } from './utils/version';
9
+
10
+ // CLI 自动获取版本
11
+ program.version(getCurrentVersion());
12
+ ```
13
+
14
+ ## 📦 发布脚本功能
15
+
16
+ ### 智能版本推荐
17
+ 脚本会分析最近的 git 提交,自动推荐合适的版本类型:
18
+ - `feat`, `feature` → minor 版本
19
+ - `breaking`, `major` → major 版本
20
+ - 其他 → patch 版本
21
+
22
+ ### 交互式界面
23
+ ```bash
24
+ 📦 版本升级选项:
25
+
26
+ ✨ [推荐] 1) 🔧 patch (修订版本) 0.0.1 → 0.0.2
27
+ 2) ✨ minor (次版本) 0.0.1 → 0.1.0
28
+ 3) 🚀 major (主版本) 0.0.1 → 1.0.0
29
+
30
+ 请选择版本类型 (1-3, 回车默认选择推荐项):
31
+ ```
32
+
33
+ ## 🚀 使用方式
34
+
35
+ ### 快速发布
36
+ ```bash
37
+ pnpm run release:patch # 直接发布 patch 版本
38
+ pnpm run release:minor # 直接发布 minor 版本
39
+ pnpm run release:major # 直接发布 major 版本
40
+ ```
41
+
42
+ ### 交互式发布
43
+ ```bash
44
+ pnpm run release:interactive # 交互选择版本类型
45
+ pnpm run release # 完整发布流程
46
+ ```
47
+
48
+ ### 本地发布
49
+ ```bash
50
+ pnpm run publish:local # 绕过 GitHub Actions
51
+ ```
52
+
53
+ ## 🎯 版本管理最佳实践
54
+
55
+ ### 语义化版本
56
+ - **patch (0.0.x)**: Bug 修复、小改进
57
+ - **minor (0.x.0)**: 新功能、向后兼容
58
+ - **major (x.0.0)**: 破坏性更改、重大重构
59
+
60
+ ### 工具特性
61
+ - ✅ 版本号统一管理(package.json)
62
+ - ✅ 智能推荐基于 git 提交分析
63
+ - ✅ 交互式界面友好
64
+ - ✅ 支持多种发布模式
package/jest.config.js ADDED
@@ -0,0 +1,22 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ roots: ['<rootDir>/src'],
5
+ testMatch: [
6
+ '**/__tests__/**/*.ts',
7
+ '**/?(*.)+(spec|test).ts'
8
+ ],
9
+ transform: {
10
+ '^.+\\.ts$': 'ts-jest'
11
+ },
12
+ collectCoverageFrom: [
13
+ 'src/**/*.ts',
14
+ '!src/**/*.d.ts',
15
+ '!src/index.ts', // 简单的导出文件
16
+ '!src/cli.ts' // CLI入口文件,主要是命令定义
17
+ ],
18
+ coverageDirectory: 'coverage',
19
+ coverageReporters: ['text', 'lcov', 'html'],
20
+ moduleFileExtensions: ['ts', 'js', 'json'],
21
+ testTimeout: 10000
22
+ };
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "ccman",
3
+ "version": "0.0.1",
4
+ "description": "Claude Code Manager - A TypeScript tool to manage Claude Code API configurations",
5
+ "main": "dist/index.js",
6
+ "packageManager": "pnpm@8.15.1",
7
+ "bin": {
8
+ "ccman": "./dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/cli.ts",
13
+ "start": "node dist/cli.js",
14
+ "test": "jest --passWithNoTests",
15
+ "lint": "eslint src/**/*.ts",
16
+ "clean": "rm -rf dist",
17
+ "release": "./scripts/release.sh",
18
+ "release:patch": "./scripts/quick-release.sh patch",
19
+ "release:minor": "./scripts/quick-release.sh minor",
20
+ "release:major": "./scripts/quick-release.sh major",
21
+ "release:interactive": "./scripts/quick-release.sh",
22
+ "publish:local": "./scripts/publish-local.sh",
23
+ "prepublishOnly": "pnpm run clean && pnpm run build && pnpm run lint"
24
+ },
25
+ "keywords": [
26
+ "claude",
27
+ "claude-code",
28
+ "api",
29
+ "config",
30
+ "manager",
31
+ "cli",
32
+ "typescript"
33
+ ],
34
+ "author": "",
35
+ "license": "MIT",
36
+ "dependencies": {
37
+ "commander": "^11.0.0",
38
+ "chalk": "^4.1.2",
39
+ "inquirer": "^8.2.6"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.0.0",
43
+ "@types/inquirer": "^9.0.0",
44
+ "typescript": "^5.0.0",
45
+ "tsx": "^4.0.0",
46
+ "eslint": "^8.0.0",
47
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
48
+ "@typescript-eslint/parser": "^6.0.0",
49
+ "jest": "^29.0.0",
50
+ "@types/jest": "^29.0.0",
51
+ "ts-jest": "^29.0.0",
52
+ "prettier": "^3.0.0"
53
+ },
54
+ "engines": {
55
+ "node": ">=16.0.0"
56
+ }
57
+ }