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.
- package/.editorconfig +15 -0
- package/.eslintrc.js +28 -0
- package/.github/workflows/release.yml +213 -0
- package/.prettierrc +10 -0
- package/CLAUDE.md +215 -0
- package/README.md +361 -0
- package/README_zh.md +361 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +476 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +67 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +226 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/EnvironmentManager.d.ts +83 -0
- package/dist/config/EnvironmentManager.d.ts.map +1 -0
- package/dist/config/EnvironmentManager.js +280 -0
- package/dist/config/EnvironmentManager.js.map +1 -0
- package/dist/config/constants.d.ts +40 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +97 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/shell/ShellManager.d.ts +73 -0
- package/dist/shell/ShellManager.d.ts.map +1 -0
- package/dist/shell/ShellManager.js +391 -0
- package/dist/shell/ShellManager.js.map +1 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/version.d.ts +67 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +199 -0
- package/dist/utils/version.js.map +1 -0
- package/docs/npm-publish-guide.md +71 -0
- package/docs/release-guide.md +86 -0
- package/docs/version-management.md +64 -0
- package/jest.config.js +22 -0
- package/package.json +57 -0
- package/release-temp/README.md +361 -0
- package/release-temp/package.json +57 -0
- package/scripts/publish-local.sh +91 -0
- package/scripts/quick-release.sh +100 -0
- package/scripts/release.sh +430 -0
- package/src/cli.ts +510 -0
- package/src/config/ConfigManager.ts +227 -0
- package/src/config/EnvironmentManager.ts +327 -0
- package/src/config/constants.ts +64 -0
- package/src/index.ts +5 -0
- package/src/shell/ShellManager.ts +416 -0
- package/src/types/index.ts +60 -0
- package/src/utils/version.ts +189 -0
- 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 @@
|
|
|
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
|
+
}
|