diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a0ff21..f5c5fe4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 ### 🐛 修复 diff --git a/CLAUDE.md b/CLAUDE.md index 188f5dc..2c6e9b3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 命令索引级联失败 diff --git a/README.md b/README.md index 44d49df..65f888f 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/README.zh-CN.md b/README.zh-CN.md index 3e43821..f578dd8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -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) diff --git a/package.json b/package.json index d5ee136..d38e7db 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/commands/init.ts b/src/commands/init.ts index 8da65cd..69824dd 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -210,6 +210,7 @@ export async function init(options: InitOptions = {}): Promise { // 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 { // 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 { }]) 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 { 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 { routing, liteMode, mcpProvider, + skipImpeccable, }) // Install selected MCP tools (multiple can be installed) diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 2144583..c5f1e06 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -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', diff --git a/src/types/index.ts b/src/types/index.ts index 4d04034..70daad5 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -52,6 +52,7 @@ export interface CcgConfig { } performance?: { liteMode?: boolean // 轻量模式:禁用 Web UI,更快响应 + skipImpeccable?: boolean // 跳过 Impeccable 前端设计命令安装 } } diff --git a/src/utils/config.ts b/src/utils/config.ts index 920b6fc..ab8380f 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -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, }, } } diff --git a/src/utils/installer.ts b/src/utils/installer.ts index b97f2a9..5e8c166 100644 --- a/src/utils/installer.ts +++ b/src/utils/installer.ts @@ -74,6 +74,7 @@ interface InstallConfig { } liteMode: boolean mcpProvider: string + skipImpeccable?: boolean } interface InstallContext { @@ -451,11 +452,17 @@ async function installSkillGeneratedCommands(ctx: InstallContext): Promise } } + 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 { 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: { diff --git a/src/utils/skill-registry.ts b/src/utils/skill-registry.ts index 2f9694f..90211fc 100644 --- a/src/utils/skill-registry.ts +++ b/src/utils/skill-registry.ts @@ -280,8 +280,10 @@ export async function installSkillCommands( skillsInstallDir: string, commandsDir: string, existingCommandNames: Set, + skipCategories: SkillCategory[] = [], ): Promise { const invocableSkills = collectInvocableSkills(skillsTemplateDir) + .filter(s => !skipCategories.includes(s.category)) const generated: string[] = [] await fs.ensureDir(commandsDir)