ccnew 0.1.10 → 0.1.11
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 +28 -28
- package/core/constants.js +1 -1
- package/core/desktop-service.js +2 -2
- package/core/desktop-state.js +1 -1
- package/core/index.js +9 -6
- package/desktop/main.js +4 -4
- package/desktop/renderer/app.js +1 -1
- package/desktop/renderer/index.html +4 -4
- package/package.json +8 -8
- package/scripts/desktop-pack-win.mjs +4 -4
- package/scripts/postinstall.mjs +8 -8
- package/scripts/prepublish-check.mjs +3 -3
- package/site/index.html +18 -18
- package/src/App.tsx +1 -1
- package/src/features/prompts/prompts-view.tsx +1 -1
- package/src/lib/client.ts +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ccnew
|
|
2
2
|
|
|
3
|
-
`
|
|
3
|
+
`ccnew` is a relay configuration manager for:
|
|
4
4
|
|
|
5
5
|
- Codex
|
|
6
6
|
- OpenCode
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
It exposes one install command and one primary setup command:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm i -g
|
|
13
|
-
|
|
12
|
+
npm i -g ccnew
|
|
13
|
+
ccnew fhl
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
## Main Commands
|
|
@@ -18,52 +18,52 @@ ccon fhl
|
|
|
18
18
|
Quick setup:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
ccnew fhl
|
|
22
|
+
ccnew fhl sk-your-key
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
Interactive menu:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
ccnew
|
|
29
|
+
ccnew menu
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Standard setup:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
ccnew setup -k sk-your-key
|
|
36
|
+
ccnew setup --preset fhl -k sk-your-key
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
Platform management:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
42
|
+
ccnew cx list
|
|
43
|
+
ccnew cx current
|
|
44
|
+
ccnew cx add -n fhl -u https://www.fhl.mom -k sk-xxx --model gpt-5.4
|
|
45
|
+
ccnew cx use fhl
|
|
46
|
+
ccnew oc list
|
|
47
|
+
ccnew ow list
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
Presets and probe:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
ccnew preset list
|
|
54
|
+
ccnew preset add -n team-a --provider-name teama --base-url https://example.com
|
|
55
|
+
ccnew preset use team-a -k sk-xxx -p codex,opencode
|
|
56
|
+
ccnew probe -u https://www.fhl.mom -u https://www.fhl.mom/v1
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
## Defaults
|
|
60
60
|
|
|
61
61
|
- Codex / OpenCode route: `https://www.fhl.mom`
|
|
62
62
|
- OpenClaw route: `https://www.fhl.mom/v1`
|
|
63
|
-
- Primary setup command: `
|
|
63
|
+
- Primary setup command: `ccnew fhl`
|
|
64
64
|
- Default provider name: `fhl`
|
|
65
65
|
|
|
66
|
-
`
|
|
66
|
+
`ccnew fhl` follows the old `gmn1` style selection flow when `--platform` is omitted:
|
|
67
67
|
|
|
68
68
|
- `Codex` checked by default
|
|
69
69
|
- `OpenCode` checked by default
|
|
@@ -89,12 +89,12 @@ npm run desktop:check
|
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
91
|
npm pack
|
|
92
|
-
npm uninstall -g
|
|
93
|
-
npm install -g .\\
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
npm uninstall -g ccnew
|
|
93
|
+
npm install -g .\\ccnew-0.1.11.tgz
|
|
94
|
+
ccnew --help
|
|
95
|
+
ccnew fhl --help
|
|
96
|
+
ccnew gmn1 --help
|
|
97
|
+
ccnew fhl sk-demo-1234 --platform codex --no-probe
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
## Publish
|
package/core/constants.js
CHANGED
package/core/desktop-service.js
CHANGED
|
@@ -121,7 +121,7 @@ export function getDesktopSnapshot() {
|
|
|
121
121
|
const routing = buildRoutingSnapshot(buildRoutingContexts());
|
|
122
122
|
|
|
123
123
|
return {
|
|
124
|
-
appName: "
|
|
124
|
+
appName: "ccnew",
|
|
125
125
|
version: "0.1.10",
|
|
126
126
|
generatedAt: new Date().toISOString(),
|
|
127
127
|
models: MODEL_DEFINITIONS,
|
|
@@ -361,7 +361,7 @@ export function exportPresetsToDesktop(filePath) {
|
|
|
361
361
|
}
|
|
362
362
|
|
|
363
363
|
writeJson(targetPath, {
|
|
364
|
-
appName: "
|
|
364
|
+
appName: "ccnew",
|
|
365
365
|
version: "0.1.10",
|
|
366
366
|
exportedAt: new Date().toISOString(),
|
|
367
367
|
presets: listPresets()
|
package/core/desktop-state.js
CHANGED
|
@@ -132,7 +132,7 @@ function buildManagedPromptContent(prompts, platformLabel) {
|
|
|
132
132
|
)
|
|
133
133
|
.join("\n\n");
|
|
134
134
|
|
|
135
|
-
return `${PROMPT_MARKER_BEGIN}\n#
|
|
135
|
+
return `${PROMPT_MARKER_BEGIN}\n# ccnew ${platformLabel} prompts\n\n${body}\n${PROMPT_MARKER_END}\n`;
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
function inferMcpDescription(entry) {
|
package/core/index.js
CHANGED
|
@@ -38,6 +38,9 @@ import { getPreset, listPresets, removePreset, upsertPreset } from "./presets.js
|
|
|
38
38
|
|
|
39
39
|
const CLI_ENTRY_NAME = (() => {
|
|
40
40
|
const script = `${process.argv[1] || ""}`.toLowerCase();
|
|
41
|
+
if (script.includes("ccnew")) {
|
|
42
|
+
return "ccnew";
|
|
43
|
+
}
|
|
41
44
|
if (script.includes("ccon")) {
|
|
42
45
|
return "ccon";
|
|
43
46
|
}
|
|
@@ -69,10 +72,10 @@ function printSuccessBanner() {
|
|
|
69
72
|
function printCliBanner() {
|
|
70
73
|
const width = 60;
|
|
71
74
|
const lines = [
|
|
72
|
-
{ text: "
|
|
75
|
+
{ text: "ccnew", color: chalk.hex("#f4ede3") },
|
|
73
76
|
{ text: "quiet relay setup for Codex / OpenCode / OpenClaw", color: chalk.hex("#b8ab9a") },
|
|
74
77
|
{ text: "route https://www.fhl.mom", color: chalk.hex("#d8c19a") },
|
|
75
|
-
{ text: "start
|
|
78
|
+
{ text: "start ccnew fhl", color: chalk.hex("#e7b36b") }
|
|
76
79
|
];
|
|
77
80
|
|
|
78
81
|
const borderColor = chalk.hex("#7b6a58");
|
|
@@ -278,7 +281,7 @@ async function resolveShortcutPlatformsLikeGmn1(platformsArg) {
|
|
|
278
281
|
choices: [
|
|
279
282
|
{ name: "Codex(需单独订阅 OpenAI 套餐)", value: "codex" },
|
|
280
283
|
{ name: "OpenCode(与 Codex 共享 OpenAI 套餐)", value: "opencode" },
|
|
281
|
-
{ name: "OpenClaw(
|
|
284
|
+
{ name: "OpenClaw(ccnew /v1 端点,默认不选中)", value: "openclaw" },
|
|
282
285
|
{ name: "全部(将依次配置 Codex、OpenCode、OpenClaw)", value: "all" }
|
|
283
286
|
],
|
|
284
287
|
default: ["codex", "opencode"],
|
|
@@ -432,7 +435,7 @@ async function runSetup(rawOptions = {}) {
|
|
|
432
435
|
console.log(chalk.gray(`使用预设: ${options._resolvedPreset.name}`));
|
|
433
436
|
}
|
|
434
437
|
} else {
|
|
435
|
-
printHeader("
|
|
438
|
+
printHeader("ccnew cli setup");
|
|
436
439
|
if (options._resolvedPreset) {
|
|
437
440
|
console.log(chalk.gray(`使用预设: ${options._resolvedPreset.name}`));
|
|
438
441
|
}
|
|
@@ -1123,7 +1126,7 @@ async function runMainMenu() {
|
|
|
1123
1126
|
{
|
|
1124
1127
|
type: "list",
|
|
1125
1128
|
name: "action",
|
|
1126
|
-
message: "
|
|
1129
|
+
message: "ccnew menu",
|
|
1127
1130
|
choices: [
|
|
1128
1131
|
{ name: "快速安装", value: "setup" },
|
|
1129
1132
|
{ name: "自定义安装", value: "advanced-setup" },
|
|
@@ -1163,7 +1166,7 @@ async function runMainMenu() {
|
|
|
1163
1166
|
const program = new Command();
|
|
1164
1167
|
program
|
|
1165
1168
|
.name(CLI_ENTRY_NAME)
|
|
1166
|
-
.description("
|
|
1169
|
+
.description("ccnew relay manager")
|
|
1167
1170
|
.version("0.1.10");
|
|
1168
1171
|
|
|
1169
1172
|
program
|
package/desktop/main.js
CHANGED
|
@@ -70,7 +70,7 @@ async function openPathFromDesktop(targetPath) {
|
|
|
70
70
|
|
|
71
71
|
async function choosePresetImportPath() {
|
|
72
72
|
const result = await dialog.showOpenDialog({
|
|
73
|
-
title: "导入
|
|
73
|
+
title: "导入 ccnew 预设",
|
|
74
74
|
properties: ["openFile"],
|
|
75
75
|
filters: [{ name: "JSON", extensions: ["json"] }]
|
|
76
76
|
});
|
|
@@ -84,8 +84,8 @@ async function choosePresetImportPath() {
|
|
|
84
84
|
|
|
85
85
|
async function choosePresetExportPath() {
|
|
86
86
|
const result = await dialog.showSaveDialog({
|
|
87
|
-
title: "导出
|
|
88
|
-
defaultPath: path.join(os.homedir(), `
|
|
87
|
+
title: "导出 ccnew 预设",
|
|
88
|
+
defaultPath: path.join(os.homedir(), `ccnew-presets-${new Date().toISOString().slice(0, 10)}.json`),
|
|
89
89
|
filters: [{ name: "JSON", extensions: ["json"] }]
|
|
90
90
|
});
|
|
91
91
|
|
|
@@ -129,7 +129,7 @@ function createWindow() {
|
|
|
129
129
|
minHeight: 760,
|
|
130
130
|
backgroundColor: "#f4efe6",
|
|
131
131
|
autoHideMenuBar: true,
|
|
132
|
-
title: "
|
|
132
|
+
title: "ccnew",
|
|
133
133
|
icon: windowIcon,
|
|
134
134
|
webPreferences: {
|
|
135
135
|
preload: path.join(__dirname, "preload.cjs"),
|
package/desktop/renderer/app.js
CHANGED
|
@@ -203,7 +203,7 @@ function populateForm(platform) {
|
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
function renderHeader(platform) {
|
|
206
|
-
heroTitle.textContent = `
|
|
206
|
+
heroTitle.textContent = `ccnew / ${platform.label}`;
|
|
207
207
|
heroSubtitle.textContent = `保存 ${platform.providerCount} 个 Provider,当前启用 ${platform.currentProviderName || "无"}。`;
|
|
208
208
|
}
|
|
209
209
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>
|
|
6
|
+
<title>ccnew</title>
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
9
|
<link
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
<div class="shell">
|
|
17
17
|
<aside class="sidebar">
|
|
18
18
|
<div class="brand">
|
|
19
|
-
<img src="../assets/fml-icon.png" alt="
|
|
19
|
+
<img src="../assets/fml-icon.png" alt="ccnew" />
|
|
20
20
|
<div>
|
|
21
|
-
<strong>
|
|
21
|
+
<strong>ccnew</strong>
|
|
22
22
|
<span>relay desktop</span>
|
|
23
23
|
</div>
|
|
24
24
|
</div>
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
<header class="hero">
|
|
37
37
|
<div>
|
|
38
38
|
<span class="eyebrow">Desktop Control Panel</span>
|
|
39
|
-
<h1 id="heroTitle">
|
|
39
|
+
<h1 id="heroTitle">ccnew</h1>
|
|
40
40
|
<p id="heroSubtitle">统一管理 Provider、写入本地配置、测速和快速切换。</p>
|
|
41
41
|
</div>
|
|
42
42
|
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ccnew",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.11",
|
|
4
|
+
"description": "ccnew relay manager for Codex, OpenCode, and OpenClaw.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "desktop/main.js",
|
|
7
7
|
"bin": {
|
|
8
|
-
"
|
|
8
|
+
"ccnew": "core/index.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"core",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"config",
|
|
48
48
|
"cli"
|
|
49
49
|
],
|
|
50
|
-
"author": "
|
|
50
|
+
"author": "ccnew",
|
|
51
51
|
"license": "MIT",
|
|
52
52
|
"engines": {
|
|
53
53
|
"node": ">=18.0.0"
|
|
@@ -77,9 +77,9 @@
|
|
|
77
77
|
"vite": "^7.1.12"
|
|
78
78
|
},
|
|
79
79
|
"build": {
|
|
80
|
-
"appId": "cn.
|
|
81
|
-
"productName": "
|
|
82
|
-
"executableName": "
|
|
80
|
+
"appId": "cn.ccnew.desktop",
|
|
81
|
+
"productName": "ccnew",
|
|
82
|
+
"executableName": "ccnew",
|
|
83
83
|
"npmRebuild": false,
|
|
84
84
|
"directories": {
|
|
85
85
|
"output": "release",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"nsis",
|
|
101
101
|
"portable"
|
|
102
102
|
],
|
|
103
|
-
"artifactName": "
|
|
103
|
+
"artifactName": "ccnew-${version}-${arch}.${ext}"
|
|
104
104
|
},
|
|
105
105
|
"nsis": {
|
|
106
106
|
"oneClick": false,
|
|
@@ -6,7 +6,7 @@ import { fileURLToPath } from "node:url";
|
|
|
6
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
7
|
const __dirname = path.dirname(__filename);
|
|
8
8
|
const rootDir = path.resolve(__dirname, "..");
|
|
9
|
-
const outputDir = path.join(rootDir, "release", "
|
|
9
|
+
const outputDir = path.join(rootDir, "release", "ccnew-win-unpacked");
|
|
10
10
|
const appDir = path.join(outputDir, "resources", "app");
|
|
11
11
|
const electronDist = path.join(rootDir, "node_modules", "electron", "dist");
|
|
12
12
|
|
|
@@ -58,8 +58,8 @@ async function main() {
|
|
|
58
58
|
});
|
|
59
59
|
|
|
60
60
|
const electronExe = path.join(outputDir, "electron.exe");
|
|
61
|
-
const
|
|
62
|
-
await fs.copyFile(electronExe,
|
|
61
|
+
const ccnewExe = path.join(outputDir, "ccnew.exe");
|
|
62
|
+
await fs.copyFile(electronExe, ccnewExe);
|
|
63
63
|
await fs.rm(electronExe, { force: true });
|
|
64
64
|
|
|
65
65
|
for (const entry of copyEntries) {
|
|
@@ -68,7 +68,7 @@ async function main() {
|
|
|
68
68
|
|
|
69
69
|
await fs.writeFile(
|
|
70
70
|
path.join(outputDir, "PACKED_BY.txt"),
|
|
71
|
-
`
|
|
71
|
+
`ccnew windows package\ncreatedAt=${new Date().toISOString()}\nmode=custom-electron-copy\n`,
|
|
72
72
|
"utf8"
|
|
73
73
|
);
|
|
74
74
|
|
package/scripts/postinstall.mjs
CHANGED
|
@@ -27,22 +27,22 @@ function blue(text) {
|
|
|
27
27
|
const banner = [
|
|
28
28
|
"",
|
|
29
29
|
blue(".--------------------------------------------------------------."),
|
|
30
|
-
`${blue("|")} ${cyan("
|
|
30
|
+
`${blue("|")} ${cyan("ccnew".padEnd(60, " "))} ${blue("|")}`,
|
|
31
31
|
`${blue("|")} ${dim("quiet relay setup for Codex / OpenCode / OpenClaw".padEnd(60, " "))} ${blue("|")}`,
|
|
32
32
|
`${blue("|")} ${green("route https://www.fhl.mom".padEnd(60, " "))} ${blue("|")}`,
|
|
33
|
-
`${blue("|")} ${yellow("start
|
|
33
|
+
`${blue("|")} ${yellow("start ccnew fhl".padEnd(60, " "))} ${blue("|")}`,
|
|
34
34
|
blue("'--------------------------------------------------------------'"),
|
|
35
35
|
"",
|
|
36
36
|
" Quick Start:",
|
|
37
|
-
` ${cyan("npm i -g
|
|
38
|
-
` ${cyan("
|
|
37
|
+
` ${cyan("npm i -g ccnew")}`,
|
|
38
|
+
` ${cyan("ccnew fhl")}`,
|
|
39
39
|
"",
|
|
40
40
|
" Useful Commands:",
|
|
41
|
-
` ${cyan("
|
|
42
|
-
` ${cyan("
|
|
43
|
-
` ${cyan("
|
|
41
|
+
` ${cyan("ccnew --help")}`,
|
|
42
|
+
` ${cyan("ccnew fhl --help")}`,
|
|
43
|
+
` ${cyan("ccnew preset --help")}`,
|
|
44
44
|
"",
|
|
45
|
-
dim(" If install output looks quiet, run `
|
|
45
|
+
dim(" If install output looks quiet, run `ccnew --help` to verify the CLI is ready."),
|
|
46
46
|
""
|
|
47
47
|
];
|
|
48
48
|
|
|
@@ -39,11 +39,11 @@ if (DEFAULT_OPENCLAW_BASE_URL !== "https://www.fhl.mom/v1") {
|
|
|
39
39
|
throw new Error(`Unexpected OpenClaw base URL: ${DEFAULT_OPENCLAW_BASE_URL}`);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
assertContains("site/index.html", "
|
|
42
|
+
assertContains("site/index.html", "ccnew");
|
|
43
43
|
assertContains("site/index.html", "https://www.fhl.mom");
|
|
44
44
|
assertContains("site/index.html", "https://www.fhl.mom/v1");
|
|
45
|
-
assertContains("site/index.html", "
|
|
46
|
-
assertContains("desktop/renderer/index.html", "
|
|
45
|
+
assertContains("site/index.html", "ccnew fhl");
|
|
46
|
+
assertContains("desktop/renderer/index.html", "ccnew");
|
|
47
47
|
assertContains("desktop/renderer/index.html", "https://www.fhl.mom");
|
|
48
48
|
|
|
49
49
|
run("CLI syntax check", process.execPath, ["--check", "./core/index.js"]);
|
package/site/index.html
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>
|
|
6
|
+
<title>ccnew | 下载与界面预览</title>
|
|
7
7
|
<meta
|
|
8
8
|
name="description"
|
|
9
|
-
content="
|
|
9
|
+
content="ccnew 是一个面向 Codex、OpenCode 与 OpenClaw 的统一配置桌面端,支持一键接入 www.fhl.mom。"
|
|
10
10
|
/>
|
|
11
11
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
12
12
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
<body>
|
|
20
20
|
<div class="page-shell">
|
|
21
21
|
<header class="topbar">
|
|
22
|
-
<a class="brand" href="#hero" aria-label="
|
|
23
|
-
<img src="./assets/fml-icon.png" alt="
|
|
22
|
+
<a class="brand" href="#hero" aria-label="ccnew">
|
|
23
|
+
<img src="./assets/fml-icon.png" alt="ccnew" />
|
|
24
24
|
<span class="brand-copy">
|
|
25
|
-
<strong>
|
|
25
|
+
<strong>ccnew</strong>
|
|
26
26
|
<em>Relay Desktop</em>
|
|
27
27
|
</span>
|
|
28
28
|
</a>
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
<div class="hero-copy">
|
|
43
43
|
<div class="hero-eyebrow">
|
|
44
44
|
<span class="eyebrow-dot"></span>
|
|
45
|
-
<span>
|
|
45
|
+
<span>ccnew Relay Workspace</span>
|
|
46
46
|
</div>
|
|
47
47
|
<h1>客户只装一个包,只记一条命令。</h1>
|
|
48
48
|
<p>
|
|
49
|
-
客户安装 <code>
|
|
49
|
+
客户安装 <code>ccnew</code> 后执行 <code>ccnew fhl</code>,默认就会把 Codex、OpenCode 接到
|
|
50
50
|
<code>https://www.fhl.mom</code>,OpenClaw 走 <code>https://www.fhl.mom/v1</code>,并按
|
|
51
51
|
<code>gmn1</code> 的交互逻辑选择要配置的平台。
|
|
52
52
|
</p>
|
|
@@ -72,8 +72,8 @@
|
|
|
72
72
|
</ul>
|
|
73
73
|
|
|
74
74
|
<div class="command-strip" aria-label="Quick Start Commands">
|
|
75
|
-
<code>npm i -g
|
|
76
|
-
<code>
|
|
75
|
+
<code>npm i -g ccnew</code>
|
|
76
|
+
<code>ccnew fhl</code>
|
|
77
77
|
</div>
|
|
78
78
|
</div>
|
|
79
79
|
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
|
|
88
88
|
<article class="console-metric">
|
|
89
89
|
<span class="hero-card-label">Quick Setup</span>
|
|
90
|
-
<strong>
|
|
90
|
+
<strong>ccnew fhl</strong>
|
|
91
91
|
<p>默认勾选 Codex + OpenCode,OpenClaw 保持可选,不再全部强塞进去。</p>
|
|
92
92
|
</article>
|
|
93
93
|
</div>
|
|
@@ -99,12 +99,12 @@
|
|
|
99
99
|
<span></span>
|
|
100
100
|
<span></span>
|
|
101
101
|
</div>
|
|
102
|
-
<small>
|
|
102
|
+
<small>ccnew / Quick Flow</small>
|
|
103
103
|
</div>
|
|
104
104
|
|
|
105
105
|
<div class="terminal-lines">
|
|
106
|
-
<div class="terminal-line prompt">$ npm i -g
|
|
107
|
-
<div class="terminal-line prompt">$
|
|
106
|
+
<div class="terminal-line prompt">$ npm i -g ccnew</div>
|
|
107
|
+
<div class="terminal-line prompt">$ ccnew fhl</div>
|
|
108
108
|
<div class="terminal-line note">[x] Codex [x] OpenCode [ ] OpenClaw</div>
|
|
109
109
|
<div class="terminal-line success">route ready -> https://www.fhl.mom</div>
|
|
110
110
|
</div>
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
<div class="sidebar-brand">
|
|
133
133
|
<img src="./assets/march-mark.svg" alt="" />
|
|
134
134
|
<div>
|
|
135
|
-
<strong>
|
|
135
|
+
<strong>ccnew</strong>
|
|
136
136
|
<span>Relay Desktop</span>
|
|
137
137
|
</div>
|
|
138
138
|
</div>
|
|
@@ -248,17 +248,17 @@
|
|
|
248
248
|
</div>
|
|
249
249
|
|
|
250
250
|
<div class="download-grid">
|
|
251
|
-
<a class="download-card active" data-platform="windows" href="/downloads/
|
|
251
|
+
<a class="download-card active" data-platform="windows" href="/downloads/ccnew-windows-x64.exe">
|
|
252
252
|
<strong>Windows x64</strong>
|
|
253
253
|
<span>.exe Installer</span>
|
|
254
254
|
<small>推荐首发版本</small>
|
|
255
255
|
</a>
|
|
256
|
-
<a class="download-card" data-platform="macos" href="/downloads/
|
|
256
|
+
<a class="download-card" data-platform="macos" href="/downloads/ccnew-macos.dmg">
|
|
257
257
|
<strong>macOS</strong>
|
|
258
258
|
<span>.dmg Installer</span>
|
|
259
259
|
<small>Apple Silicon / Intel</small>
|
|
260
260
|
</a>
|
|
261
|
-
<a class="download-card" data-platform="linux" href="/downloads/
|
|
261
|
+
<a class="download-card" data-platform="linux" href="/downloads/ccnew-linux.AppImage">
|
|
262
262
|
<strong>Linux</strong>
|
|
263
263
|
<span>.AppImage</span>
|
|
264
264
|
<small>无需额外安装器</small>
|
|
@@ -284,7 +284,7 @@
|
|
|
284
284
|
<article>
|
|
285
285
|
<span>03</span>
|
|
286
286
|
<h3>品牌露出统一</h3>
|
|
287
|
-
<p>外显品牌统一到
|
|
287
|
+
<p>外显品牌统一到 ccnew,命令入口和桌面名称保持一致,观感更完整。</p>
|
|
288
288
|
</article>
|
|
289
289
|
</section>
|
|
290
290
|
|
package/src/App.tsx
CHANGED
|
@@ -656,7 +656,7 @@ export default function App() {
|
|
|
656
656
|
{platform.label} {workspace.activeSectionMeta.title}
|
|
657
657
|
</h2>
|
|
658
658
|
<p className="mt-2 max-w-2xl text-sm leading-6 text-slate-500">
|
|
659
|
-
{activeSection === "providers" ? "这里支持新增、编辑、切换、刷新和连通性检测,配置会立即回写工作区。" : "布局参考 CC Switch 的信息结构,同时延续
|
|
659
|
+
{activeSection === "providers" ? "这里支持新增、编辑、切换、刷新和连通性检测,配置会立即回写工作区。" : "布局参考 CC Switch 的信息结构,同时延续 ccnew 的产品化品牌风格。"}
|
|
660
660
|
</p>
|
|
661
661
|
</div>
|
|
662
662
|
|
|
@@ -31,7 +31,7 @@ export function PromptsView() {
|
|
|
31
31
|
Prompt editor
|
|
32
32
|
</h2>
|
|
33
33
|
<div className="mt-5 rounded-[20px] border border-white/6 bg-[#0b121a] p-4 text-sm leading-7 text-slate-300">
|
|
34
|
-
You are a coding assistant for
|
|
34
|
+
You are a coding assistant for ccnew. Prioritize provider workflows, desktop release preparation,
|
|
35
35
|
route health, and concrete implementation over abstract planning.
|
|
36
36
|
</div>
|
|
37
37
|
</article>
|
package/src/lib/client.ts
CHANGED
|
@@ -178,7 +178,7 @@ function createInitialState(): StoredSnapshot {
|
|
|
178
178
|
];
|
|
179
179
|
|
|
180
180
|
return {
|
|
181
|
-
appName: "
|
|
181
|
+
appName: "ccnew",
|
|
182
182
|
version: "0.1.10",
|
|
183
183
|
generatedAt: now(),
|
|
184
184
|
models: [...DEFAULT_MODELS],
|
|
@@ -279,7 +279,7 @@ async function getSnapshotInternal(): Promise<AppSnapshot> {
|
|
|
279
279
|
if (bridge) {
|
|
280
280
|
const response = (await bridge.getSnapshot()) as DesktopSnapshotResponse;
|
|
281
281
|
const snapshot: AppSnapshot = {
|
|
282
|
-
appName: response.appName || "
|
|
282
|
+
appName: response.appName || "ccnew",
|
|
283
283
|
version: response.version || "0.1.10",
|
|
284
284
|
generatedAt: response.generatedAt || now(),
|
|
285
285
|
models: sanitizeModels((response.models || []).map((item) => (typeof item === "string" ? item : item?.id || "")).filter(Boolean)),
|