fix: MCP provider preserved during update + optional Impeccable commands (#124, #125)

- fix: update no longer resets mcpProvider to 'skip' — reads from existing config (#124)
- feat: init Step 4/4 adds confirm for Impeccable frontend tools, default OFF (#125)
- feat: add X (Twitter) @CCG_Workflow badge + demo tweet link to README
- chore: bump version to 2.1.11
This commit is contained in:
li committed 2026-03-31 19:30:02 +08:00
1 parent ad56c63400
commit ea4cf5d2bc
11 files changed
+70 -6

No files matched your search

+13
View File
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
---
## [2.1.11] - 2026-03-31
### 🐛 修复
- **更新后 MCP 提示词显示未配置**(#124):`update` 无条件传 `--skip-mcp` 导致 `mcpProvider` 被覆盖为 `skip`,已配置 MCP 的用户更新后提示词回退为"未配置"。修复:从已有 `config.toml` 恢复 `mcp.provider`,仅在无历史配置时才 fallback
### ✨ 新功能
- **Impeccable 命令可选安装**(#125):init Step 4/4 新增 confirm 提示,20 个前端设计命令(polish/audit/animate 等)默认不安装,需要的用户自行勾选。update 时保留已有选择
- **X (Twitter) 社区入口**:README header 加 `@CCG_Workflow` 徽章 + 架构图下方 demo 推文链接 + Contact 区 Twitter 入口
---
## [2.1.1] - 2026-03-31
### 🐛 修复
+6 -1
View File
@@ -2,7 +2,7 @@
> [根目录](../CLAUDE.md) > **skills-v2**
**Last Updated**: 2026-03-31 (v2.1.1)
**Last Updated**: 2026-03-31 (v2.1.11)
---
@@ -10,6 +10,11 @@
> 完整变更历史请查看 [CHANGELOG.md](./CHANGELOG.md)
### 2026-03-31 (v2.1.11)
- 🐛 **更新后 MCP 提示词显示未配置**(#124):`update` 无条件传 `--skip-mcp` 导致 `mcpProvider` 被覆盖,修复为从已有配置恢复
- ✨ **Impeccable 命令可选安装**(#125):init 新增 confirm 提示,20 个前端设计命令默认不安装
- ✨ **X (Twitter) 社区入口**:README 加 `@CCG_Workflow` 徽章 + demo 推文 + Contact 区
### 2026-03-31 (v2.1.1)
- 🐛 **Skill Registry 命令 frontmatter 修复**:`generateCommandContent()` 生成的 27 个 command 文件补上 YAML frontmatter,修复 CC 命令索引级联失败
+5 -1
View File
@@ -6,6 +6,7 @@
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Claude Code](https://img.shields.io/badge/Claude%20Code-Compatible-green.svg)](https://claude.ai/code)
[![Tests](https://img.shields.io/badge/Tests-134%20passed-brightgreen.svg)]()
[![Follow on X](https://img.shields.io/badge/X-@CCG__Workflow-black?logo=x&logoColor=white)](https://x.com/CCG_Workflow)
[简体中文](./README.zh-CN.md) | English
@@ -37,6 +38,8 @@ Codex Gemini
External models have no write access — they only return patches, which Claude reviews before applying.
> **🎬 [See CCG in action →](https://x.com/CCG_Workflow/status/2038923720610463876)** — Real multi-model collaboration demo on X
## Quick Start
### Prerequisites
@@ -349,6 +352,7 @@ Looking for a place to start? Check out issues labeled [`good first issue`](http
## Contact
- **X (Twitter)**: [@CCG_Workflow](https://x.com/CCG_Workflow) — Updates, demos, and tips
- **Email**: [fengshao1227@gmail.com](mailto:fengshao1227@gmail.com) — Sponsorship, collaboration, or development ideas
- **Issues**: [GitHub Issues](https://github.com/fengshao1227/ccg-workflow/issues) — Bug reports and feature requests
- **Discussions**: [GitHub Discussions](https://github.com/fengshao1227/ccg-workflow/discussions) — Questions and community chat
@@ -359,4 +363,4 @@ MIT
---
v1.7.86 | [Issues](https://github.com/fengshao1227/ccg-workflow/issues) | [Contributing](./CONTRIBUTING.md)
v2.1.11 | [Issues](https://github.com/fengshao1227/ccg-workflow/issues) | [Contributing](./CONTRIBUTING.md)
+5 -1
View File
@@ -6,6 +6,7 @@
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Claude Code](https://img.shields.io/badge/Claude%20Code-Compatible-green.svg)](https://claude.ai/code)
[![Tests](https://img.shields.io/badge/Tests-134%20passed-brightgreen.svg)]()
[![Follow on X](https://img.shields.io/badge/X-@CCG__Workflow-black?logo=x&logoColor=white)](https://x.com/CCG_Workflow)
简体中文 | [English](./README.md)
@@ -37,6 +38,8 @@ Codex Gemini
外部模型无写入权限,仅返回 Patch,由 Claude 审核后应用。
> **🎬 [查看 CCG 实战演示 →](https://x.com/CCG_Workflow/status/2038923720610463876)** — X 上的多模型协作真实案例
## 快速开始
### 前置条件
@@ -349,6 +352,7 @@ npm uninstall -g ccg-workflow # npm 全局用户需额外执行
## 联系方式
- **X (Twitter)**: [@CCG_Workflow](https://x.com/CCG_Workflow) — 更新动态、实战演示、使用技巧
- **邮箱**: [fengshao1227@gmail.com](mailto:fengshao1227@gmail.com) — 赞助、合作洽谈、开发交流
- **Issues**: [GitHub Issues](https://github.com/fengshao1227/ccg-workflow/issues) — Bug 反馈与功能建议
- **讨论区**: [GitHub Discussions](https://github.com/fengshao1227/ccg-workflow/discussions) — 问题咨询与社区交流
@@ -359,4 +363,4 @@ MIT
---
v1.7.86 | [Issues](https://github.com/fengshao1227/ccg-workflow/issues) | [参与贡献](./CONTRIBUTING.md)
v2.1.11 | [Issues](https://github.com/fengshao1227/ccg-workflow/issues) | [参与贡献](./CONTRIBUTING.md)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "ccg-workflow",
"version": "2.1.1",
"version": "2.1.11",
"description": "Claude + Codex + Gemini multi-model collaboration system - smart routing development workflow",
"type": "module",
"packageManager": "pnpm@10.17.1",
+20 -2
View File
@@ -210,6 +210,7 @@ export async function init(options: InitOptions = {}): Promise<void> {
// Performance mode selection
let liteMode = false
let skipImpeccable = false
// MCP Tool Selection
let mcpProvider = 'ace-tool'
@@ -339,7 +340,10 @@ export async function init(options: InitOptions = {}): Promise<void> {
// Step 3/4: MCP Tools (checkbox multi-select)
// ═══════════════════════════════════════════════════════
if (options.skipMcp) {
mcpProvider = 'skip'
// Fix #124: preserve existing MCP provider from config during update
// instead of unconditionally setting to 'skip'
const existingConfig = await readCcgConfig()
mcpProvider = existingConfig?.mcp?.provider || 'skip'
}
else if (!options.skipPrompt) {
console.log()
@@ -522,13 +526,25 @@ export async function init(options: InitOptions = {}): Promise<void> {
}])
liteMode = perfMode === 'lite'
// Impeccable frontend design commands (optional, default: not installed)
const { includeImpeccable } = await inquirer.prompt([{
type: 'confirm',
name: 'includeImpeccable',
message: i18n.t('init:commands.includeImpeccable'),
default: false,
}])
skipImpeccable = !includeImpeccable
}
else {
// In non-interactive mode (update), preserve existing liteMode setting
// In non-interactive mode (update), preserve existing settings
const existingConfig = await readCcgConfig()
if (existingConfig?.performance?.liteMode !== undefined) {
liteMode = existingConfig.performance.liteMode
}
if (existingConfig?.performance?.skipImpeccable !== undefined) {
skipImpeccable = existingConfig.performance.skipImpeccable
}
}
// Build routing config (user-selectable since v2.1.0)
@@ -634,6 +650,7 @@ export async function init(options: InitOptions = {}): Promise<void> {
installedWorkflows: selectedWorkflows,
mcpProvider,
liteMode,
skipImpeccable,
})
// Save config FIRST - ensure it's created even if installation fails
@@ -645,6 +662,7 @@ export async function init(options: InitOptions = {}): Promise<void> {
routing,
liteMode,
mcpProvider,
skipImpeccable,
})
// Install selected MCP tools (multiple can be installed)
+6
View File
@@ -208,6 +208,9 @@ const zhCN = {
standardOption: '标准模式(含 Web UI 实时监控)',
liteOption: '轻量模式(无 Web UI,响应更快)',
},
commands: {
includeImpeccable: '安装 Impeccable 前端设计工具?(20 个 UI/UX 命令:polish/audit/animate 等)',
},
hooks: {
title: 'codeagent-wrapper 自动授权',
description: '使用 Hook 自动授权 codeagent-wrapper 命令',
@@ -682,6 +685,9 @@ const en: typeof zhCN = {
standardOption: 'Standard (with Web UI real-time monitoring)',
liteOption: 'Lite (no Web UI, faster response)',
},
commands: {
includeImpeccable: 'Install Impeccable frontend design tools? (20 UI/UX commands: polish/audit/animate etc.)',
},
hooks: {
title: 'codeagent-wrapper auto-authorization',
description: 'Use Hook to auto-authorize codeagent-wrapper commands',
+1
View File
@@ -52,6 +52,7 @@ export interface CcgConfig {
}
performance?: {
liteMode?: boolean // 轻量模式:禁用 Web UI,更快响应
skipImpeccable?: boolean // 跳过 Impeccable 前端设计命令安装
}
}
+2
View File
@@ -46,6 +46,7 @@ export function createDefaultConfig(options: {
installedWorkflows: string[]
mcpProvider?: string
liteMode?: boolean
skipImpeccable?: boolean
}): CcgConfig {
return {
general: {
@@ -68,6 +69,7 @@ export function createDefaultConfig(options: {
},
performance: {
liteMode: options.liteMode || false,
skipImpeccable: options.skipImpeccable || false,
},
}
}
+9
View File
@@ -74,6 +74,7 @@ interface InstallConfig {
}
liteMode: boolean
mcpProvider: string
skipImpeccable?: boolean
}
interface InstallContext {
@@ -451,11 +452,17 @@ async function installSkillGeneratedCommands(ctx: InstallContext): Promise<void>
}
}
const skipCategories: import('./skill-registry').SkillCategory[] = []
if (ctx.config.skipImpeccable) {
skipCategories.push('impeccable')
}
const generated = await installSkillCommands(
skillsTemplateDir,
skillsInstallDir,
commandsDir,
existingCommandNames,
skipCategories,
)
if (generated.length > 0) {
@@ -662,6 +669,7 @@ export async function installWorkflows(
}
liteMode?: boolean
mcpProvider?: string
skipImpeccable?: boolean
},
): Promise<InstallResult> {
const ctx: InstallContext = {
@@ -676,6 +684,7 @@ export async function installWorkflows(
},
liteMode: config?.liteMode || false,
mcpProvider: config?.mcpProvider || 'ace-tool',
skipImpeccable: config?.skipImpeccable || false,
},
templateDir: join(PACKAGE_ROOT, 'templates'),
result: {
+2
View File
@@ -280,8 +280,10 @@ export async function installSkillCommands(
skillsInstallDir: string,
commandsDir: string,
existingCommandNames: Set<string>,
skipCategories: SkillCategory[] = [],
): Promise<string[]> {
const invocableSkills = collectInvocableSkills(skillsTemplateDir)
.filter(s => !skipCategories.includes(s.category))
const generated: string[] = []
await fs.ensureDir(commandsDir)