zhuge-workflow 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.
Files changed (80) hide show
  1. package/dist/index.js +801 -0
  2. package/dist/index.js.map +1 -0
  3. package/package.json +61 -0
  4. package/templates/claude/CLAUDE-ccg.md +258 -0
  5. package/templates/claude/CLAUDE.md +106 -0
  6. package/templates/claude/commands/ccg/_context.md +152 -0
  7. package/templates/claude/commands/ccg/spec-impl.md +161 -0
  8. package/templates/claude/commands/ccg/spec-plan-trellis.md +239 -0
  9. package/templates/claude/commands/ccg/spec-plan.md +225 -0
  10. package/templates/claude/commands/ccg/spec-research.md +113 -0
  11. package/templates/claude/commands/ccg/spec-review.md +127 -0
  12. package/templates/claude/commands/developer/brainstorm.md +5 -0
  13. package/templates/claude/commands/developer/design-checklist.md +81 -0
  14. package/templates/claude/commands/developer/design-doc.md +188 -0
  15. package/templates/claude/commands/developer/requirement-doc.md +150 -0
  16. package/templates/claude/commands/developer/requirement-interrogate.md +71 -0
  17. package/templates/claude/commands/developer/status.md +55 -0
  18. package/templates/claude/rules/bash-style.md +46 -0
  19. package/templates/claude/rules/claude-code-defensive.md +99 -0
  20. package/templates/claude/rules/doc-sync.md +49 -0
  21. package/templates/claude/rules/ops-safety.md +32 -0
  22. package/templates/claude/skills/bash-style/SKILL.md +244 -0
  23. package/templates/claude/skills/brainstorming/SKILL.md +48 -0
  24. package/templates/claude/skills/dotnet-dev/SKILL.md +250 -0
  25. package/templates/claude/skills/dotnet-dev/references/dotnet-style.md +991 -0
  26. package/templates/claude/skills/mcp-builder/LICENSE.txt +202 -0
  27. package/templates/claude/skills/mcp-builder/SKILL.md +328 -0
  28. package/templates/claude/skills/mcp-builder/reference/evaluation.md +602 -0
  29. package/templates/claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
  30. package/templates/claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
  31. package/templates/claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
  32. package/templates/claude/skills/mcp-builder/scripts/connections.py +151 -0
  33. package/templates/claude/skills/mcp-builder/scripts/evaluation.py +373 -0
  34. package/templates/claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  35. package/templates/claude/skills/mcp-builder/scripts/requirements.txt +2 -0
  36. package/templates/claude/skills/ops-safety/SKILL.md +130 -0
  37. package/templates/claude/skills/python-dev/SKILL.md +281 -0
  38. package/templates/claude/skills/skill-creator/LICENSE.txt +202 -0
  39. package/templates/claude/skills/skill-creator/SKILL.md +209 -0
  40. package/templates/claude/skills/skill-creator/scripts/init_skill.py +303 -0
  41. package/templates/claude/skills/skill-creator/scripts/package_skill.py +110 -0
  42. package/templates/claude/skills/skill-creator/scripts/quick_validate.py +65 -0
  43. package/templates/claude/skills/sqlserver-executor/SKILL.md +201 -0
  44. package/templates/claude/skills/sqlserver-executor/assets/config-example.json +26 -0
  45. package/templates/claude/skills/sqlserver-executor/config.json +12 -0
  46. package/templates/claude/skills/sqlserver-executor/scripts/sql_executor.py +404 -0
  47. package/templates/claude/skills/ui-ux-pro-max/SKILL.md +228 -0
  48. package/templates/claude/skills/ui-ux-pro-max/data/charts.csv +26 -0
  49. package/templates/claude/skills/ui-ux-pro-max/data/colors.csv +97 -0
  50. package/templates/claude/skills/ui-ux-pro-max/data/landing.csv +31 -0
  51. package/templates/claude/skills/ui-ux-pro-max/data/products.csv +97 -0
  52. package/templates/claude/skills/ui-ux-pro-max/data/prompts.csv +24 -0
  53. package/templates/claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  54. package/templates/claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  55. package/templates/claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  56. package/templates/claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  57. package/templates/claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  58. package/templates/claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  59. package/templates/claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  60. package/templates/claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  61. package/templates/claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  62. package/templates/claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  63. package/templates/claude/skills/ui-ux-pro-max/data/styles.csv +59 -0
  64. package/templates/claude/skills/ui-ux-pro-max/data/typography.csv +58 -0
  65. package/templates/claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  66. package/templates/claude/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  67. package/templates/claude/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  68. package/templates/claude/skills/ui-ux-pro-max/scripts/core.py +238 -0
  69. package/templates/claude/skills/ui-ux-pro-max/scripts/search.py +61 -0
  70. package/templates/claude/skills/webapp-testing/LICENSE.txt +202 -0
  71. package/templates/claude/skills/webapp-testing/SKILL.md +96 -0
  72. package/templates/claude/skills/webapp-testing/examples/console_logging.py +35 -0
  73. package/templates/claude/skills/webapp-testing/examples/element_discovery.py +40 -0
  74. package/templates/claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
  75. package/templates/claude/skills/webapp-testing/scripts/with_server.py +106 -0
  76. package/templates/init/claude-agents/ccg-impl.md +199 -0
  77. package/templates/init/claude-agents/ccg-review.md +146 -0
  78. package/templates/init/claude-agents/dispatch.md +253 -0
  79. package/templates/init/claude-hooks/inject-subagent-context.py +964 -0
  80. package/templates/init/trellis-scripts/task.sh +1326 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/setup.ts","../src/utils/shell.ts","../src/adapters/base-adapter.ts","../src/adapters/openspec.adapter.ts","../src/adapters/trellis.adapter.ts","../src/adapters/ccb.adapter.ts","../src/utils/platform.ts","../src/adapters/ccg.adapter.ts","../src/adapters/index.ts","../src/utils/logger.ts","../src/core/plugin-runner.ts","../src/core/config-deployer.ts","../src/core/config-source.ts","../src/configs/claude.config.ts","../src/configs/index.ts","../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { setupCommand } from './commands/setup.js'\nimport { initCommand } from './commands/init.js'\n\nconst program = new Command()\n\nprogram\n .name('zhuge')\n .description('AI development workflow installer and manager')\n .version('0.1.0')\n\nprogram\n .command('setup')\n .description('Install external tools and deploy AI config files')\n .option('--yes', 'Skip all prompts and use defaults (CI mode)')\n .action(async (options) => {\n await setupCommand(options)\n })\n\nprogram\n .command('init')\n .description('Initialize project-level documents in current directory')\n .action(async () => {\n await initCommand()\n })\n\nprogram.parse()\n","import chalk from 'chalk'\nimport { checkbox, confirm, select } from '@inquirer/prompts'\nimport { getAllAdapters } from '../adapters/index.js'\nimport { checkAllAdapters, runAdapter, type AdapterAction } from '../core/plugin-runner.js'\nimport type { SetupOptions } from '../core/types.js'\nimport { isCI } from '../utils/platform.js'\nimport * as logger from '../utils/logger.js'\nimport { deployConfigs } from '../core/config-deployer.js'\nimport { getConfigTargetsByNames } from '../configs/index.js'\n\nexport async function setupCommand(options: SetupOptions) {\n const ciMode = options.yes || isCI()\n\n logger.title('zhuge setup')\n\n // 1. 检测所有工具状态\n const adapters = getAllAdapters()\n const actions = await checkAllAdapters(adapters)\n\n // 2. 展示状态表格\n printStatusTable(actions)\n\n // 3. 筛选可操作的工具\n const actionable = actions.filter((a) => a.action !== 'skip')\n const skippable = actions.filter((a) => a.action === 'skip')\n\n if (actionable.length === 0 && skippable.length === actions.length) {\n logger.success('All tools are up to date!')\n }\n\n // 4. 交互选择要安装/更新的工具\n let selected: AdapterAction[]\n\n if (ciMode) {\n // CI 模式:全部执行\n selected = actionable\n } else if (actionable.length === 0) {\n // 没有可操作的,询问是否重新配置已安装的工具\n const reconfig = await confirm({\n message: 'All tools installed. Reconfigure any tool?',\n default: false,\n })\n if (!reconfig) {\n selected = []\n } else {\n const choices = skippable.map((a) => ({\n name: `${a.adapter.meta.displayName} (reconfigure)`,\n value: a,\n }))\n const picked = await checkbox({\n message: 'Select tools to reconfigure:',\n choices,\n })\n // 重新配置 = 重新安装\n selected = picked.map((p) => ({ ...p, action: 'install' as const }))\n }\n } else {\n const choices = actionable.map((a) => ({\n name: formatActionChoice(a),\n value: a,\n checked: true,\n }))\n selected = await checkbox({\n message: 'Select tools to install/update:',\n choices,\n })\n }\n\n // 5. 逐个询问版本策略 & 依次执行\n if (selected.length > 0) {\n // 为每个支持版本锁定的工具单独询问版本策略\n const versionMap = new Map<string, string | undefined>()\n\n if (!ciMode) {\n for (const item of selected) {\n if (item.adapter.meta.pinnedVersion) {\n const strategy = await select({\n message: `${item.adapter.meta.displayName} - Version strategy:`,\n choices: [\n {\n name: `Pinned v${item.adapter.meta.pinnedVersion} (tested with zhuge)`,\n value: 'pinned' as const,\n },\n { name: 'Latest version', value: 'latest' as const },\n ],\n })\n if (strategy === 'pinned') {\n versionMap.set(item.adapter.meta.name, item.adapter.meta.pinnedVersion)\n }\n }\n }\n }\n\n console.log()\n for (const item of selected) {\n try {\n const version = versionMap.get(item.adapter.meta.name)\n await runAdapter(item.adapter, item.action === 'skip' ? 'install' : item.action, version)\n } catch (err) {\n logger.error(`Failed: ${item.adapter.meta.displayName} - ${err}`)\n }\n }\n }\n\n // 6. 配置部署阶段\n await deployConfigsPhase(ciMode)\n\n // 7. 完成摘要\n console.log()\n logger.title('Setup Complete')\n if (selected.length > 0) {\n for (const item of selected) {\n const verb = item.action === 'update' ? 'Updated' : 'Installed'\n logger.success(`${verb}: ${item.adapter.meta.displayName}`)\n }\n } else {\n logger.info('No tools were installed or updated.')\n }\n}\n\nfunction printStatusTable(actions: AdapterAction[]) {\n console.log()\n const header = ` ${pad('Tool', 24)} ${pad('Status', 10)} ${pad('Version', 12)} Action`\n console.log(chalk.dim(header))\n console.log(chalk.dim(' ' + '─'.repeat(64)))\n\n for (const { adapter, status, action } of actions) {\n const name = pad(adapter.meta.displayName, 24)\n const st = status.installed\n ? chalk.green(pad('OK', 10))\n : chalk.red(pad('Missing', 10))\n const ver = pad(status.version || '-', 12)\n const act =\n action === 'install'\n ? chalk.yellow('Install')\n : action === 'update'\n ? chalk.cyan(`Update → ${status.latestVersion || '?'}`)\n : chalk.dim('Skip')\n console.log(` ${name} ${st} ${ver} ${act}`)\n }\n console.log()\n}\n\nfunction formatActionChoice(a: AdapterAction): string {\n if (a.action === 'install') {\n return `${a.adapter.meta.displayName} - Install`\n }\n return `${a.adapter.meta.displayName} - Update to ${a.status.latestVersion || 'latest'}`\n}\n\nfunction pad(s: string, len: number): string {\n return s.padEnd(len)\n}\n\nasync function deployConfigsPhase(ciMode: boolean) {\n console.log()\n if (ciMode) {\n logger.info('Config deployment skipped in CI mode (use zhuge setup interactively)')\n return\n }\n\n const deploy = await confirm({\n message: 'Deploy AI tool config files?',\n default: true,\n })\n\n if (!deploy) return\n\n const targets = await checkbox({\n message: 'Deploy configs to:',\n choices: [\n { name: 'Claude Code (~/.claude/)', value: 'claude', checked: true },\n ],\n })\n\n if (targets.length === 0) {\n logger.info('No config targets selected, skipping.')\n return\n }\n\n const configTargets = getConfigTargetsByNames(targets)\n await deployConfigs(configTargets)\n}\n","import { execa, type Options as ExecaOptions } from 'execa'\n\n/** 捕获输出的执行(用于 check、获取版本等) */\nexport async function exec(cmd: string, args: string[], opts?: ExecaOptions) {\n return execa(cmd, args, { ...opts, reject: true })\n}\n\n/** 透传 stdio 的执行(用于交互式安装) */\nexport async function execInherit(cmd: string, args: string[], opts?: ExecaOptions) {\n return execa(cmd, args, {\n ...opts,\n stdio: 'inherit',\n })\n}\n\n/** 检查命令是否存在 */\nexport async function commandExists(cmd: string): Promise<boolean> {\n try {\n await execa('which', [cmd])\n return true\n } catch {\n return false\n }\n}\n","import type { PluginAdapter, AdapterMeta, ToolStatus } from '../core/types.js'\nimport { exec, commandExists } from '../utils/shell.js'\n\nexport abstract class BaseAdapter implements PluginAdapter {\n abstract readonly meta: AdapterMeta\n\n abstract check(): Promise<ToolStatus>\n abstract install(version?: string): Promise<void>\n abstract update(version?: string): Promise<void>\n abstract uninstall(): Promise<void>\n\n /** 执行命令并提取版本号 */\n protected async getVersionFromCommand(\n cmd: string,\n args: string[] = ['--version'],\n ): Promise<string | undefined> {\n try {\n const result = await exec(cmd, args)\n const stdout = String(result.stdout ?? '')\n const match = stdout.match(/v?(\\d+\\.\\d+\\.\\d+)/)\n return match?.[1]\n } catch {\n return undefined\n }\n }\n\n /** 检查命令是否存在 */\n protected commandExists(cmd: string): Promise<boolean> {\n return commandExists(cmd)\n }\n\n /** 获取 npm 包最新版本 */\n protected async getLatestNpmVersion(packageName: string): Promise<string | undefined> {\n try {\n const result = await exec('npm', ['info', packageName, 'version'])\n return String(result.stdout ?? '').trim()\n } catch {\n return undefined\n }\n }\n}\n","import { BaseAdapter } from './base-adapter.js'\nimport type { AdapterMeta, ToolStatus } from '../core/types.js'\nimport { execInherit } from '../utils/shell.js'\n\nexport class OpenSpecAdapter extends BaseAdapter {\n readonly meta: AdapterMeta = {\n name: 'openspec',\n displayName: 'OpenSpec',\n description: 'AI-native spec-driven development',\n installMethod: 'npm-global',\n required: false,\n order: 1,\n interactive: false,\n pinnedVersion: '1.1.1',\n }\n\n private readonly packageName = '@fission-ai/openspec'\n private readonly binName = 'openspec'\n\n async check(): Promise<ToolStatus> {\n const installed = await this.commandExists(this.binName)\n if (!installed) return { installed: false }\n\n const version = await this.getVersionFromCommand(this.binName)\n const latest = await this.getLatestNpmVersion(this.packageName)\n return {\n installed: true,\n version,\n latestVersion: latest,\n updateAvailable: !!(version && latest && version !== latest),\n }\n }\n\n async install(version?: string): Promise<void> {\n const pkg = version ? `${this.packageName}@${version}` : this.packageName\n await execInherit('npm', ['install', '-g', pkg])\n }\n\n async update(version?: string): Promise<void> {\n if (version) {\n await execInherit('npm', ['install', '-g', `${this.packageName}@${version}`])\n } else {\n await execInherit('npm', ['update', '-g', this.packageName])\n }\n }\n\n async uninstall(): Promise<void> {\n await execInherit('npm', ['uninstall', '-g', this.packageName])\n }\n\n async initProject(cwd: string): Promise<void> {\n await execInherit(this.binName, ['init'], { cwd })\n }\n}\n","import { BaseAdapter } from './base-adapter.js'\nimport type { AdapterMeta, ToolStatus } from '../core/types.js'\nimport { execInherit } from '../utils/shell.js'\n\nexport class TrellisAdapter extends BaseAdapter {\n readonly meta: AdapterMeta = {\n name: 'trellis',\n displayName: 'Trellis',\n description: 'AI workflow structure for Claude Code and Cursor',\n installMethod: 'npm-global',\n required: false,\n order: 2,\n interactive: false,\n pinnedVersion: '0.2.15',\n }\n\n private readonly packageName = '@mindfoldhq/trellis'\n private readonly binName = 'trellis'\n\n async check(): Promise<ToolStatus> {\n const installed = await this.commandExists(this.binName)\n if (!installed) return { installed: false }\n\n const version = await this.getVersionFromCommand(this.binName)\n const latest = await this.getLatestNpmVersion(this.packageName)\n return {\n installed: true,\n version,\n latestVersion: latest,\n updateAvailable: !!(version && latest && version !== latest),\n }\n }\n\n async install(version?: string): Promise<void> {\n const pkg = version ? `${this.packageName}@${version}` : this.packageName\n await execInherit('npm', ['install', '-g', pkg])\n }\n\n async update(version?: string): Promise<void> {\n if (version) {\n await execInherit('npm', ['install', '-g', `${this.packageName}@${version}`])\n } else {\n await execInherit('npm', ['update', '-g', this.packageName])\n }\n }\n\n async uninstall(): Promise<void> {\n await execInherit('npm', ['uninstall', '-g', this.packageName])\n }\n\n async initProject(cwd: string): Promise<void> {\n await execInherit(this.binName, ['init'], { cwd })\n }\n}\n","import { BaseAdapter } from './base-adapter.js'\nimport type { AdapterMeta, ToolStatus } from '../core/types.js'\nimport { execInherit } from '../utils/shell.js'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { getHome } from '../utils/platform.js'\n\nexport class CcbAdapter extends BaseAdapter {\n readonly meta: AdapterMeta = {\n name: 'ccb',\n displayName: 'Claude Code Bridge (CCB)',\n description: 'Multi-model collaboration via split-pane terminal',\n installMethod: 'git-clone-script',\n required: false,\n order: 3,\n interactive: false,\n }\n\n private readonly repoUrl = 'https://github.com/bfly123/claude_code_bridge.git'\n\n private get cloneDir(): string {\n return resolve(getHome(), '.local/share/claude_code_bridge')\n }\n\n async check(): Promise<ToolStatus> {\n const installed = await this.commandExists('ccb')\n if (!installed) return { installed: false }\n\n const version = await this.getVersionFromCommand('ccb')\n return { installed: true, version }\n }\n\n async install(): Promise<void> {\n if (!existsSync(this.cloneDir)) {\n await execInherit('git', ['clone', this.repoUrl, this.cloneDir])\n }\n await execInherit('bash', ['./install.sh', 'install'], { cwd: this.cloneDir })\n }\n\n async update(): Promise<void> {\n if (existsSync(this.cloneDir)) {\n await execInherit('git', ['-C', this.cloneDir, 'pull'])\n } else {\n await execInherit('git', ['clone', this.repoUrl, this.cloneDir])\n }\n await execInherit('bash', ['./install.sh', 'install'], { cwd: this.cloneDir })\n }\n\n async uninstall(): Promise<void> {\n if (existsSync(this.cloneDir)) {\n await execInherit('bash', ['./install.sh', 'uninstall'], { cwd: this.cloneDir })\n }\n }\n}\n","import { homedir } from 'node:os'\nimport { resolve } from 'node:path'\n\n/** 展开路径中的 ~ 为用户 HOME 目录 */\nexport function expandHome(p: string): string {\n if (p.startsWith('~/') || p === '~') {\n return resolve(homedir(), p.slice(2))\n }\n return p\n}\n\n/** 获取 HOME 目录(支持 ZHUGE_HOME 环境变量覆盖,用于测试沙盒) */\nexport function getHome(): string {\n return process.env.ZHUGE_HOME || homedir()\n}\n\n/** 是否 CI 模式 */\nexport function isCI(): boolean {\n return process.env.ZHUGE_CI === 'true' || process.env.CI === 'true'\n}\n","import { BaseAdapter } from './base-adapter.js'\nimport type { AdapterMeta, ToolStatus } from '../core/types.js'\nimport { execInherit } from '../utils/shell.js'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { getHome } from '../utils/platform.js'\n\nexport class CcgAdapter extends BaseAdapter {\n readonly meta: AdapterMeta = {\n name: 'ccg',\n displayName: 'CCG Workflow',\n description: 'Claude Code enhanced multi-model workflow',\n installMethod: 'npx',\n required: false,\n order: 4,\n interactive: true,\n pinnedVersion: '1.7.61',\n }\n\n private get configPath(): string {\n return resolve(getHome(), '.claude/.ccg/config.toml')\n }\n\n async check(): Promise<ToolStatus> {\n const installed = existsSync(this.configPath)\n if (!installed) return { installed: false }\n return { installed: true, version: 'detected' }\n }\n\n async install(version?: string): Promise<void> {\n const pkg = version ? `ccg-workflow@${version}` : 'ccg-workflow@latest'\n await execInherit('npx', [pkg])\n }\n\n async update(version?: string): Promise<void> {\n await this.install(version)\n }\n\n async uninstall(): Promise<void> {\n // ccg 无专用 uninstall 命令\n const ccgDir = resolve(getHome(), '.claude/.ccg')\n if (existsSync(ccgDir)) {\n const { rmSync } = await import('node:fs')\n rmSync(ccgDir, { recursive: true, force: true })\n }\n }\n}\n","import type { PluginAdapter } from '../core/types.js'\nimport { OpenSpecAdapter } from './openspec.adapter.js'\nimport { TrellisAdapter } from './trellis.adapter.js'\nimport { CcbAdapter } from './ccb.adapter.js'\nimport { CcgAdapter } from './ccg.adapter.js'\n\n/** 所有已注册的 adapter,按 order 排序 */\nexport function getAllAdapters(): PluginAdapter[] {\n return [\n new OpenSpecAdapter(),\n new TrellisAdapter(),\n new CcbAdapter(),\n new CcgAdapter(),\n ].sort((a, b) => a.meta.order - b.meta.order)\n}\n","import chalk from 'chalk'\nimport ora, { type Ora } from 'ora'\n\nexport function info(msg: string) {\n console.log(chalk.blue('ℹ'), msg)\n}\n\nexport function success(msg: string) {\n console.log(chalk.green('✔'), msg)\n}\n\nexport function warn(msg: string) {\n console.log(chalk.yellow('⚠'), msg)\n}\n\nexport function error(msg: string) {\n console.log(chalk.red('✖'), msg)\n}\n\nexport function spinner(text: string): Ora {\n return ora({ text, color: 'cyan' }).start()\n}\n\nexport function title(text: string) {\n console.log()\n console.log(chalk.bold.cyan(text))\n console.log(chalk.dim('─'.repeat(text.length + 4)))\n}\n","import type { PluginAdapter, ToolStatus } from './types.js'\nimport * as logger from '../utils/logger.js'\n\nexport interface AdapterAction {\n adapter: PluginAdapter\n status: ToolStatus\n action: 'install' | 'update' | 'skip'\n}\n\n/** 检测所有工具状态 */\nexport async function checkAllAdapters(adapters: PluginAdapter[]): Promise<AdapterAction[]> {\n const spin = logger.spinner('Checking installed tools...')\n\n const results: AdapterAction[] = []\n for (const adapter of adapters) {\n try {\n const status = await adapter.check()\n let action: 'install' | 'update' | 'skip'\n if (!status.installed) {\n action = 'install'\n } else if (status.updateAvailable) {\n action = 'update'\n } else {\n action = 'skip'\n }\n results.push({ adapter, status, action })\n } catch {\n results.push({\n adapter,\n status: { installed: false },\n action: 'install',\n })\n }\n }\n\n spin.succeed('Tool check complete')\n return results\n}\n\n/** 执行单个 adapter 的安装/更新 */\nexport async function runAdapter(\n adapter: PluginAdapter,\n action: 'install' | 'update',\n version?: string,\n): Promise<void> {\n if (adapter.meta.interactive) {\n // 交互式工具:暂停 spinner,让工具自己控制终端\n console.log()\n logger.info(`Starting ${adapter.meta.displayName} (interactive)...`)\n console.log()\n await adapter[action](version)\n console.log()\n } else {\n const spin = logger.spinner(\n `${action === 'install' ? 'Installing' : 'Updating'} ${adapter.meta.displayName}${version ? `@${version}` : ''}...`,\n )\n try {\n await adapter[action](version)\n spin.succeed(`${adapter.meta.displayName} ${action === 'install' ? 'installed' : 'updated'}${version ? ` (v${version})` : ''}`)\n } catch (err) {\n spin.fail(`${adapter.meta.displayName} ${action} failed`)\n throw err\n }\n }\n}\n","import { resolve, dirname, basename } from 'node:path'\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n copyFileSync,\n mkdirSync,\n renameSync,\n readdirSync,\n statSync,\n} from 'node:fs'\nimport type { ConfigDeployRule, ConfigTarget } from './types.js'\nimport { getBundledTemplatesDir } from './config-source.js'\nimport { expandHome } from '../utils/platform.js'\nimport * as logger from '../utils/logger.js'\n\n/** 部署配置到目标 */\nexport async function deployConfigs(\n targets: ConfigTarget[],\n): Promise<void> {\n const templatesDir = getBundledTemplatesDir()\n\n for (const target of targets) {\n const spin = logger.spinner(`Deploying configs to ${target.displayName}...`)\n\n try {\n let deployed = 0\n for (const rule of target.rules) {\n const sourcePath = resolve(templatesDir, target.name, rule.source)\n const targetPath = expandHome(rule.target)\n\n if (!existsSync(sourcePath)) {\n continue\n }\n\n // 确保目标目录存在\n mkdirSync(dirname(targetPath), { recursive: true })\n\n if (statSync(sourcePath).isDirectory()) {\n deployed += deployDirectory(sourcePath, targetPath, rule.strategy)\n } else {\n deployFile(sourcePath, targetPath, rule)\n deployed++\n }\n }\n\n spin.succeed(`${target.displayName}: ${deployed} file(s) deployed`)\n } catch (err) {\n spin.fail(`${target.displayName}: deploy failed`)\n logger.error(String(err))\n }\n }\n}\n\n/** 部署单个文件 */\nfunction deployFile(source: string, target: string, rule: ConfigDeployRule): void {\n switch (rule.strategy) {\n case 'replace':\n deployReplace(source, target)\n break\n case 'append':\n deployAppend(source, target)\n break\n case 'merge-section':\n if (!rule.sectionMarker) {\n throw new Error(`merge-section requires sectionMarker for ${rule.source}`)\n }\n deployMergeSection(source, target, rule.sectionMarker)\n break\n }\n}\n\n/** 整文件替换(备份旧文件) */\nfunction deployReplace(source: string, target: string): void {\n if (existsSync(target)) {\n const backupPath = `${target}.bak.${Date.now()}`\n renameSync(target, backupPath)\n }\n copyFileSync(source, target)\n}\n\n/** 追加到文件末尾(幂等:已包含则跳过) */\nfunction deployAppend(source: string, target: string): void {\n const content = readFileSync(source, 'utf-8')\n\n if (existsSync(target)) {\n const existing = readFileSync(target, 'utf-8')\n if (existing.includes(content.trim())) return\n writeFileSync(target, existing + '\\n' + content)\n } else {\n writeFileSync(target, content)\n }\n}\n\n/** 用 HTML comment marker 替换指定区段 */\nfunction deployMergeSection(\n source: string,\n target: string,\n marker: { start: string; end: string },\n): void {\n const newContent = readFileSync(source, 'utf-8')\n\n if (!existsSync(target)) {\n writeFileSync(target, newContent)\n return\n }\n\n const existing = readFileSync(target, 'utf-8')\n const startIdx = existing.indexOf(marker.start)\n const endIdx = existing.indexOf(marker.end)\n\n if (startIdx !== -1 && endIdx !== -1) {\n const before = existing.substring(0, startIdx)\n const after = existing.substring(endIdx + marker.end.length)\n writeFileSync(target, before + newContent + after)\n } else {\n // marker 不存在,降级为 append\n logger.warn(`Section markers not found in ${basename(target)}, appending instead`)\n writeFileSync(target, existing + '\\n' + newContent)\n }\n}\n\n/** 部署整个目录(递归复制) */\nfunction deployDirectory(sourceDir: string, targetDir: string, _strategy: string): number {\n mkdirSync(targetDir, { recursive: true })\n let count = 0\n\n for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {\n const srcPath = resolve(sourceDir, entry.name)\n const tgtPath = resolve(targetDir, entry.name)\n\n if (entry.isDirectory()) {\n count += deployDirectory(srcPath, tgtPath, _strategy)\n } else {\n copyFileSync(srcPath, tgtPath)\n count++\n }\n }\n\n return count\n}\n","import { resolve, dirname } from 'node:path'\nimport { existsSync, statSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\n/** 获取模板目录路径 */\nexport function getBundledTemplatesDir(): string {\n let dir = __dirname\n for (let i = 0; i < 5; i++) {\n const candidate = resolve(dir, 'templates')\n if (existsSync(candidate) && statSync(candidate).isDirectory()) {\n return candidate\n }\n dir = resolve(dir, '..')\n }\n throw new Error('Could not find templates directory')\n}\n","import { existsSync } from 'node:fs'\nimport type { ConfigTarget } from '../core/types.js'\nimport { expandHome } from '../utils/platform.js'\n\nexport const claudeConfig: ConfigTarget = {\n name: 'claude',\n displayName: 'Claude Code',\n configDir: '~/.claude',\n detect: async () => existsSync(expandHome('~/.claude')),\n rules: [\n // CLAUDE.md - Global 区块(个人配置)\n {\n source: 'CLAUDE.md',\n target: '~/.claude/CLAUDE.md',\n strategy: 'merge-section',\n sectionMarker: {\n start: '<!-- Global -->',\n end: '<!-- Global_END -->',\n },\n },\n // CLAUDE.md - CCG 增强区块\n {\n source: 'CLAUDE-ccg.md',\n target: '~/.claude/CLAUDE.md',\n strategy: 'merge-section',\n sectionMarker: {\n start: '<!-- CCG 增强 -->',\n end: '<!-- CCG 增强_END -->',\n },\n },\n // rules - 整体替换(全部由 zhuge 管理)\n {\n source: 'rules',\n target: '~/.claude/rules',\n strategy: 'replace',\n },\n // skills - 只复制 zhuge 管理的,不删除已有的(保护 CCB/第三方 skill)\n {\n source: 'skills',\n target: '~/.claude/skills',\n strategy: 'replace',\n },\n // commands/developer - 只复制 zhuge 管理的(保护 CCG 的 commands/ccg/)\n {\n source: 'commands',\n target: '~/.claude/commands',\n strategy: 'replace',\n },\n ],\n}\n","import type { ConfigTarget } from '../core/types.js'\nimport { claudeConfig } from './claude.config.js'\n\n/** 所有配置目标 */\nexport function getAllConfigTargets(): ConfigTarget[] {\n return [claudeConfig]\n}\n\n/** 按名称获取配置目标 */\nexport function getConfigTargetsByNames(names: string[]): ConfigTarget[] {\n const all = getAllConfigTargets()\n return all.filter((t) => names.includes(t.name))\n}\n","import { existsSync, writeFileSync, readFileSync, mkdirSync, copyFileSync, readdirSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { execInherit, commandExists } from '../utils/shell.js'\nimport * as logger from '../utils/logger.js'\nimport { getBundledTemplatesDir } from '../core/config-source.js'\n\nexport async function initCommand() {\n const cwd = process.cwd()\n\n logger.title('zhuge init')\n\n // 1. 前置检查\n if (!existsSync(resolve(cwd, '.git'))) {\n logger.error('Current directory is not a git repository. Run \"git init\" first.')\n process.exit(1)\n }\n\n const checks = await Promise.all([\n commandExists('openspec'),\n commandExists('trellis'),\n ])\n\n if (!checks[0]) {\n logger.warn('OpenSpec not installed. Run \"zhuge setup\" first to install it.')\n logger.info('Skipping OpenSpec init...')\n }\n\n if (!checks[1]) {\n logger.warn('Trellis not installed. Run \"zhuge setup\" first to install it.')\n logger.info('Skipping Trellis init...')\n }\n\n // 2. OpenSpec init\n if (checks[0]) {\n console.log()\n logger.info('Running OpenSpec init...')\n console.log()\n try {\n await execInherit('openspec', ['init'], { cwd })\n logger.success('OpenSpec init complete')\n } catch (err) {\n logger.error(`OpenSpec init failed: ${err}`)\n }\n }\n\n // 3. Trellis init\n if (checks[1]) {\n console.log()\n logger.info('Running Trellis init...')\n console.log()\n try {\n await execInherit('trellis', ['init'], { cwd })\n logger.success('Trellis init complete')\n } catch (err) {\n logger.error(`Trellis init failed: ${err}`)\n }\n }\n\n // 4. zhuge 自身初始化\n console.log()\n logger.info('Running zhuge init...')\n await zhugeOwnInit(cwd)\n\n // 5. 完成摘要\n console.log()\n logger.title('Init Complete')\n logger.success(`Project initialized at ${cwd}`)\n}\n\nasync function zhugeOwnInit(cwd: string) {\n // 创建 .zhuge/ 目录\n const zhugeDir = resolve(cwd, '.zhuge')\n mkdirSync(zhugeDir, { recursive: true })\n\n // 写入 init 状态记录\n const stateFile = resolve(zhugeDir, 'init-state.json')\n const state = {\n version: '0.1.0',\n initializedAt: new Date().toISOString(),\n tools: {\n openspec: existsSync(resolve(cwd, 'openspec')) || existsSync(resolve(cwd, 'specs')),\n trellis: existsSync(resolve(cwd, '.trellis')),\n },\n }\n writeFileSync(stateFile, JSON.stringify(state, null, 2))\n\n // 生成/修改项目级 CLAUDE.md\n const claudeMdPath = resolve(cwd, 'CLAUDE.md')\n if (existsSync(claudeMdPath)) {\n // 已有 CLAUDE.md,追加 zhuge 区段\n const existing = readFileSync(claudeMdPath, 'utf-8')\n const zhugeSection = buildZhugeSection(cwd)\n if (!existing.includes('<!-- zhuge-workflow -->')) {\n writeFileSync(claudeMdPath, existing + '\\n' + zhugeSection)\n logger.success('Updated project CLAUDE.md with zhuge section')\n } else {\n logger.info('CLAUDE.md already contains zhuge section, skipping')\n }\n } else {\n // 创建新的 CLAUDE.md\n const content = buildProjectClaudeMd(cwd)\n writeFileSync(claudeMdPath, content)\n logger.success('Created project CLAUDE.md')\n }\n\n // 替换 Trellis/Claude 生成的文件为 zhuge 增强版\n deployInitTemplates(cwd)\n\n // 添加 .zhuge/ 到 .gitignore(如果需要)\n const gitignorePath = resolve(cwd, '.gitignore')\n if (existsSync(gitignorePath)) {\n const gitignore = readFileSync(gitignorePath, 'utf-8')\n if (!gitignore.includes('.zhuge/')) {\n writeFileSync(gitignorePath, gitignore.trimEnd() + '\\n.zhuge/\\n')\n }\n }\n\n logger.success('zhuge init complete')\n}\n\nfunction buildZhugeSection(cwd: string): string {\n const parts: string[] = [\n '<!-- zhuge-workflow -->',\n '',\n '## Workflow',\n '',\n ]\n\n // 检测 OpenSpec 生成的内容\n if (existsSync(resolve(cwd, 'specs')) || existsSync(resolve(cwd, 'openspec'))) {\n parts.push('- OpenSpec specs available in `specs/` or `openspec/`')\n }\n\n // 检测 Trellis 生成的内容\n if (existsSync(resolve(cwd, '.trellis'))) {\n parts.push('- Trellis workflow configured in `.trellis/`')\n }\n\n parts.push('')\n parts.push('<!-- zhuge-workflow-end -->')\n\n return parts.join('\\n')\n}\n\nfunction buildProjectClaudeMd(cwd: string): string {\n const parts: string[] = [\n `# ${resolve(cwd).split('/').pop() || 'Project'}`,\n '',\n ]\n\n parts.push(buildZhugeSection(cwd))\n\n return parts.join('\\n')\n}\n\n/**\n * 将 zhuge 增强版文件替换到项目中\n * templates/init/claude-agents/ → {cwd}/.claude/agents/\n * templates/init/claude-hooks/ → {cwd}/.claude/hooks/\n * templates/init/trellis-scripts/ → {cwd}/.trellis/scripts/\n */\nfunction deployInitTemplates(cwd: string) {\n const templatesDir = resolve(getBundledTemplatesDir(), 'init')\n\n if (!existsSync(templatesDir)) {\n logger.warn('Init templates not found, skipping file replacements')\n return\n }\n\n const mappings: Array<{ source: string; target: string }> = [\n { source: 'claude-agents', target: '.claude/agents' },\n { source: 'claude-hooks', target: '.claude/hooks' },\n { source: 'trellis-scripts', target: '.trellis/scripts' },\n ]\n\n let count = 0\n for (const { source, target } of mappings) {\n const srcDir = resolve(templatesDir, source)\n if (!existsSync(srcDir)) continue\n\n const tgtDir = resolve(cwd, target)\n mkdirSync(tgtDir, { recursive: true })\n\n for (const entry of readdirSync(srcDir, { withFileTypes: true })) {\n if (entry.isFile()) {\n copyFileSync(resolve(srcDir, entry.name), resolve(tgtDir, entry.name))\n count++\n }\n }\n }\n\n if (count > 0) {\n logger.success(`Deployed ${count} zhuge enhanced file(s)`)\n }\n}\n"],"mappings":"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","names":["chalk","resolve","resolve","existsSync","resolve","resolve","existsSync","resolve","dirname","existsSync","statSync","resolve","existsSync","resolve","existsSync","dirname","statSync","existsSync","existsSync","chalk","existsSync","writeFileSync","readFileSync","mkdirSync","copyFileSync","readdirSync","resolve","existsSync","resolve","mkdirSync","writeFileSync","readFileSync","readdirSync","copyFileSync"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "zhuge-workflow",
3
+ "version": "0.1.0",
4
+ "description": "AI development workflow installer and manager",
5
+ "author": "blackzhuge",
6
+ "homepage": "https://github.com/blackzhuge/zhuge-workflow#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/blackzhuge/zhuge-workflow.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/blackzhuge/zhuge-workflow/issues"
13
+ },
14
+ "main": "./dist/index.js",
15
+ "type": "module",
16
+ "bin": {
17
+ "zhuge": "./dist/index.js"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "templates"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch",
26
+ "test": "vitest",
27
+ "test:e2e": "bash scripts/docker-test.sh",
28
+ "lint": "tsc --noEmit",
29
+ "prepublishOnly": "pnpm build"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "keywords": [
35
+ "ai",
36
+ "workflow",
37
+ "claude",
38
+ "codex",
39
+ "gemini",
40
+ "cli"
41
+ ],
42
+ "license": "MIT",
43
+ "engines": {
44
+ "node": ">=20"
45
+ },
46
+ "dependencies": {
47
+ "@inquirer/prompts": "^7.0.0",
48
+ "chalk": "^5.4.1",
49
+ "commander": "^14.0.0",
50
+ "execa": "^9.5.2",
51
+ "fs-extra": "^11.3.0",
52
+ "ora": "^8.2.0"
53
+ },
54
+ "devDependencies": {
55
+ "@types/fs-extra": "^11.0.4",
56
+ "@types/node": "^22.0.0",
57
+ "tsup": "^8.4.0",
58
+ "typescript": "^5.8.0",
59
+ "vitest": "^3.0.0"
60
+ }
61
+ }
@@ -0,0 +1,258 @@
1
+ <!-- CCG 增强 -->
2
+
3
+ # Claude Code 增强配置 (CCG Enhanced)
4
+
5
+ ## 一、核心原则
6
+
7
+ ### 1.1 调研优先(强制)
8
+
9
+ 修改代码前必须:
10
+
11
+ 1. **检索相关代码** - 使用 `mcp__ace-tool__search_context` 或 Grep/Glob
12
+
13
+ 2. **识别复用机会** - 查找已有相似功能,优先复用而非重写
14
+
15
+ 3. **追踪调用链** - 使用 Grep 分析影响范围
16
+
17
+ ### 1.2 修改前三问
18
+
19
+ 1. 这是真问题还是臆想?(拒绝过度设计)
20
+
21
+ 2. 有现成代码可复用吗?(优先复用)
22
+
23
+ 3. 会破坏什么调用关系?(保护依赖链)
24
+
25
+ ### 1.3 红线原则
26
+
27
+ - 禁止 copy-paste 重复代码
28
+
29
+ - 禁止破坏现有功能
30
+
31
+ - 禁止对错误方案妥协
32
+
33
+ - 禁止盲目执行不加思考
34
+
35
+ - 禁止基于假设回答(必须检索验证)
36
+
37
+ - 关键路径必须有错误处理
38
+
39
+ ### 1.4 知识获取(强制)
40
+
41
+ 遇到不熟悉的知识,必须联网搜索,严禁猜测:
42
+
43
+ - 通用搜索:`WebSearch` / `mcp__exa__web_search_exa`
44
+
45
+ - 库文档:`mcp___upstash_context7-mcp__resolve-library-id` → `query-docs`
46
+
47
+ - 开源项目:`mcp__mcp-deepwiki__deepwiki_fetch`
48
+
49
+ ---
50
+
51
+ ## 二、工作流增强(CCG)
52
+
53
+ ### 2.1 上下文检索(生成代码前执行)
54
+
55
+ **工具**:`mcp__ace-tool__search_context`
56
+
57
+ **检索策略**:
58
+
59
+ - 使用自然语言构建语义查询(Where/What/How)
60
+
61
+ - 完整性检查:获取相关类、函数、变量的完整定义与签名
62
+
63
+ - 若上下文不足,递归检索直至信息完整
64
+
65
+ ### 2.2 Prompt 增强(复杂任务推荐)
66
+
67
+ **工具**:`mcp__ace-tool__enhance_prompt`
68
+
69
+ **触发**:用户使用 `-enhance` 标记,或任务模糊需要结构化
70
+
71
+ ### 2.3 需求对齐
72
+
73
+ 若检索后需求仍有模糊空间,输出引导性问题列表,直至需求边界清晰(无遗漏、无冗余)。
74
+
75
+ ### 2.4 工作流原则
76
+
77
+ 1. **先检索,后生成** - 生成代码前必须先调用 search_context
78
+
79
+ 2. **增强需求** - 复杂任务先明确需求边界
80
+
81
+ 3. **智能路由** - 根据任务类型选择 Codex/Gemini/Claude
82
+
83
+ 4. **交叉验证** - 关键决策可使用双模型并行分析
84
+
85
+ 5. **代码主权** - Codex/Gemini 仅负责分析、规划、审查;所有代码实现由 Claude 完成
86
+
87
+ ---
88
+
89
+ ## 三、多模型协作
90
+
91
+ ### 3.1 后端任务 → Codex
92
+
93
+ ```powershell
94
+ "[任务描述]" | codeagent-wrapper --backend codex - [工作目录]
95
+ ```
96
+
97
+ 适用:后端 logic、算法实现、数据库操作、API 开发、性能优化、调试分析
98
+
99
+ ### 3.2 前端任务 → Gemini
100
+
101
+ ```powershell
102
+ "[任务描述]" | codeagent-wrapper --backend gemini - [工作目录]
103
+ ```
104
+
105
+ 适用:UI/UX 组件、CSS 样式、响应式布局、前端交互逻辑
106
+
107
+ ### 3.3 会话复用
108
+
109
+ 每次调用返回 `SESSION_ID: xxx`,后续用 `resume xxx` 复用上下文:
110
+
111
+ ```powershell
112
+ "[后续任务]" | codeagent-wrapper --backend <codex|gemini> resume <SESSION_ID> - [工作目录]
113
+ ```
114
+
115
+ ### 3.4 并行调用
116
+
117
+ 使用 `run_in_background: true` 启动后台任务,用 `TaskOutput` 等待结果。
118
+
119
+ 必须等所有模型返回后才能进入下一阶段。
120
+
121
+ ```python
122
+ # 示例:并行启动 Codex 和 Gemini
123
+ Bash(command='"任务描述" | codeagent-wrapper --backend codex ...', run_in_background=True)
124
+ Bash(command='"任务描述" | codeagent-wrapper --backend gemini ...', run_in_background=True)
125
+
126
+ # 等待结果
127
+ TaskOutput(task_id="<TASK_ID>", block=True, timeout=600000)
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 四、任务分级
133
+
134
+ | 级别 | 判断标准 | 处理方式 |
135
+ |------|----------|----------|
136
+ | 简单 | 单文件、明确需求、少于 20 行 | 直接执行 |
137
+ | 中等 | 2-5 个文件、需要调研 | 简要说明方案 → 执行 |
138
+ | 复杂 | 架构变更、多模块、不确定性高 | 完整规划流程 |
139
+
140
+ ### 4.1 复杂任务流程
141
+
142
+ 1. **RESEARCH** - 调研代码,不提建议
143
+
144
+ 2. **PLAN** - 列出方案,等待用户确认
145
+
146
+ 3. **EXECUTE** - 严格按计划执行
147
+
148
+ 4. **REVIEW** - 完成后自检
149
+
150
+ 触发:用户说"进入X模式"或任务符合复杂标准时自动启用
151
+
152
+ ### 4.2 复杂问题深度思考
153
+
154
+ 触发场景:多步骤推理、架构设计、疑难调试、方案对比
155
+
156
+ 强制工具:`mcp__sequential-thinking__sequentialthinking`
157
+
158
+ ---
159
+
160
+ ## 五、工具速查
161
+
162
+ | 场景 | 推荐工具 |
163
+ |------|----------|
164
+ | 代码语义检索 | `mcp__ace-tool__search_context` |
165
+ | 精确字符串/正则 | `Grep` |
166
+ | 文件名匹配 | `Glob` |
167
+ | 代码库探索 | `Task` + `subagent_type=Explore` |
168
+ | 技术方案规划 | `EnterPlanMode` 或 `Task` + `subagent_type=Plan` |
169
+ | 库官方文档 | `mcp___upstash_context7-mcp__query-docs` |
170
+ | 开源项目文档 | `mcp__mcp-deepwiki__deepwiki_fetch` |
171
+ | 联网搜索 | `WebSearch` / `mcp__exa__web_search_exa` |
172
+ | 深度推理 | `mcp__sequential-thinking__sequentialthinking` |
173
+
174
+ **选择原则**:语义理解用 `ace-tool`,精确匹配用 `Grep`
175
+
176
+ ---
177
+
178
+ ## 六、Git 规范
179
+
180
+ - 不主动提交/push,除非用户明确要求
181
+
182
+ - Commit 格式:`<type>(<scope>): <description>`
183
+
184
+ - 不添加 Claude 署名标记
185
+
186
+ - 提交前:`git diff` 确认改动范围
187
+
188
+ - 禁止 `--force` 推送到 main/master
189
+
190
+ ---
191
+
192
+ ## 七、安全检查
193
+
194
+ - 禁止硬编码密钥/密码/token
195
+
196
+ - 不提交 .env / credentials 等敏感文件
197
+
198
+ - 用户输入在系统边界必须验证
199
+
200
+ ---
201
+
202
+ ## 八、代码风格
203
+
204
+ - **KISS** - 能简单就不复杂
205
+
206
+ - **DRY** - 零容忍重复,必须复用
207
+
208
+ - **保护调用链** - 修改函数签名时同步更新所有调用点
209
+
210
+ 完成后清理:临时文件、废弃代码、未使用导入、调试日志
211
+
212
+ ---
213
+
214
+ ## 九、交互规范
215
+
216
+ ### 何时询问用户
217
+
218
+ - 存在多个合理方案时
219
+
220
+ - 需求不明确或有歧义时
221
+
222
+ - 改动范围超出预期时
223
+
224
+ - 发现潜在风险时
225
+
226
+ ### 何时直接执行
227
+
228
+ - 需求明确且方案唯一
229
+
230
+ - 小范围修改(少于 20 行)
231
+
232
+ - 用户已确认过类似操作
233
+
234
+ ### 敢于说不
235
+
236
+ 发现问题直接指出,不妥协于错误方案
237
+
238
+ ---
239
+
240
+ ## 十、环境特定(Windows / PowerShell)
241
+
242
+ - 不支持 `&&`,使用 `;` 分隔命令
243
+
244
+ - 中文路径用引号包裹
245
+
246
+ - 管道传参:`"内容" | command` 替代 heredoc
247
+
248
+ ---
249
+
250
+ ## 输出设置
251
+
252
+ - 中文响应
253
+
254
+ - 禁用表情符号
255
+
256
+ - 禁止截断输出
257
+
258
+ <!-- CCG 增强_END -->
@@ -0,0 +1,106 @@
1
+ <!-- Global -->
2
+
3
+ ## 个人身份
4
+
5
+ 全栈开发者,主要技术栈:.NET、Python、Vue + TypeScript、SQLite/MySQL/SQLServer
6
+
7
+ ---
8
+
9
+ ## 沟通风格
10
+
11
+ | 原则 | 说明 |
12
+ |------|------|
13
+ | 简洁优先 | 直接切入要点,避免冗长铺垫 |
14
+ | 代码优先 | 少说多做,用代码说话 |
15
+ | 结构化 | 使用标题、列表、代码块组织信息 |
16
+ | 中英混合 | 技术术语保留英文,说明用中文 |
17
+
18
+ ---
19
+
20
+ ## 技术栈偏好
21
+
22
+ | 场景 | 首选 | 备选 |
23
+ |------|------|------|
24
+ | .Net Core 后端 | .Net Web API + SqlSugar | Furion/Admin.Net |
25
+ | 前端 | Vue 3 + TS + Vite | React |
26
+ | 数据库 | SQLite (轻量) / MySQL (生产) | SQLServer |
27
+ | 缓存 | Redis(生产)/MemoryCache(轻量) | - |
28
+ | 日志 | Serilog | log4net |
29
+ | 工具 | Masuit.Tools | Common.Utility/Z.ExtensionMethods |
30
+ | UI框架 | Element Plus(Vue)/Ant Design(React)/shadcn(React)/shadcn-vue(Vue)/TailwindCSS | MateChat(AI对话) |
31
+
32
+ ---
33
+
34
+ ## 核心约束
35
+
36
+ > 详细规则见 `rules/claude-code-defensive.md`
37
+
38
+ **必须做的**:
39
+ - 发现类型错误和潜在 Bug
40
+ - 提示更优雅的写法
41
+ - 补充缺失的异常处理
42
+
43
+ **禁止做的**:
44
+ - 过度重构已工作的代码
45
+ - 添加未要求的功能
46
+ - 修改测试来匹配错误代码
47
+ - 主动创建文档文件
48
+
49
+ ---
50
+
51
+ ## 工作流程
52
+
53
+ > 详细流程见 `rules/claude-code-defensive.md`
54
+
55
+ ```
56
+ 简单任务: 直接实现
57
+ 复杂任务: 先说明计划 → 确认后实现
58
+ 排查问题: 复现 → 假设 → 验证 → 最小修复
59
+ ```
60
+
61
+ **复杂任务定义**:涉及 3+ 文件、修改架构、多模块交互
62
+
63
+ ---
64
+
65
+ ## 决策原则
66
+
67
+ ```
68
+ 简单方案 > 复杂方案
69
+ 复用现有 > 创建新的
70
+ 直接实现 > 抽象封装
71
+ 先测量 > 后优化
72
+ ```
73
+
74
+ ---
75
+
76
+ ## 规则溯源
77
+
78
+ 回复受规则、技能或使用 LSP 时,在末尾分开声明:
79
+
80
+ | 类型 | 格式 |
81
+ |------|------|
82
+ | Rule | `> 📋 本回复遵循:`claude-code-defensive.md` - [章节]` |
83
+ | Skill | `> 📋 本回复遵循:`go-dev` - [章节]` |
84
+ | LSP | `> 🔍 LSP: `gopls` - Find References` |
85
+
86
+ ---
87
+
88
+ ## 配置结构
89
+
90
+ ```
91
+ ├── CLAUDE.md # 本文件 - 核心配置
92
+ ├── rules/ # 始终加载的规则
93
+ │ └── claude-code-defensive.md
94
+ ├── skills/ # 按需加载的技能
95
+ │ ├── dotnet-dev/
96
+ │ ├── frontend-dev/
97
+ │ ├── python-dev/
98
+ │ ├── ops-safety/
99
+ │ └── bash-style/
100
+ └── commands/ # 用户命令
101
+ └── developer/
102
+ ├── code-review.md
103
+ ├── design-*.md
104
+ └── ...
105
+ ```
106
+ <!-- Global_END -->