yunheai 0.1.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/README.md +45 -0
- package/dist/backup.d.ts +20 -0
- package/dist/backup.js +54 -0
- package/dist/backup.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +149 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cleanup.d.ts +12 -0
- package/dist/commands/cleanup.js +40 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/inspect.d.ts +7 -0
- package/dist/commands/inspect.js +6 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/quick-setup.d.ts +13 -0
- package/dist/commands/quick-setup.js +43 -0
- package/dist/commands/quick-setup.js.map +1 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.js +12 -0
- package/dist/constants.js.map +1 -0
- package/dist/json-file.d.ts +2 -0
- package/dist/json-file.js +26 -0
- package/dist/json-file.js.map +1 -0
- package/dist/mask.d.ts +1 -0
- package/dist/mask.js +11 -0
- package/dist/mask.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.js +13 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompts.d.ts +6 -0
- package/dist/prompts.js +38 -0
- package/dist/prompts.js.map +1 -0
- package/dist/tools/claude.d.ts +15 -0
- package/dist/tools/claude.js +57 -0
- package/dist/tools/claude.js.map +1 -0
- package/dist/tools/codex.d.ts +16 -0
- package/dist/tools/codex.js +121 -0
- package/dist/tools/codex.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# yunheai
|
|
2
|
+
|
|
3
|
+
云盒AI Codex / Claude Code 配置工具。
|
|
4
|
+
|
|
5
|
+
## 使用
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx yunheai@latest
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
也可以直接运行子命令:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx yunheai@latest quick-setup
|
|
15
|
+
npx yunheai@latest inspect
|
|
16
|
+
npx yunheai@latest cleanup
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 会修改哪些文件
|
|
20
|
+
|
|
21
|
+
快速配置和清理前会自动备份相关文件到:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
~/.yunheai/backups/<时间戳>/
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Codex:
|
|
28
|
+
|
|
29
|
+
- `~/.codex/config.toml`
|
|
30
|
+
- `~/.codex/auth.json`
|
|
31
|
+
|
|
32
|
+
Claude Code:
|
|
33
|
+
|
|
34
|
+
- `~/.claude/settings.json`
|
|
35
|
+
|
|
36
|
+
## 云盒AI地址
|
|
37
|
+
|
|
38
|
+
- 通用地址:`https://ai.shangyunhe.com`
|
|
39
|
+
- Codex 地址:`https://ai.shangyunhe.com/v1`
|
|
40
|
+
|
|
41
|
+
## 当前限制
|
|
42
|
+
|
|
43
|
+
- 暂未接入购买接口。
|
|
44
|
+
- 暂未接入用量、余额或账单查询接口。
|
|
45
|
+
- 首版只实际支持 Codex 和 Claude Code。
|
package/dist/backup.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface CreateBackupOptions {
|
|
2
|
+
homeDir?: string;
|
|
3
|
+
operation: "quick-setup" | "cleanup";
|
|
4
|
+
files: string[];
|
|
5
|
+
now?: Date;
|
|
6
|
+
}
|
|
7
|
+
export interface BackupFileEntry {
|
|
8
|
+
sourcePath: string;
|
|
9
|
+
backupPath: string | null;
|
|
10
|
+
existed: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface BackupManifest {
|
|
13
|
+
operation: CreateBackupOptions["operation"];
|
|
14
|
+
createdAt: string;
|
|
15
|
+
files: BackupFileEntry[];
|
|
16
|
+
}
|
|
17
|
+
export interface BackupResult extends BackupManifest {
|
|
18
|
+
backupDir: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function createBackup(options: CreateBackupOptions): Promise<BackupResult>;
|
package/dist/backup.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { copyFile, mkdir, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolvePaths } from "./paths.js";
|
|
4
|
+
export async function createBackup(options) {
|
|
5
|
+
const paths = resolvePaths(options.homeDir);
|
|
6
|
+
const createdAt = (options.now ?? new Date()).toISOString();
|
|
7
|
+
const safeTimestamp = createdAt.replace(/[:.]/g, "-");
|
|
8
|
+
const backupDir = path.join(paths.backupsDir, safeTimestamp);
|
|
9
|
+
await mkdir(backupDir, { recursive: true });
|
|
10
|
+
const files = [];
|
|
11
|
+
for (const sourcePath of options.files) {
|
|
12
|
+
const existed = await fileExists(sourcePath);
|
|
13
|
+
if (!existed) {
|
|
14
|
+
files.push({ sourcePath, backupPath: null, existed: false });
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const backupName = encodeBackupName(sourcePath);
|
|
18
|
+
const backupPath = path.join(backupDir, backupName);
|
|
19
|
+
await copyFile(sourcePath, backupPath);
|
|
20
|
+
files.push({ sourcePath, backupPath, existed: true });
|
|
21
|
+
}
|
|
22
|
+
const manifest = {
|
|
23
|
+
operation: options.operation,
|
|
24
|
+
createdAt,
|
|
25
|
+
files
|
|
26
|
+
};
|
|
27
|
+
await writeFile(path.join(backupDir, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
28
|
+
return { ...manifest, backupDir };
|
|
29
|
+
}
|
|
30
|
+
async function fileExists(filePath) {
|
|
31
|
+
try {
|
|
32
|
+
const info = await stat(filePath);
|
|
33
|
+
return info.isFile();
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (isFileNotFoundError(error)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isFileNotFoundError(error) {
|
|
43
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
44
|
+
}
|
|
45
|
+
function encodeBackupName(sourcePath) {
|
|
46
|
+
const driveMatch = sourcePath.match(/^([A-Za-z]):/);
|
|
47
|
+
const drivePrefix = driveMatch ? `${driveMatch[1].toUpperCase()}__` : "";
|
|
48
|
+
const normalizedPath = sourcePath
|
|
49
|
+
.replace(/^[A-Za-z]:/, "")
|
|
50
|
+
.replace(/^[/\\]+/, "")
|
|
51
|
+
.replace(/[\\/]+/g, "__");
|
|
52
|
+
return encodeURIComponent(`${drivePrefix}${normalizedPath}`);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { runCleanup } from "./commands/cleanup.js";
|
|
5
|
+
import { runInspect } from "./commands/inspect.js";
|
|
6
|
+
import { runQuickSetup } from "./commands/quick-setup.js";
|
|
7
|
+
import { YUNHEAI_BASE_URL } from "./constants.js";
|
|
8
|
+
import { maskApiKey } from "./mask.js";
|
|
9
|
+
import { askApiKey, askConfirm, askMainMenu, askTools } from "./prompts.js";
|
|
10
|
+
const defaultIo = {
|
|
11
|
+
writeOut(text) {
|
|
12
|
+
process.stdout.write(text);
|
|
13
|
+
},
|
|
14
|
+
writeErr(text) {
|
|
15
|
+
process.stderr.write(text);
|
|
16
|
+
},
|
|
17
|
+
get isTty() {
|
|
18
|
+
return Boolean(process.stdin.isTTY);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
export async function main(argv = process.argv, io = defaultIo) {
|
|
22
|
+
const program = new Command();
|
|
23
|
+
program
|
|
24
|
+
.name("yunheai")
|
|
25
|
+
.description("云盒AI Codex / Claude Code 配置工具")
|
|
26
|
+
.version("0.1.0")
|
|
27
|
+
.configureOutput({
|
|
28
|
+
writeOut: io.writeOut,
|
|
29
|
+
writeErr: io.writeErr
|
|
30
|
+
})
|
|
31
|
+
.exitOverride();
|
|
32
|
+
program
|
|
33
|
+
.command("quick-setup")
|
|
34
|
+
.description("快速配置 Codex 和 Claude Code")
|
|
35
|
+
.action(async () => {
|
|
36
|
+
await quickSetupFlow(io);
|
|
37
|
+
});
|
|
38
|
+
program
|
|
39
|
+
.command("inspect")
|
|
40
|
+
.description("查看本机云盒AI配置状态")
|
|
41
|
+
.action(async () => {
|
|
42
|
+
await inspectFlow(io);
|
|
43
|
+
});
|
|
44
|
+
program
|
|
45
|
+
.command("cleanup")
|
|
46
|
+
.description("清除本机云盒AI API Key")
|
|
47
|
+
.action(async () => {
|
|
48
|
+
await cleanupFlow(io);
|
|
49
|
+
});
|
|
50
|
+
program.action(async () => {
|
|
51
|
+
if (!io.isTty) {
|
|
52
|
+
program.help();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
await menuLoop(io);
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
await program.parseAsync(argv);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (isCommanderHelp(error)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function menuLoop(io) {
|
|
68
|
+
printHeader(io);
|
|
69
|
+
while (true) {
|
|
70
|
+
const action = await askMainMenu();
|
|
71
|
+
if (action === "exit") {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (action === "quick-setup") {
|
|
75
|
+
await quickSetupFlow(io);
|
|
76
|
+
}
|
|
77
|
+
if (action === "inspect") {
|
|
78
|
+
await inspectFlow(io);
|
|
79
|
+
}
|
|
80
|
+
if (action === "cleanup") {
|
|
81
|
+
await cleanupFlow(io);
|
|
82
|
+
}
|
|
83
|
+
if (action === "language") {
|
|
84
|
+
io.writeOut("首版默认中文,后续版本将支持更多语言。\n");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function quickSetupFlow(io) {
|
|
89
|
+
io.writeOut(`云盒AI服务地址: ${YUNHEAI_BASE_URL}\n`);
|
|
90
|
+
const apiKey = await askApiKey();
|
|
91
|
+
const tools = await askTools("请选择要配置的工具");
|
|
92
|
+
io.writeOut(`即将配置: ${tools.join(", ")}\n`);
|
|
93
|
+
io.writeOut(`API Key: ${maskApiKey(apiKey)}\n`);
|
|
94
|
+
const ok = await askConfirm("确认配置?");
|
|
95
|
+
if (!ok) {
|
|
96
|
+
io.writeOut("已取消。\n");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const result = await runQuickSetup({ apiKey, tools });
|
|
100
|
+
io.writeOut(`配置完成: ${result.configuredTools.join(", ")}\n`);
|
|
101
|
+
io.writeOut(`备份目录: ${result.backup.backupDir}\n`);
|
|
102
|
+
}
|
|
103
|
+
async function inspectFlow(io) {
|
|
104
|
+
const results = await runInspect();
|
|
105
|
+
io.writeOut("配置状态:\n");
|
|
106
|
+
for (const result of results) {
|
|
107
|
+
io.writeOut(`- ${result.tool}: ${result.configured ? "已配置" : "未配置"}\n`);
|
|
108
|
+
if (result.apiKey) {
|
|
109
|
+
io.writeOut(` API Key: ${maskApiKey(result.apiKey)}\n`);
|
|
110
|
+
}
|
|
111
|
+
if (result.baseUrl) {
|
|
112
|
+
io.writeOut(` 地址: ${result.baseUrl}\n`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
io.writeOut("暂未接入用量查询。\n");
|
|
116
|
+
}
|
|
117
|
+
async function cleanupFlow(io) {
|
|
118
|
+
const tools = await askTools("请选择要清除 API Key 的工具");
|
|
119
|
+
const ok = await askConfirm(`确认清除 ${tools.join(", ")} 的云盒AI配置?`);
|
|
120
|
+
if (!ok) {
|
|
121
|
+
io.writeOut("已取消。\n");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const result = await runCleanup({ tools });
|
|
125
|
+
io.writeOut(`已清除: ${result.cleanedTools.join(", ")}\n`);
|
|
126
|
+
io.writeOut(`备份目录: ${result.backup.backupDir}\n`);
|
|
127
|
+
}
|
|
128
|
+
function printHeader(io) {
|
|
129
|
+
io.writeOut("=========================================\n");
|
|
130
|
+
io.writeOut(" 云盒AI 配置助手\n");
|
|
131
|
+
io.writeOut(" Codex / Claude Code 配置工具\n");
|
|
132
|
+
io.writeOut("=========================================\n");
|
|
133
|
+
}
|
|
134
|
+
function isCommanderHelp(error) {
|
|
135
|
+
return Boolean(error &&
|
|
136
|
+
typeof error === "object" &&
|
|
137
|
+
"code" in error &&
|
|
138
|
+
error.code === "commander.helpDisplayed");
|
|
139
|
+
}
|
|
140
|
+
if (isDirectRun()) {
|
|
141
|
+
main().catch((error) => {
|
|
142
|
+
defaultIo.writeErr(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
143
|
+
process.exitCode = 1;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function isDirectRun() {
|
|
147
|
+
return Boolean(process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type BackupResult } from "../backup.js";
|
|
2
|
+
import type { ToolId } from "../constants.js";
|
|
3
|
+
export interface CleanupOptions {
|
|
4
|
+
homeDir?: string;
|
|
5
|
+
tools: ToolId[];
|
|
6
|
+
now?: Date;
|
|
7
|
+
}
|
|
8
|
+
export interface CleanupResult {
|
|
9
|
+
cleanedTools: ToolId[];
|
|
10
|
+
backup: BackupResult;
|
|
11
|
+
}
|
|
12
|
+
export declare function runCleanup(options: CleanupOptions): Promise<CleanupResult>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createBackup } from "../backup.js";
|
|
2
|
+
import { resolvePaths } from "../paths.js";
|
|
3
|
+
import { cleanupClaude } from "../tools/claude.js";
|
|
4
|
+
import { cleanupCodex } from "../tools/codex.js";
|
|
5
|
+
export async function runCleanup(options) {
|
|
6
|
+
const paths = resolvePaths(options.homeDir);
|
|
7
|
+
const backup = await createBackup({
|
|
8
|
+
homeDir: options.homeDir,
|
|
9
|
+
operation: "cleanup",
|
|
10
|
+
files: selectedFiles(paths, options.tools),
|
|
11
|
+
now: options.now
|
|
12
|
+
});
|
|
13
|
+
for (const tool of options.tools) {
|
|
14
|
+
if (tool === "claude") {
|
|
15
|
+
await cleanupClaude({ homeDir: options.homeDir });
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (tool === "codex") {
|
|
19
|
+
await cleanupCodex({ homeDir: options.homeDir });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
cleanedTools: options.tools,
|
|
24
|
+
backup
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function selectedFiles(paths, tools) {
|
|
28
|
+
const files = new Set();
|
|
29
|
+
for (const tool of tools) {
|
|
30
|
+
if (tool === "claude") {
|
|
31
|
+
files.add(paths.claudeSettings);
|
|
32
|
+
}
|
|
33
|
+
if (tool === "codex") {
|
|
34
|
+
files.add(paths.codexConfig);
|
|
35
|
+
files.add(paths.codexAuth);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return [...files];
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB;IACtD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;QAC1C,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,KAAK;QAC3B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAsC,EAAE,KAAe;IAC5E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface CommandOptions {
|
|
2
|
+
homeDir?: string;
|
|
3
|
+
}
|
|
4
|
+
import type { ToolInspectResult as ClaudeInspectResult } from "../tools/claude.js";
|
|
5
|
+
import type { CodexInspectResult } from "../tools/codex.js";
|
|
6
|
+
export type InspectResult = ClaudeInspectResult | CodexInspectResult;
|
|
7
|
+
export declare function runInspect(options?: CommandOptions): Promise<InspectResult[]>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export async function runInspect(options = {}) {
|
|
2
|
+
const { inspectClaude } = await import("../tools/claude.js");
|
|
3
|
+
const { inspectCodex } = await import("../tools/codex.js");
|
|
4
|
+
return [await inspectClaude(options), await inspectCodex(options)];
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA0B,EAAE;IAC3D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC7D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type BackupResult } from "../backup.js";
|
|
2
|
+
import type { ToolId } from "../constants.js";
|
|
3
|
+
export interface QuickSetupOptions {
|
|
4
|
+
homeDir?: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
tools: ToolId[];
|
|
7
|
+
now?: Date;
|
|
8
|
+
}
|
|
9
|
+
export interface QuickSetupResult {
|
|
10
|
+
configuredTools: ToolId[];
|
|
11
|
+
backup: BackupResult;
|
|
12
|
+
}
|
|
13
|
+
export declare function runQuickSetup(options: QuickSetupOptions): Promise<QuickSetupResult>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createBackup } from "../backup.js";
|
|
2
|
+
import { resolvePaths } from "../paths.js";
|
|
3
|
+
import { configureClaude } from "../tools/claude.js";
|
|
4
|
+
import { configureCodex } from "../tools/codex.js";
|
|
5
|
+
export async function runQuickSetup(options) {
|
|
6
|
+
if (!options.apiKey.trim()) {
|
|
7
|
+
throw new Error("API Key 不能为空");
|
|
8
|
+
}
|
|
9
|
+
const paths = resolvePaths(options.homeDir);
|
|
10
|
+
const backup = await createBackup({
|
|
11
|
+
homeDir: options.homeDir,
|
|
12
|
+
operation: "quick-setup",
|
|
13
|
+
files: selectedFiles(paths, options.tools),
|
|
14
|
+
now: options.now
|
|
15
|
+
});
|
|
16
|
+
for (const tool of options.tools) {
|
|
17
|
+
if (tool === "claude") {
|
|
18
|
+
await configureClaude({ homeDir: options.homeDir, apiKey: options.apiKey });
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (tool === "codex") {
|
|
22
|
+
await configureCodex({ homeDir: options.homeDir, apiKey: options.apiKey });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
configuredTools: options.tools,
|
|
27
|
+
backup
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function selectedFiles(paths, tools) {
|
|
31
|
+
const files = new Set();
|
|
32
|
+
for (const tool of tools) {
|
|
33
|
+
if (tool === "claude") {
|
|
34
|
+
files.add(paths.claudeSettings);
|
|
35
|
+
}
|
|
36
|
+
if (tool === "codex") {
|
|
37
|
+
files.add(paths.codexConfig);
|
|
38
|
+
files.add(paths.codexAuth);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [...files];
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=quick-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-setup.js","sourceRoot":"","sources":["../../src/commands/quick-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAcnD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0B;IAC5D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,aAAa;QACxB,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;QAC1C,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,OAAO;QACL,eAAe,EAAE,OAAO,CAAC,KAAK;QAC9B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAsC,EAAE,KAAe;IAC5E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC7B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const YUNHEAI_BASE_URL = "https://ai.shangyunhe.com";
|
|
2
|
+
export declare const YUNHEAI_CODEX_BASE_URL = "https://ai.shangyunhe.com/v1";
|
|
3
|
+
export declare const CODEX_PROVIDER_ID = "yunheai";
|
|
4
|
+
export declare const CODEX_PROVIDER_NAME = "\u4E91\u76D2AI";
|
|
5
|
+
export declare const CODEX_AUTH_ENV_KEY = "OPENAI_API_KEY";
|
|
6
|
+
export declare const CLAUDE_AUTH_TOKEN_KEY = "ANTHROPIC_AUTH_TOKEN";
|
|
7
|
+
export declare const CLAUDE_BASE_URL_KEY = "ANTHROPIC_BASE_URL";
|
|
8
|
+
export declare const TOOL_IDS: {
|
|
9
|
+
readonly codex: "codex";
|
|
10
|
+
readonly claude: "claude";
|
|
11
|
+
};
|
|
12
|
+
export type ToolId = (typeof TOOL_IDS)[keyof typeof TOOL_IDS];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const YUNHEAI_BASE_URL = "https://ai.shangyunhe.com";
|
|
2
|
+
export const YUNHEAI_CODEX_BASE_URL = "https://ai.shangyunhe.com/v1";
|
|
3
|
+
export const CODEX_PROVIDER_ID = "yunheai";
|
|
4
|
+
export const CODEX_PROVIDER_NAME = "云盒AI";
|
|
5
|
+
export const CODEX_AUTH_ENV_KEY = "OPENAI_API_KEY";
|
|
6
|
+
export const CLAUDE_AUTH_TOKEN_KEY = "ANTHROPIC_AUTH_TOKEN";
|
|
7
|
+
export const CLAUDE_BASE_URL_KEY = "ANTHROPIC_BASE_URL";
|
|
8
|
+
export const TOOL_IDS = {
|
|
9
|
+
codex: "codex",
|
|
10
|
+
claude: "claude"
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;CACR,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function readJsonObject(filePath) {
|
|
4
|
+
try {
|
|
5
|
+
const text = await readFile(filePath, "utf8");
|
|
6
|
+
const parsed = JSON.parse(text);
|
|
7
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
8
|
+
throw new Error(`${filePath} 必须是 JSON 对象`);
|
|
9
|
+
}
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (isNotFoundError(error)) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function writeJsonObject(filePath, value) {
|
|
20
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
21
|
+
await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
22
|
+
}
|
|
23
|
+
function isNotFoundError(error) {
|
|
24
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=json-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-file.js","sourceRoot":"","sources":["../src/json-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,cAAc,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,KAA8B;IACpF,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC9H,CAAC"}
|
package/dist/mask.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function maskApiKey(value: string): string;
|
package/dist/mask.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function maskApiKey(value) {
|
|
2
|
+
if (!value) {
|
|
3
|
+
return "<未配置>";
|
|
4
|
+
}
|
|
5
|
+
if (value.length < 8) {
|
|
6
|
+
return "***";
|
|
7
|
+
}
|
|
8
|
+
const prefix = value.startsWith("sk-") ? "sk-" : value.slice(0, 2);
|
|
9
|
+
return `${prefix}****${value.slice(-4)}`;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=mask.js.map
|
package/dist/mask.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.js","sourceRoot":"","sources":["../src/mask.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,OAAO,GAAG,MAAM,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC"}
|
package/dist/paths.d.ts
ADDED
package/dist/paths.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function resolvePaths(homeDir = os.homedir()) {
|
|
4
|
+
return {
|
|
5
|
+
homeDir,
|
|
6
|
+
codexConfig: path.join(homeDir, ".codex", "config.toml"),
|
|
7
|
+
codexAuth: path.join(homeDir, ".codex", "auth.json"),
|
|
8
|
+
claudeSettings: path.join(homeDir, ".claude", "settings.json"),
|
|
9
|
+
yunheaiDir: path.join(homeDir, ".yunheai"),
|
|
10
|
+
backupsDir: path.join(homeDir, ".yunheai", "backups")
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,MAAM,UAAU,YAAY,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IACjD,OAAO;QACL,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC;QACxD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;QACpD,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC;QAC9D,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC;KACtD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ToolId } from "./constants.js";
|
|
2
|
+
export type MainMenuAction = "quick-setup" | "inspect" | "cleanup" | "language" | "exit";
|
|
3
|
+
export declare function askMainMenu(): Promise<MainMenuAction>;
|
|
4
|
+
export declare function askApiKey(): Promise<string>;
|
|
5
|
+
export declare function askTools(message?: string): Promise<ToolId[]>;
|
|
6
|
+
export declare function askConfirm(message: string): Promise<boolean>;
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { checkbox, confirm, password, select } from "@inquirer/prompts";
|
|
2
|
+
export async function askMainMenu() {
|
|
3
|
+
return select({
|
|
4
|
+
message: "主菜单",
|
|
5
|
+
choices: [
|
|
6
|
+
{ name: "快速配置", value: "quick-setup" },
|
|
7
|
+
{ name: "查看配置状态", value: "inspect" },
|
|
8
|
+
{ name: "清除本机 API Key", value: "cleanup" },
|
|
9
|
+
{ name: "语言 / Language", value: "language" },
|
|
10
|
+
{ name: "退出", value: "exit" }
|
|
11
|
+
]
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export async function askApiKey() {
|
|
15
|
+
return password({
|
|
16
|
+
message: "请输入云盒AI API Key",
|
|
17
|
+
mask: "*",
|
|
18
|
+
validate(value) {
|
|
19
|
+
return value.trim().length > 0 || "API Key 不能为空";
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export async function askTools(message = "请选择要配置的工具") {
|
|
24
|
+
return checkbox({
|
|
25
|
+
message,
|
|
26
|
+
choices: [
|
|
27
|
+
{ name: "Codex", value: "codex", checked: true },
|
|
28
|
+
{ name: "Claude Code", value: "claude", checked: true }
|
|
29
|
+
],
|
|
30
|
+
validate(value) {
|
|
31
|
+
return value.length > 0 || "请至少选择一个工具";
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function askConfirm(message) {
|
|
36
|
+
return confirm({ message, default: true });
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKxE,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE;YACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;YAC1C,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE;YAC5C,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;SAC9B;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,QAAQ,CAAC;QACd,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,GAAG;QACT,QAAQ,CAAC,KAAK;YACZ,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC;QACnD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAO,GAAG,WAAW;IAClD,OAAO,QAAQ,CAAS;QACtB,OAAO;QACP,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;YAChD,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;SACxD;QACD,QAAQ,CAAC,KAAK;YACZ,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ClaudeOptions {
|
|
2
|
+
homeDir?: string;
|
|
3
|
+
}
|
|
4
|
+
export interface ConfigureClaudeOptions extends ClaudeOptions {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ToolInspectResult {
|
|
8
|
+
tool: "claude";
|
|
9
|
+
configured: boolean;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function configureClaude(options: ConfigureClaudeOptions): Promise<void>;
|
|
14
|
+
export declare function inspectClaude(options?: ClaudeOptions): Promise<ToolInspectResult>;
|
|
15
|
+
export declare function cleanupClaude(options?: ClaudeOptions): Promise<void>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { CLAUDE_AUTH_TOKEN_KEY, CLAUDE_BASE_URL_KEY, YUNHEAI_BASE_URL } from "../constants.js";
|
|
3
|
+
import { readJsonObject, writeJsonObject } from "../json-file.js";
|
|
4
|
+
import { resolvePaths } from "../paths.js";
|
|
5
|
+
export async function configureClaude(options) {
|
|
6
|
+
const filePath = resolvePaths(options.homeDir).claudeSettings;
|
|
7
|
+
const settings = await readJsonObject(filePath);
|
|
8
|
+
const env = ensureRecord(settings.env);
|
|
9
|
+
env[CLAUDE_AUTH_TOKEN_KEY] = options.apiKey;
|
|
10
|
+
env[CLAUDE_BASE_URL_KEY] = YUNHEAI_BASE_URL;
|
|
11
|
+
settings.env = env;
|
|
12
|
+
await writeJsonObject(filePath, settings);
|
|
13
|
+
}
|
|
14
|
+
export async function inspectClaude(options = {}) {
|
|
15
|
+
const filePath = resolvePaths(options.homeDir).claudeSettings;
|
|
16
|
+
const settings = await readJsonObject(filePath);
|
|
17
|
+
const env = ensureRecord(settings.env);
|
|
18
|
+
const apiKey = stringValue(env[CLAUDE_AUTH_TOKEN_KEY]);
|
|
19
|
+
const baseUrl = stringValue(env[CLAUDE_BASE_URL_KEY]);
|
|
20
|
+
return {
|
|
21
|
+
tool: "claude",
|
|
22
|
+
configured: Boolean(apiKey && baseUrl === YUNHEAI_BASE_URL),
|
|
23
|
+
apiKey,
|
|
24
|
+
baseUrl
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export async function cleanupClaude(options = {}) {
|
|
28
|
+
const filePath = resolvePaths(options.homeDir).claudeSettings;
|
|
29
|
+
try {
|
|
30
|
+
await access(filePath);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (isNotFoundError(error)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
const settings = await readJsonObject(filePath);
|
|
39
|
+
const env = ensureRecord(settings.env);
|
|
40
|
+
delete env[CLAUDE_AUTH_TOKEN_KEY];
|
|
41
|
+
delete env[CLAUDE_BASE_URL_KEY];
|
|
42
|
+
settings.env = env;
|
|
43
|
+
await writeJsonObject(filePath, settings);
|
|
44
|
+
}
|
|
45
|
+
function ensureRecord(value) {
|
|
46
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function stringValue(value) {
|
|
52
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
53
|
+
}
|
|
54
|
+
function isNotFoundError(error) {
|
|
55
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/tools/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface CodexOptions {
|
|
2
|
+
homeDir?: string;
|
|
3
|
+
}
|
|
4
|
+
export interface ConfigureCodexOptions extends CodexOptions {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CodexInspectResult {
|
|
8
|
+
tool: "codex";
|
|
9
|
+
configured: boolean;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
providerId?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function configureCodex(options: ConfigureCodexOptions): Promise<void>;
|
|
15
|
+
export declare function inspectCodex(options?: CodexOptions): Promise<CodexInspectResult>;
|
|
16
|
+
export declare function cleanupCodex(options?: CodexOptions): Promise<void>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parse, stringify } from "smol-toml";
|
|
4
|
+
import { CODEX_AUTH_ENV_KEY, CODEX_PROVIDER_ID, CODEX_PROVIDER_NAME, YUNHEAI_CODEX_BASE_URL } from "../constants.js";
|
|
5
|
+
import { readJsonObject, writeJsonObject } from "../json-file.js";
|
|
6
|
+
import { resolvePaths } from "../paths.js";
|
|
7
|
+
export async function configureCodex(options) {
|
|
8
|
+
const paths = resolvePaths(options.homeDir);
|
|
9
|
+
const config = await readTomlObject(paths.codexConfig);
|
|
10
|
+
const providers = ensureRecord(config.model_providers);
|
|
11
|
+
config.model_provider = CODEX_PROVIDER_ID;
|
|
12
|
+
providers[CODEX_PROVIDER_ID] = {
|
|
13
|
+
name: CODEX_PROVIDER_NAME,
|
|
14
|
+
base_url: YUNHEAI_CODEX_BASE_URL,
|
|
15
|
+
env_key: CODEX_AUTH_ENV_KEY,
|
|
16
|
+
wire_api: "responses",
|
|
17
|
+
requires_openai_auth: true
|
|
18
|
+
};
|
|
19
|
+
config.model_providers = providers;
|
|
20
|
+
await writeTomlObject(paths.codexConfig, config);
|
|
21
|
+
const auth = await readJsonObject(paths.codexAuth);
|
|
22
|
+
auth[CODEX_AUTH_ENV_KEY] = options.apiKey;
|
|
23
|
+
await writeJsonObject(paths.codexAuth, auth);
|
|
24
|
+
}
|
|
25
|
+
export async function inspectCodex(options = {}) {
|
|
26
|
+
const paths = resolvePaths(options.homeDir);
|
|
27
|
+
const config = await readTomlObject(paths.codexConfig);
|
|
28
|
+
const auth = await readJsonObject(paths.codexAuth);
|
|
29
|
+
const providers = ensureRecord(config.model_providers);
|
|
30
|
+
const provider = ensureRecord(providers[CODEX_PROVIDER_ID]);
|
|
31
|
+
const apiKey = stringValue(auth[CODEX_AUTH_ENV_KEY]);
|
|
32
|
+
const baseUrl = stringValue(provider.base_url);
|
|
33
|
+
const currentProvider = stringValue(config.model_provider);
|
|
34
|
+
return {
|
|
35
|
+
tool: "codex",
|
|
36
|
+
configured: currentProvider === CODEX_PROVIDER_ID &&
|
|
37
|
+
baseUrl === YUNHEAI_CODEX_BASE_URL &&
|
|
38
|
+
Boolean(apiKey),
|
|
39
|
+
providerId: currentProvider,
|
|
40
|
+
apiKey,
|
|
41
|
+
baseUrl
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export async function cleanupCodex(options = {}) {
|
|
45
|
+
const paths = resolvePaths(options.homeDir);
|
|
46
|
+
if (await fileExists(paths.codexConfig)) {
|
|
47
|
+
const config = await readTomlObject(paths.codexConfig);
|
|
48
|
+
const providers = ensureRecord(config.model_providers);
|
|
49
|
+
let shouldWriteConfig = false;
|
|
50
|
+
if (CODEX_PROVIDER_ID in providers) {
|
|
51
|
+
delete providers[CODEX_PROVIDER_ID];
|
|
52
|
+
shouldWriteConfig = true;
|
|
53
|
+
}
|
|
54
|
+
if (Object.keys(providers).length > 0) {
|
|
55
|
+
config.model_providers = providers;
|
|
56
|
+
}
|
|
57
|
+
else if ("model_providers" in config) {
|
|
58
|
+
delete config.model_providers;
|
|
59
|
+
shouldWriteConfig = true;
|
|
60
|
+
}
|
|
61
|
+
if (config.model_provider === CODEX_PROVIDER_ID) {
|
|
62
|
+
delete config.model_provider;
|
|
63
|
+
shouldWriteConfig = true;
|
|
64
|
+
}
|
|
65
|
+
if (shouldWriteConfig) {
|
|
66
|
+
await writeTomlObject(paths.codexConfig, config);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (await fileExists(paths.codexAuth)) {
|
|
70
|
+
const auth = await readJsonObject(paths.codexAuth);
|
|
71
|
+
if (CODEX_AUTH_ENV_KEY in auth) {
|
|
72
|
+
delete auth[CODEX_AUTH_ENV_KEY];
|
|
73
|
+
await writeJsonObject(paths.codexAuth, auth);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function readTomlObject(filePath) {
|
|
78
|
+
try {
|
|
79
|
+
const text = await readFile(filePath, "utf8");
|
|
80
|
+
const parsed = parse(text);
|
|
81
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
82
|
+
throw new Error(`${filePath} 必须是 TOML 对象`);
|
|
83
|
+
}
|
|
84
|
+
return parsed;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (isNotFoundError(error)) {
|
|
88
|
+
return {};
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function writeTomlObject(filePath, value) {
|
|
94
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
95
|
+
await writeFile(filePath, stringify(value), "utf8");
|
|
96
|
+
}
|
|
97
|
+
function ensureRecord(value) {
|
|
98
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
function stringValue(value) {
|
|
104
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
105
|
+
}
|
|
106
|
+
async function fileExists(filePath) {
|
|
107
|
+
try {
|
|
108
|
+
await access(filePath);
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (isNotFoundError(error)) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function isNotFoundError(error) {
|
|
119
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT");
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/tools/codex.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "yunheai",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "云盒AI Codex / Claude Code 配置工具",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"yunheai": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.json",
|
|
15
|
+
"typecheck": "tsc -p tsconfig.typecheck.json",
|
|
16
|
+
"dev": "tsx src/cli.ts",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest",
|
|
19
|
+
"check": "npm run build && npm run typecheck && npm test"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@inquirer/prompts": "^7.8.0",
|
|
26
|
+
"commander": "^14.0.0",
|
|
27
|
+
"smol-toml": "^1.4.2"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^24.0.0",
|
|
31
|
+
"vite": "^6.3.5",
|
|
32
|
+
"tsx": "^4.20.0",
|
|
33
|
+
"typescript": "^5.8.0",
|
|
34
|
+
"vitest": "3.2.6"
|
|
35
|
+
},
|
|
36
|
+
"license": "MIT"
|
|
37
|
+
}
|