ccg-workflow 2.1.1 → 2.1.12
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 +19 -4
- package/README.zh-CN.md +18 -4
- package/dist/cli.mjs +1 -1
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.mjs +1 -1
- package/dist/shared/{ccg-workflow.pMx0aHNz.mjs → ccg-workflow.CBRd0eXL.mjs} +76 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,22 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
4
|
|
|
5
|
+
<img src="assets/logo/ccg-logo-cropped.png" alt="CCG Workflow" width="400">
|
|
6
|
+
|
|
5
7
|
[](https://www.npmjs.com/package/ccg-workflow)
|
|
6
8
|
[](https://opensource.org/licenses/MIT)
|
|
7
9
|
[](https://claude.ai/code)
|
|
8
|
-
[]()
|
|
11
|
+
[](https://x.com/CCG_Workflow)
|
|
12
|
+

|
|
9
13
|
|
|
10
14
|
[简体中文](./README.zh-CN.md) | English
|
|
11
15
|
|
|
12
16
|
</div>
|
|
13
17
|
|
|
18
|
+
## ♥️ Sponsor
|
|
19
|
+
|
|
20
|
+
[](https://share.302.ai/oUDqQ6)
|
|
21
|
+
|
|
22
|
+
[302.AI](https://share.302.ai/oUDqQ6) is a pay-as-you-go enterprise AI resource hub that offers the latest and most comprehensive AI models and APIs on the market, along with a variety of ready-to-use online AI applications.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
14
26
|
A multi-model collaboration development system where Claude Code orchestrates Codex + Gemini. Frontend tasks route to Gemini, backend tasks route to Codex, and Claude handles orchestration and code review.
|
|
15
27
|
|
|
16
28
|
## Why CCG?
|
|
17
29
|
|
|
18
30
|
- **Zero-config model routing** — Frontend tasks automatically go to Gemini, backend tasks to Codex. No manual switching.
|
|
19
31
|
- **Security by design** — External models have no write access. They return patches; Claude reviews before applying.
|
|
20
|
-
- **
|
|
32
|
+
- **29+ slash commands** — From planning to execution, git workflow to code review, all accessible via `/ccg:*`.
|
|
21
33
|
- **Spec-driven development** — Integrates [OPSX](https://github.com/fission-ai/opsx) to turn vague requirements into verifiable constraints, eliminating AI improvisation.
|
|
22
34
|
|
|
23
35
|
## Architecture
|
|
@@ -37,6 +49,8 @@ Codex Gemini
|
|
|
37
49
|
|
|
38
50
|
External models have no write access — they only return patches, which Claude reviews before applying.
|
|
39
51
|
|
|
52
|
+
> **🎬 [See CCG in action →](https://x.com/CCG_Workflow/status/2038923720610463876)** — Real multi-model collaboration demo on X
|
|
53
|
+
|
|
40
54
|
## Quick Start
|
|
41
55
|
|
|
42
56
|
### Prerequisites
|
|
@@ -197,7 +211,7 @@ Leverage Claude Code Agent Teams to spawn multiple Builder teammates for paralle
|
|
|
197
211
|
|
|
198
212
|
```
|
|
199
213
|
~/.claude/
|
|
200
|
-
├── commands/ccg/ #
|
|
214
|
+
├── commands/ccg/ # 29+ slash commands
|
|
201
215
|
├── agents/ccg/ # Sub-agents
|
|
202
216
|
├── skills/ccg/ # Quality gates + multi-agent orchestration
|
|
203
217
|
├── bin/codeagent-wrapper
|
|
@@ -349,6 +363,7 @@ Looking for a place to start? Check out issues labeled [`good first issue`](http
|
|
|
349
363
|
|
|
350
364
|
## Contact
|
|
351
365
|
|
|
366
|
+
- **X (Twitter)**: [@CCG_Workflow](https://x.com/CCG_Workflow) — Updates, demos, and tips
|
|
352
367
|
- **Email**: [fengshao1227@gmail.com](mailto:fengshao1227@gmail.com) — Sponsorship, collaboration, or development ideas
|
|
353
368
|
- **Issues**: [GitHub Issues](https://github.com/fengshao1227/ccg-workflow/issues) — Bug reports and feature requests
|
|
354
369
|
- **Discussions**: [GitHub Discussions](https://github.com/fengshao1227/ccg-workflow/discussions) — Questions and community chat
|
|
@@ -359,4 +374,4 @@ MIT
|
|
|
359
374
|
|
|
360
375
|
---
|
|
361
376
|
|
|
362
|
-
|
|
377
|
+
v2.1.11 | [Issues](https://github.com/fengshao1227/ccg-workflow/issues) | [Contributing](./CONTRIBUTING.md)
|
package/README.zh-CN.md
CHANGED
|
@@ -2,22 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
4
|
|
|
5
|
+
<img src="assets/logo/ccg-logo-cropped.png" alt="CCG Workflow" width="400">
|
|
6
|
+
|
|
5
7
|
[](https://www.npmjs.com/package/ccg-workflow)
|
|
6
8
|
[](https://opensource.org/licenses/MIT)
|
|
7
9
|
[](https://claude.ai/code)
|
|
8
|
-
[]()
|
|
11
|
+
[](https://x.com/CCG_Workflow)
|
|
9
12
|
|
|
10
13
|
简体中文 | [English](./README.md)
|
|
11
14
|
|
|
12
15
|
</div>
|
|
13
16
|
|
|
17
|
+
## ♥️ 赞助商
|
|
18
|
+
|
|
19
|
+
[](https://share.302.ai/oUDqQ6)
|
|
20
|
+
|
|
21
|
+
[302.AI](https://share.302.ai/oUDqQ6) 是一个按用量付费的企业级 AI 资源平台,提供市场上最新、最全面的 AI 模型和 API,以及多种开箱即用的在线 AI 应用。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
14
25
|
Claude Code 编排 Codex + Gemini 的多模型协作开发系统。前端任务路由至 Gemini,后端任务路由至 Codex,Claude 负责编排决策和代码审核。
|
|
15
26
|
|
|
16
27
|
## 为什么选择 CCG?
|
|
17
28
|
|
|
18
29
|
- **零配置模型路由** — 前端任务自动走 Gemini,后端任务自动走 Codex,无需手动切换。
|
|
19
30
|
- **安全设计** — 外部模型无写入权限,仅返回 Patch,由 Claude 审核后应用。
|
|
20
|
-
- **
|
|
31
|
+
- **29+ 个斜杠命令** — 从规划到执行、Git 工作流到代码审查,通过 `/ccg:*` 一站式访问。
|
|
21
32
|
- **规范驱动开发** — 集成 [OPSX](https://github.com/fission-ai/opsx),将模糊需求变成可验证约束,让 AI 没法自由发挥。
|
|
22
33
|
|
|
23
34
|
## 架构
|
|
@@ -37,6 +48,8 @@ Codex Gemini
|
|
|
37
48
|
|
|
38
49
|
外部模型无写入权限,仅返回 Patch,由 Claude 审核后应用。
|
|
39
50
|
|
|
51
|
+
> **🎬 [查看 CCG 实战演示 →](https://x.com/CCG_Workflow/status/2038923720610463876)** — X 上的多模型协作真实案例
|
|
52
|
+
|
|
40
53
|
## 快速开始
|
|
41
54
|
|
|
42
55
|
### 前置条件
|
|
@@ -197,7 +210,7 @@ npx ccg-workflow menu # 选择「安装 Claude Code」
|
|
|
197
210
|
|
|
198
211
|
```
|
|
199
212
|
~/.claude/
|
|
200
|
-
├── commands/ccg/ #
|
|
213
|
+
├── commands/ccg/ # 29+ 个斜杠命令
|
|
201
214
|
├── agents/ccg/ # 子智能体
|
|
202
215
|
├── skills/ccg/ # 质量关卡 + 多 Agent 协同
|
|
203
216
|
├── bin/codeagent-wrapper
|
|
@@ -349,6 +362,7 @@ npm uninstall -g ccg-workflow # npm 全局用户需额外执行
|
|
|
349
362
|
|
|
350
363
|
## 联系方式
|
|
351
364
|
|
|
365
|
+
- **X (Twitter)**: [@CCG_Workflow](https://x.com/CCG_Workflow) — 更新动态、实战演示、使用技巧
|
|
352
366
|
- **邮箱**: [fengshao1227@gmail.com](mailto:fengshao1227@gmail.com) — 赞助、合作洽谈、开发交流
|
|
353
367
|
- **Issues**: [GitHub Issues](https://github.com/fengshao1227/ccg-workflow/issues) — Bug 反馈与功能建议
|
|
354
368
|
- **讨论区**: [GitHub Discussions](https://github.com/fengshao1227/ccg-workflow/discussions) — 问题咨询与社区交流
|
|
@@ -359,4 +373,4 @@ MIT
|
|
|
359
373
|
|
|
360
374
|
---
|
|
361
375
|
|
|
362
|
-
|
|
376
|
+
v2.1.11 | [Issues](https://github.com/fengshao1227/ccg-workflow/issues) | [参与贡献](./CONTRIBUTING.md)
|
package/dist/cli.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import cac from 'cac';
|
|
3
3
|
import ansis from 'ansis';
|
|
4
|
-
import { z as diagnoseMcpConfig, A as isWindows, B as readClaudeCodeConfig, C as fixWindowsMcpConfig, D as writeClaudeCodeConfig, r as readCcgConfig, b as initI18n, a as i18n, s as showMainMenu, i as init, E as configMcp, F as version } from './shared/ccg-workflow.
|
|
4
|
+
import { z as diagnoseMcpConfig, A as isWindows, B as readClaudeCodeConfig, C as fixWindowsMcpConfig, D as writeClaudeCodeConfig, r as readCcgConfig, b as initI18n, a as i18n, s as showMainMenu, i as init, E as configMcp, F as version } from './shared/ccg-workflow.CBRd0eXL.mjs';
|
|
5
5
|
import 'inquirer';
|
|
6
6
|
import 'ora';
|
|
7
7
|
import 'node:child_process';
|
package/dist/index.d.mts
CHANGED
|
@@ -55,6 +55,7 @@ interface CcgConfig {
|
|
|
55
55
|
};
|
|
56
56
|
performance?: {
|
|
57
57
|
liteMode?: boolean;
|
|
58
|
+
skipImpeccable?: boolean;
|
|
58
59
|
};
|
|
59
60
|
}
|
|
60
61
|
interface WorkflowConfig {
|
|
@@ -123,6 +124,7 @@ declare function createDefaultConfig(options: {
|
|
|
123
124
|
installedWorkflows: string[];
|
|
124
125
|
mcpProvider?: string;
|
|
125
126
|
liteMode?: boolean;
|
|
127
|
+
skipImpeccable?: boolean;
|
|
126
128
|
}): CcgConfig;
|
|
127
129
|
declare function createDefaultRouting(): ModelRouting;
|
|
128
130
|
|
|
@@ -168,6 +170,7 @@ declare function installWorkflows(workflowIds: string[], installDir: string, for
|
|
|
168
170
|
};
|
|
169
171
|
liteMode?: boolean;
|
|
170
172
|
mcpProvider?: string;
|
|
173
|
+
skipImpeccable?: boolean;
|
|
171
174
|
}): Promise<InstallResult>;
|
|
172
175
|
interface UninstallResult {
|
|
173
176
|
success: boolean;
|
package/dist/index.d.ts
CHANGED
|
@@ -55,6 +55,7 @@ interface CcgConfig {
|
|
|
55
55
|
};
|
|
56
56
|
performance?: {
|
|
57
57
|
liteMode?: boolean;
|
|
58
|
+
skipImpeccable?: boolean;
|
|
58
59
|
};
|
|
59
60
|
}
|
|
60
61
|
interface WorkflowConfig {
|
|
@@ -123,6 +124,7 @@ declare function createDefaultConfig(options: {
|
|
|
123
124
|
installedWorkflows: string[];
|
|
124
125
|
mcpProvider?: string;
|
|
125
126
|
liteMode?: boolean;
|
|
127
|
+
skipImpeccable?: boolean;
|
|
126
128
|
}): CcgConfig;
|
|
127
129
|
declare function createDefaultRouting(): ModelRouting;
|
|
128
130
|
|
|
@@ -168,6 +170,7 @@ declare function installWorkflows(workflowIds: string[], installDir: string, for
|
|
|
168
170
|
};
|
|
169
171
|
liteMode?: boolean;
|
|
170
172
|
mcpProvider?: string;
|
|
173
|
+
skipImpeccable?: boolean;
|
|
171
174
|
}): Promise<InstallResult>;
|
|
172
175
|
interface UninstallResult {
|
|
173
176
|
success: boolean;
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { c as changeLanguage, x as checkForUpdates, y as compareVersions, d as createDefaultConfig, e as createDefaultRouting, g as getCcgDir, f as getConfigPath, t as getCurrentVersion, v as getLatestVersion, j as getWorkflowById, h as getWorkflowConfigs, a as i18n, i as init, b as initI18n, l as installAceTool, m as installAceToolRs, k as installWorkflows, p as migrateToV1_4_0, q as needsMigration, r as readCcgConfig, s as showMainMenu, o as uninstallAceTool, n as uninstallWorkflows, u as update, w as writeCcgConfig } from './shared/ccg-workflow.
|
|
1
|
+
export { c as changeLanguage, x as checkForUpdates, y as compareVersions, d as createDefaultConfig, e as createDefaultRouting, g as getCcgDir, f as getConfigPath, t as getCurrentVersion, v as getLatestVersion, j as getWorkflowById, h as getWorkflowConfigs, a as i18n, i as init, b as initI18n, l as installAceTool, m as installAceToolRs, k as installWorkflows, p as migrateToV1_4_0, q as needsMigration, r as readCcgConfig, s as showMainMenu, o as uninstallAceTool, n as uninstallWorkflows, u as update, w as writeCcgConfig } from './shared/ccg-workflow.CBRd0eXL.mjs';
|
|
2
2
|
import 'ansis';
|
|
3
3
|
import 'inquirer';
|
|
4
4
|
import 'ora';
|
|
@@ -10,7 +10,7 @@ import fs from 'fs-extra';
|
|
|
10
10
|
import { parse, stringify } from 'smol-toml';
|
|
11
11
|
import i18next from 'i18next';
|
|
12
12
|
|
|
13
|
-
const version = "2.1.
|
|
13
|
+
const version = "2.1.12";
|
|
14
14
|
|
|
15
15
|
function cmd(id, order, category, name, nameEn, description, descriptionEn, cmdOverride) {
|
|
16
16
|
return {
|
|
@@ -319,8 +319,8 @@ function generateCommandContent(skill, skillsInstallDir) {
|
|
|
319
319
|
`\`\`\``
|
|
320
320
|
].join("\n");
|
|
321
321
|
}
|
|
322
|
-
async function installSkillCommands(skillsTemplateDir, skillsInstallDir, commandsDir, existingCommandNames) {
|
|
323
|
-
const invocableSkills = collectInvocableSkills(skillsTemplateDir);
|
|
322
|
+
async function installSkillCommands(skillsTemplateDir, skillsInstallDir, commandsDir, existingCommandNames, skipCategories = []) {
|
|
323
|
+
const invocableSkills = collectInvocableSkills(skillsTemplateDir).filter((s) => !skipCategories.includes(s.category));
|
|
324
324
|
const generated = [];
|
|
325
325
|
await fs.ensureDir(commandsDir);
|
|
326
326
|
for (const skill of invocableSkills) {
|
|
@@ -1043,11 +1043,16 @@ async function installSkillGeneratedCommands(ctx) {
|
|
|
1043
1043
|
existingCommandNames.add(basename(f, ".md"));
|
|
1044
1044
|
}
|
|
1045
1045
|
}
|
|
1046
|
+
const skipCategories = [];
|
|
1047
|
+
if (ctx.config.skipImpeccable) {
|
|
1048
|
+
skipCategories.push("impeccable");
|
|
1049
|
+
}
|
|
1046
1050
|
const generated = await installSkillCommands(
|
|
1047
1051
|
skillsTemplateDir,
|
|
1048
1052
|
skillsInstallDir,
|
|
1049
1053
|
commandsDir,
|
|
1050
|
-
existingCommandNames
|
|
1054
|
+
existingCommandNames,
|
|
1055
|
+
skipCategories
|
|
1051
1056
|
);
|
|
1052
1057
|
if (generated.length > 0) {
|
|
1053
1058
|
ctx.result.installedCommands.push(...generated);
|
|
@@ -1191,7 +1196,8 @@ async function installWorkflows(workflowIds, installDir, force = false, config)
|
|
|
1191
1196
|
review: { models: ["codex", "gemini"] }
|
|
1192
1197
|
},
|
|
1193
1198
|
liteMode: config?.liteMode || false,
|
|
1194
|
-
mcpProvider: config?.mcpProvider || "ace-tool"
|
|
1199
|
+
mcpProvider: config?.mcpProvider || "ace-tool",
|
|
1200
|
+
skipImpeccable: config?.skipImpeccable || false
|
|
1195
1201
|
},
|
|
1196
1202
|
templateDir: join(PACKAGE_ROOT$1, "templates"),
|
|
1197
1203
|
result: {
|
|
@@ -1839,8 +1845,8 @@ const zhCN = {
|
|
|
1839
1845
|
providerPrompt: "\u9009\u62E9 API \u63D0\u4F9B\u65B9",
|
|
1840
1846
|
officialOption: "Anthropic \u5B98\u65B9\uFF08\u5DF2\u6709\u8D26\u53F7 / Claude Pro / Max \u8BA2\u9605\uFF09",
|
|
1841
1847
|
thirdPartyOption: "\u7B2C\u4E09\u65B9 API \u4EE3\u7406\uFF08\u81EA\u5B9A\u4E49 URL + Key\uFF09",
|
|
1842
|
-
|
|
1843
|
-
|
|
1848
|
+
sponsor302AI: "302.AI\uFF08\u6309\u7528\u91CF\u4ED8\u8D39\u7684\u4F01\u4E1A\u7EA7 AI \u8D44\u6E90\u5E73\u53F0\uFF09",
|
|
1849
|
+
sponsor302AIGetKey: "\u83B7\u53D6 API Key",
|
|
1844
1850
|
urlPrompt: "API URL",
|
|
1845
1851
|
urlRequired: "\u5FC5\u586B",
|
|
1846
1852
|
keyPrompt: "API Key",
|
|
@@ -1875,6 +1881,9 @@ const zhCN = {
|
|
|
1875
1881
|
standardOption: "\u6807\u51C6\u6A21\u5F0F\uFF08\u542B Web UI \u5B9E\u65F6\u76D1\u63A7\uFF09",
|
|
1876
1882
|
liteOption: "\u8F7B\u91CF\u6A21\u5F0F\uFF08\u65E0 Web UI\uFF0C\u54CD\u5E94\u66F4\u5FEB\uFF09"
|
|
1877
1883
|
},
|
|
1884
|
+
commands: {
|
|
1885
|
+
includeImpeccable: "\u5B89\u88C5 Impeccable \u524D\u7AEF\u8BBE\u8BA1\u5DE5\u5177\uFF1F\uFF0820 \u4E2A UI/UX \u547D\u4EE4\uFF1Apolish/audit/animate \u7B49\uFF09"
|
|
1886
|
+
},
|
|
1878
1887
|
hooks: {
|
|
1879
1888
|
title: "codeagent-wrapper \u81EA\u52A8\u6388\u6743",
|
|
1880
1889
|
description: "\u4F7F\u7528 Hook \u81EA\u52A8\u6388\u6743 codeagent-wrapper \u547D\u4EE4",
|
|
@@ -2048,8 +2057,8 @@ const zhCN = {
|
|
|
2048
2057
|
providerPrompt: "\u9009\u62E9 API \u63D0\u4F9B\u65B9",
|
|
2049
2058
|
officialOption: "Anthropic \u5B98\u65B9\uFF08\u4F7F\u7528\u5B98\u65B9\u8D26\u53F7\u767B\u5F55\uFF09",
|
|
2050
2059
|
thirdPartyOption: "\u7B2C\u4E09\u65B9 API \u4EE3\u7406\uFF08\u81EA\u5B9A\u4E49 URL + Key\uFF09",
|
|
2051
|
-
|
|
2052
|
-
|
|
2060
|
+
sponsor302AI: "302.AI\uFF08\u6309\u7528\u91CF\u4ED8\u8D39\u7684\u4F01\u4E1A\u7EA7 AI \u8D44\u6E90\u5E73\u53F0\uFF09",
|
|
2061
|
+
sponsor302AIGetKey: "\u83B7\u53D6 API Key",
|
|
2053
2062
|
urlPrompt: "API URL",
|
|
2054
2063
|
urlRequired: "\u5FC5\u586B",
|
|
2055
2064
|
keyPrompt: "API Key",
|
|
@@ -2312,8 +2321,8 @@ const en = {
|
|
|
2312
2321
|
providerPrompt: "Select API provider",
|
|
2313
2322
|
officialOption: "Anthropic Official (existing account / Claude Pro / Max subscription)",
|
|
2314
2323
|
thirdPartyOption: "Third-party API proxy (custom URL + Key)",
|
|
2315
|
-
|
|
2316
|
-
|
|
2324
|
+
sponsor302AI: "302.AI (Pay-as-you-go Enterprise AI Resource Hub)",
|
|
2325
|
+
sponsor302AIGetKey: "Get API Key",
|
|
2317
2326
|
urlPrompt: "API URL",
|
|
2318
2327
|
urlRequired: "Required",
|
|
2319
2328
|
keyPrompt: "API Key",
|
|
@@ -2348,6 +2357,9 @@ const en = {
|
|
|
2348
2357
|
standardOption: "Standard (with Web UI real-time monitoring)",
|
|
2349
2358
|
liteOption: "Lite (no Web UI, faster response)"
|
|
2350
2359
|
},
|
|
2360
|
+
commands: {
|
|
2361
|
+
includeImpeccable: "Install Impeccable frontend design tools? (20 UI/UX commands: polish/audit/animate etc.)"
|
|
2362
|
+
},
|
|
2351
2363
|
hooks: {
|
|
2352
2364
|
title: "codeagent-wrapper auto-authorization",
|
|
2353
2365
|
description: "Use Hook to auto-authorize codeagent-wrapper commands",
|
|
@@ -2521,8 +2533,8 @@ const en = {
|
|
|
2521
2533
|
providerPrompt: "Select API provider",
|
|
2522
2534
|
officialOption: "Anthropic Official (use official account login)",
|
|
2523
2535
|
thirdPartyOption: "Third-party API proxy (custom URL + Key)",
|
|
2524
|
-
|
|
2525
|
-
|
|
2536
|
+
sponsor302AI: "302.AI (Pay-as-you-go Enterprise AI Resource Hub)",
|
|
2537
|
+
sponsor302AIGetKey: "Get API Key",
|
|
2526
2538
|
urlPrompt: "API URL",
|
|
2527
2539
|
urlRequired: "Required",
|
|
2528
2540
|
keyPrompt: "API Key",
|
|
@@ -2685,7 +2697,8 @@ function createDefaultConfig(options) {
|
|
|
2685
2697
|
setup_url: "https://augmentcode.com/"
|
|
2686
2698
|
},
|
|
2687
2699
|
performance: {
|
|
2688
|
-
liteMode: options.liteMode || false
|
|
2700
|
+
liteMode: options.liteMode || false,
|
|
2701
|
+
skipImpeccable: options.skipImpeccable || false
|
|
2689
2702
|
}
|
|
2690
2703
|
};
|
|
2691
2704
|
}
|
|
@@ -2937,6 +2950,7 @@ async function init(options = {}) {
|
|
|
2937
2950
|
}
|
|
2938
2951
|
}
|
|
2939
2952
|
let liteMode = false;
|
|
2953
|
+
let skipImpeccable = false;
|
|
2940
2954
|
let mcpProvider = "ace-tool";
|
|
2941
2955
|
let aceToolBaseUrl = "";
|
|
2942
2956
|
let aceToolToken = "";
|
|
@@ -2962,10 +2976,23 @@ async function init(options = {}) {
|
|
|
2962
2976
|
choices: [
|
|
2963
2977
|
{ name: `${ansis.green("\u25CF")} ${i18n.t("init:api.officialOption")}`, value: "official" },
|
|
2964
2978
|
{ name: `${ansis.cyan("\u25CF")} ${i18n.t("init:api.thirdPartyOption")}`, value: "thirdparty" },
|
|
2965
|
-
{ name: ansis.
|
|
2979
|
+
{ name: `${ansis.yellow("\u2605")} ${i18n.t("init:api.sponsor302AI")} ${ansis.gray("\u2014 https://share.302.ai/oUDqQ6")}`, value: "302ai" }
|
|
2966
2980
|
]
|
|
2967
2981
|
}]);
|
|
2968
|
-
if (apiProvider === "
|
|
2982
|
+
if (apiProvider === "302ai") {
|
|
2983
|
+
apiUrl = "https://api.302.ai/cc";
|
|
2984
|
+
console.log();
|
|
2985
|
+
console.log(` ${ansis.yellow("\u2605")} ${i18n.t("init:api.sponsor302AIGetKey")}: ${ansis.cyan.underline("https://share.302.ai/oUDqQ6")}`);
|
|
2986
|
+
console.log();
|
|
2987
|
+
const { key } = await inquirer.prompt([{
|
|
2988
|
+
type: "password",
|
|
2989
|
+
name: "key",
|
|
2990
|
+
message: `302.AI API Key ${ansis.gray(`(${i18n.t("init:api.keyRequired")})`)}`,
|
|
2991
|
+
mask: "*",
|
|
2992
|
+
validate: (v) => v.trim() !== "" || i18n.t("init:api.enterKey")
|
|
2993
|
+
}]);
|
|
2994
|
+
apiKey = key?.trim() || "";
|
|
2995
|
+
} else if (apiProvider === "thirdparty") {
|
|
2969
2996
|
const apiAnswers = await inquirer.prompt([
|
|
2970
2997
|
{
|
|
2971
2998
|
type: "input",
|
|
@@ -3038,7 +3065,8 @@ async function init(options = {}) {
|
|
|
3038
3065
|
}
|
|
3039
3066
|
}
|
|
3040
3067
|
if (options.skipMcp) {
|
|
3041
|
-
|
|
3068
|
+
const existingConfig = await readCcgConfig();
|
|
3069
|
+
mcpProvider = existingConfig?.mcp?.provider || "skip";
|
|
3042
3070
|
} else if (!options.skipPrompt) {
|
|
3043
3071
|
console.log();
|
|
3044
3072
|
console.log(ansis.cyan.bold(` \u{1F527} Step 3/4 \u2014 ${i18n.t("init:mcp.title")}`));
|
|
@@ -3190,11 +3218,21 @@ async function init(options = {}) {
|
|
|
3190
3218
|
default: currentLiteMode ? "lite" : "standard"
|
|
3191
3219
|
}]);
|
|
3192
3220
|
liteMode = perfMode === "lite";
|
|
3221
|
+
const { includeImpeccable } = await inquirer.prompt([{
|
|
3222
|
+
type: "confirm",
|
|
3223
|
+
name: "includeImpeccable",
|
|
3224
|
+
message: i18n.t("init:commands.includeImpeccable"),
|
|
3225
|
+
default: false
|
|
3226
|
+
}]);
|
|
3227
|
+
skipImpeccable = !includeImpeccable;
|
|
3193
3228
|
} else {
|
|
3194
3229
|
const existingConfig = await readCcgConfig();
|
|
3195
3230
|
if (existingConfig?.performance?.liteMode !== void 0) {
|
|
3196
3231
|
liteMode = existingConfig.performance.liteMode;
|
|
3197
3232
|
}
|
|
3233
|
+
if (existingConfig?.performance?.skipImpeccable !== void 0) {
|
|
3234
|
+
skipImpeccable = existingConfig.performance.skipImpeccable;
|
|
3235
|
+
}
|
|
3198
3236
|
}
|
|
3199
3237
|
const routing = {
|
|
3200
3238
|
frontend: {
|
|
@@ -3283,14 +3321,16 @@ async function init(options = {}) {
|
|
|
3283
3321
|
routing,
|
|
3284
3322
|
installedWorkflows: selectedWorkflows,
|
|
3285
3323
|
mcpProvider,
|
|
3286
|
-
liteMode
|
|
3324
|
+
liteMode,
|
|
3325
|
+
skipImpeccable
|
|
3287
3326
|
});
|
|
3288
3327
|
await writeCcgConfig(config);
|
|
3289
3328
|
const installDir = options.installDir || join(homedir(), ".claude");
|
|
3290
3329
|
const result = await installWorkflows(selectedWorkflows, installDir, options.force, {
|
|
3291
3330
|
routing,
|
|
3292
3331
|
liteMode,
|
|
3293
|
-
mcpProvider
|
|
3332
|
+
mcpProvider,
|
|
3333
|
+
skipImpeccable
|
|
3294
3334
|
});
|
|
3295
3335
|
spinner.succeed(ansis.green(i18n.t("init:installSuccess")));
|
|
3296
3336
|
if (aceToolToken) {
|
|
@@ -4133,7 +4173,7 @@ async function configApi() {
|
|
|
4133
4173
|
choices: [
|
|
4134
4174
|
{ name: `${ansis.green("\u25CF")} ${i18n.t("menu:api.officialOption")}`, value: "official" },
|
|
4135
4175
|
{ name: `${ansis.cyan("\u25CF")} ${i18n.t("menu:api.thirdPartyOption")}`, value: "thirdparty" },
|
|
4136
|
-
{ name: ansis.
|
|
4176
|
+
{ name: `${ansis.yellow("\u2605")} ${i18n.t("menu:api.sponsor302AI")} ${ansis.gray("\u2014 https://share.302.ai/oUDqQ6")}`, value: "302ai" }
|
|
4137
4177
|
]
|
|
4138
4178
|
}]);
|
|
4139
4179
|
if (apiProvider === "official") {
|
|
@@ -4142,6 +4182,22 @@ async function configApi() {
|
|
|
4142
4182
|
delete settings.env.ANTHROPIC_BASE_URL;
|
|
4143
4183
|
delete settings.env.ANTHROPIC_AUTH_TOKEN;
|
|
4144
4184
|
delete settings.env.ANTHROPIC_API_KEY;
|
|
4185
|
+
} else if (apiProvider === "302ai") {
|
|
4186
|
+
console.log();
|
|
4187
|
+
console.log(` ${ansis.yellow("\u2605")} ${i18n.t("menu:api.sponsor302AIGetKey")}: ${ansis.cyan.underline("https://share.302.ai/oUDqQ6")}`);
|
|
4188
|
+
console.log();
|
|
4189
|
+
const { key } = await inquirer.prompt([{
|
|
4190
|
+
type: "password",
|
|
4191
|
+
name: "key",
|
|
4192
|
+
message: `302.AI API Key ${ansis.gray(`(${i18n.t("menu:api.keyRequired")})`)}`,
|
|
4193
|
+
mask: "*",
|
|
4194
|
+
validate: (v) => v.trim() !== "" || i18n.t("menu:api.enterKey")
|
|
4195
|
+
}]);
|
|
4196
|
+
if (!settings.env)
|
|
4197
|
+
settings.env = {};
|
|
4198
|
+
settings.env.ANTHROPIC_BASE_URL = "https://api.302.ai/cc";
|
|
4199
|
+
settings.env.ANTHROPIC_AUTH_TOKEN = key.trim();
|
|
4200
|
+
delete settings.env.ANTHROPIC_API_KEY;
|
|
4145
4201
|
} else {
|
|
4146
4202
|
const answers = await inquirer.prompt([
|
|
4147
4203
|
{
|
package/package.json
CHANGED