zhuge-workflow 0.1.6 → 0.1.8

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/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { Command } from "commander";
5
5
 
6
6
  // src/commands/setup.ts
7
7
  import chalk2 from "chalk";
8
- import { checkbox, confirm, select } from "@inquirer/prompts";
8
+ import { checkbox, confirm as confirm2, select as select2 } from "@inquirer/prompts";
9
9
 
10
10
  // src/utils/shell.ts
11
11
  import { execa } from "execa";
@@ -339,6 +339,7 @@ import {
339
339
  readdirSync,
340
340
  statSync as statSync2
341
341
  } from "fs";
342
+ import { select, confirm } from "@inquirer/prompts";
342
343
 
343
344
  // src/core/config-source.ts
344
345
  import { resolve as resolve4, dirname } from "path";
@@ -361,6 +362,23 @@ function getBundledTemplatesDir() {
361
362
  async function deployConfigs(targets) {
362
363
  const templatesDir = getBundledTemplatesDir();
363
364
  for (const target of targets) {
365
+ const existingFiles = collectExistingReplaceFiles(templatesDir, target);
366
+ let overwritePolicy = "all";
367
+ if (existingFiles.length > 0) {
368
+ console.log();
369
+ warn(`${target.displayName}: \u4EE5\u4E0B ${existingFiles.length} \u4E2A\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A`);
370
+ for (const f of existingFiles) {
371
+ info(` - ${f}`);
372
+ }
373
+ overwritePolicy = await select({
374
+ message: "\u5982\u4F55\u5904\u7406\u5DF2\u5B58\u5728\u7684\u914D\u7F6E\u6587\u4EF6\uFF1F",
375
+ choices: [
376
+ { name: "\u5168\u90E8\u8986\u76D6\uFF08\u81EA\u52A8\u5907\u4EFD\uFF09", value: "all" },
377
+ { name: "\u8DF3\u8FC7\u5DF2\u5B58\u5728", value: "none" },
378
+ { name: "\u9010\u4E2A\u786E\u8BA4", value: "ask" }
379
+ ]
380
+ });
381
+ }
364
382
  const spin = spinner(`Deploying configs to ${target.displayName}...`);
365
383
  try {
366
384
  let deployed = 0;
@@ -372,10 +390,10 @@ async function deployConfigs(targets) {
372
390
  }
373
391
  mkdirSync(dirname2(targetPath), { recursive: true });
374
392
  if (statSync2(sourcePath).isDirectory()) {
375
- deployed += deployDirectory(sourcePath, targetPath, rule.strategy);
393
+ deployed += await deployDirectory(sourcePath, targetPath, rule.strategy, overwritePolicy);
376
394
  } else {
377
- deployFile(sourcePath, targetPath, rule);
378
- deployed++;
395
+ const ok = await deployFile(sourcePath, targetPath, rule, overwritePolicy);
396
+ if (ok) deployed++;
379
397
  }
380
398
  }
381
399
  spin.succeed(`${target.displayName}: ${deployed} file(s) deployed`);
@@ -385,28 +403,63 @@ async function deployConfigs(targets) {
385
403
  }
386
404
  }
387
405
  }
388
- function deployFile(source, target, rule) {
406
+ function collectExistingReplaceFiles(templatesDir, target) {
407
+ const existing = [];
408
+ for (const rule of target.rules) {
409
+ if (rule.strategy !== "replace") continue;
410
+ const sourcePath = resolve5(templatesDir, target.name, rule.source);
411
+ const targetPath = expandHome(rule.target);
412
+ if (!existsSync4(sourcePath)) continue;
413
+ if (statSync2(sourcePath).isDirectory()) {
414
+ collectExistingInDir(sourcePath, targetPath, existing);
415
+ } else if (existsSync4(targetPath)) {
416
+ existing.push(targetPath);
417
+ }
418
+ }
419
+ return existing;
420
+ }
421
+ function collectExistingInDir(sourceDir, targetDir, result) {
422
+ if (!existsSync4(targetDir)) return;
423
+ for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
424
+ const srcPath = resolve5(sourceDir, entry.name);
425
+ const tgtPath = resolve5(targetDir, entry.name);
426
+ if (entry.isDirectory()) {
427
+ collectExistingInDir(srcPath, tgtPath, result);
428
+ } else if (existsSync4(tgtPath)) {
429
+ result.push(tgtPath);
430
+ }
431
+ }
432
+ }
433
+ async function deployFile(source, target, rule, policy) {
389
434
  switch (rule.strategy) {
390
435
  case "replace":
391
- deployReplace(source, target);
392
- break;
436
+ return deployReplace(source, target, policy);
393
437
  case "append":
394
438
  deployAppend(source, target);
395
- break;
439
+ return true;
396
440
  case "merge-section":
397
441
  if (!rule.sectionMarker) {
398
442
  throw new Error(`merge-section requires sectionMarker for ${rule.source}`);
399
443
  }
400
444
  deployMergeSection(source, target, rule.sectionMarker);
401
- break;
445
+ return true;
402
446
  }
403
447
  }
404
- function deployReplace(source, target) {
448
+ async function deployReplace(source, target, policy) {
405
449
  if (existsSync4(target)) {
450
+ if (policy === "none") return false;
451
+ if (policy === "ask") {
452
+ const yes = await confirm({
453
+ message: ` \u8986\u76D6 ${basename(target)}?`,
454
+ default: false
455
+ });
456
+ if (!yes) return false;
457
+ }
406
458
  const backupPath = `${target}.bak.${Date.now()}`;
407
459
  renameSync(target, backupPath);
408
460
  }
409
461
  copyFileSync(source, target);
462
+ return true;
410
463
  }
411
464
  function deployAppend(source, target) {
412
465
  const content = readFileSync(source, "utf-8");
@@ -436,15 +489,25 @@ function deployMergeSection(source, target, marker) {
436
489
  writeFileSync(target, existing + "\n" + newContent);
437
490
  }
438
491
  }
439
- function deployDirectory(sourceDir, targetDir, _strategy) {
492
+ async function deployDirectory(sourceDir, targetDir, _strategy, policy) {
440
493
  mkdirSync(targetDir, { recursive: true });
441
494
  let count = 0;
442
495
  for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
443
496
  const srcPath = resolve5(sourceDir, entry.name);
444
497
  const tgtPath = resolve5(targetDir, entry.name);
445
498
  if (entry.isDirectory()) {
446
- count += deployDirectory(srcPath, tgtPath, _strategy);
499
+ count += await deployDirectory(srcPath, tgtPath, _strategy, policy);
447
500
  } else {
501
+ if (existsSync4(tgtPath)) {
502
+ if (policy === "none") continue;
503
+ if (policy === "ask") {
504
+ const yes = await confirm({
505
+ message: ` \u8986\u76D6 ${basename(tgtPath)}?`,
506
+ default: false
507
+ });
508
+ if (!yes) continue;
509
+ }
510
+ }
448
511
  copyFileSync(srcPath, tgtPath);
449
512
  count++;
450
513
  }
@@ -526,7 +589,7 @@ async function setupCommand(options) {
526
589
  if (ciMode) {
527
590
  selected = actionable;
528
591
  } else if (actionable.length === 0) {
529
- const reconfig = await confirm({
592
+ const reconfig = await confirm2({
530
593
  message: "All tools installed. Reconfigure any tool?",
531
594
  default: false
532
595
  });
@@ -559,7 +622,7 @@ async function setupCommand(options) {
559
622
  if (!ciMode) {
560
623
  for (const item of selected) {
561
624
  if (item.adapter.meta.pinnedVersion) {
562
- const strategy = await select({
625
+ const strategy = await select2({
563
626
  message: `${item.adapter.meta.displayName} - Version strategy:`,
564
627
  choices: [
565
628
  {
@@ -626,7 +689,7 @@ async function deployConfigsPhase(ciMode) {
626
689
  info("Config deployment skipped in CI mode (use zhuge setup interactively)");
627
690
  return;
628
691
  }
629
- const deploy = await confirm({
692
+ const deploy = await confirm2({
630
693
  message: "Deploy AI tool config files?",
631
694
  default: true
632
695
  });
@@ -647,7 +710,8 @@ async function deployConfigsPhase(ciMode) {
647
710
 
648
711
  // src/commands/init.ts
649
712
  import { existsSync as existsSync6, writeFileSync as writeFileSync2, readFileSync as readFileSync3, mkdirSync as mkdirSync2, copyFileSync as copyFileSync2, readdirSync as readdirSync2 } from "fs";
650
- import { resolve as resolve6 } from "path";
713
+ import { resolve as resolve6, dirname as dirname3, relative } from "path";
714
+ import { select as select3, confirm as confirm3 } from "@inquirer/prompts";
651
715
 
652
716
  // src/utils/version.ts
653
717
  import { readFileSync as readFileSync2 } from "fs";
@@ -746,7 +810,7 @@ async function zhugeOwnInit(cwd) {
746
810
  writeFileSync2(claudeMdPath, content);
747
811
  success("Created project CLAUDE.md");
748
812
  }
749
- deployInitTemplates(cwd);
813
+ await deployInitTemplates(cwd);
750
814
  const gitignorePath = resolve6(cwd, ".gitignore");
751
815
  if (existsSync6(gitignorePath)) {
752
816
  const gitignore = readFileSync3(gitignorePath, "utf-8");
@@ -781,7 +845,7 @@ function buildProjectClaudeMd(cwd) {
781
845
  parts.push(buildZhugeSection(cwd));
782
846
  return parts.join("\n");
783
847
  }
784
- function deployInitTemplates(cwd) {
848
+ async function deployInitTemplates(cwd) {
785
849
  const templatesDir = resolve6(getBundledTemplatesDir(), "init");
786
850
  if (!existsSync6(templatesDir)) {
787
851
  warn("Init templates not found, skipping file replacements");
@@ -791,24 +855,66 @@ function deployInitTemplates(cwd) {
791
855
  { source: "claude-agents", target: ".claude/agents" },
792
856
  { source: "claude-hooks", target: ".claude/hooks" },
793
857
  { source: "claude-commands-trellis", target: ".claude/commands/trellis" },
794
- { source: "trellis-scripts", target: ".trellis/scripts" }
858
+ { source: "trellis-scripts", target: ".trellis/scripts" },
859
+ { source: "openspec-config", target: "openspec" }
795
860
  ];
796
- let count = 0;
861
+ const operations = [];
797
862
  for (const { source, target } of mappings) {
798
863
  const srcDir = resolve6(templatesDir, source);
799
864
  if (!existsSync6(srcDir)) continue;
800
- const tgtDir = resolve6(cwd, target);
801
- mkdirSync2(tgtDir, { recursive: true });
802
865
  for (const entry of readdirSync2(srcDir, { withFileTypes: true })) {
803
866
  if (entry.isFile()) {
804
- copyFileSync2(resolve6(srcDir, entry.name), resolve6(tgtDir, entry.name));
805
- count++;
867
+ const src = resolve6(srcDir, entry.name);
868
+ const tgt = resolve6(cwd, target, entry.name);
869
+ operations.push({ src, tgt, exists: existsSync6(tgt) });
870
+ }
871
+ }
872
+ }
873
+ if (operations.length === 0) return;
874
+ const existing = operations.filter((op) => op.exists);
875
+ let overwritePolicy = "all";
876
+ if (existing.length > 0) {
877
+ console.log();
878
+ warn(`\u4EE5\u4E0B ${existing.length} \u4E2A\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A`);
879
+ for (const op of existing) {
880
+ info(` - ${relative(cwd, op.tgt)}`);
881
+ }
882
+ overwritePolicy = await select3({
883
+ message: "\u5982\u4F55\u5904\u7406\u5DF2\u5B58\u5728\u7684\u6587\u4EF6\uFF1F",
884
+ choices: [
885
+ { name: "\u5168\u90E8\u8986\u76D6", value: "all" },
886
+ { name: "\u8DF3\u8FC7\u5DF2\u5B58\u5728", value: "none" },
887
+ { name: "\u9010\u4E2A\u786E\u8BA4", value: "ask" }
888
+ ]
889
+ });
890
+ }
891
+ let count = 0;
892
+ for (const op of operations) {
893
+ mkdirSync2(dirname3(op.tgt), { recursive: true });
894
+ if (op.exists) {
895
+ if (overwritePolicy === "none") continue;
896
+ if (overwritePolicy === "ask") {
897
+ const yes = await confirm3({
898
+ message: `\u8986\u76D6 ${relative(cwd, op.tgt)}?`,
899
+ default: false
900
+ });
901
+ if (!yes) continue;
806
902
  }
807
903
  }
904
+ copyFileSync2(op.src, op.tgt);
905
+ count++;
808
906
  }
809
907
  if (count > 0) {
810
908
  success(`Deployed ${count} zhuge enhanced file(s)`);
811
909
  }
910
+ const configYaml = resolve6(cwd, "openspec/config.yaml");
911
+ if (existsSync6(configYaml)) {
912
+ console.log();
913
+ warn("\u8BF7\u7F16\u8F91 openspec/config.yaml \u4E2D\u7684\u9879\u76EE\u7279\u5B9A\u914D\u7F6E\uFF1A");
914
+ info(" - context.Tech stack: \u4FEE\u6539\u4E3A\u4F60\u7684\u9879\u76EE\u5B9E\u9645\u6280\u672F\u6808");
915
+ info(" - context.Domain: \u4FEE\u6539\u4E3A\u4F60\u7684\u9879\u76EE\u9886\u57DF\u63CF\u8FF0");
916
+ info(` \u6587\u4EF6\u8DEF\u5F84: ${configYaml}`);
917
+ }
812
918
  }
813
919
 
814
920
  // src/index.ts
package/dist/index.js.map CHANGED
@@ -1 +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","../src/utils/version.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { setupCommand } from './commands/setup.js'\nimport { initCommand } from './commands/init.js'\nimport { getCliVersion } from './utils/version.js'\n\nconst program = new Command()\n\nprogram\n .name('zhuge')\n .description('AI development workflow installer and manager')\n .version(getCliVersion())\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'\nimport { getCliVersion } from '../utils/version.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: getCliVersion(),\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/claude-commands-trellis/ → {cwd}/.claude/commands/trellis/\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: 'claude-commands-trellis', target: '.claude/commands/trellis' },\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","import { readFileSync } from 'node:fs'\n\ntype PackageJson = {\n version?: string\n}\n\nconst FALLBACK_VERSION = '0.0.0'\nconst PACKAGE_JSON_RELATIVE_PATHS = ['../package.json', '../../package.json'] as const\n\nexport function getCliVersion(): string {\n for (const relativePath of PACKAGE_JSON_RELATIVE_PATHS) {\n try {\n const packageJsonPath = new URL(relativePath, import.meta.url)\n const packageJsonRaw = readFileSync(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(packageJsonRaw) as PackageJson\n\n if (packageJson.version) {\n return packageJson.version\n }\n } catch {\n continue\n }\n }\n\n return FALLBACK_VERSION\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","readFileSync","existsSync","resolve","mkdirSync","writeFileSync","readFileSync","readdirSync","copyFileSync"]}
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","../src/utils/version.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { setupCommand } from './commands/setup.js'\nimport { initCommand } from './commands/init.js'\nimport { getCliVersion } from './utils/version.js'\n\nconst program = new Command()\n\nprogram\n .name('zhuge')\n .description('AI development workflow installer and manager')\n .version(getCliVersion())\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 { select, confirm } from '@inquirer/prompts'\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\ntype OverwritePolicy = 'all' | 'none' | 'ask'\n\n/** 部署配置到目标 */\nexport async function deployConfigs(\n targets: ConfigTarget[],\n): Promise<void> {\n const templatesDir = getBundledTemplatesDir()\n\n for (const target of targets) {\n // Phase 1: 预扫描 replace 策略中已存在的文件\n const existingFiles = collectExistingReplaceFiles(templatesDir, target)\n\n let overwritePolicy: OverwritePolicy = 'all'\n if (existingFiles.length > 0) {\n console.log()\n logger.warn(`${target.displayName}: 以下 ${existingFiles.length} 个配置文件已存在:`)\n for (const f of existingFiles) {\n logger.info(` - ${f}`)\n }\n overwritePolicy = await select({\n message: '如何处理已存在的配置文件?',\n choices: [\n { name: '全部覆盖(自动备份)', value: 'all' as const },\n { name: '跳过已存在', value: 'none' as const },\n { name: '逐个确认', value: 'ask' as const },\n ],\n })\n }\n\n // Phase 2: 部署\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 += await deployDirectory(sourcePath, targetPath, rule.strategy, overwritePolicy)\n } else {\n const ok = await deployFile(sourcePath, targetPath, rule, overwritePolicy)\n if (ok) 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/** 收集 replace 策略中已存在的目标文件 */\nfunction collectExistingReplaceFiles(templatesDir: string, target: ConfigTarget): string[] {\n const existing: string[] = []\n for (const rule of target.rules) {\n if (rule.strategy !== 'replace') continue\n const sourcePath = resolve(templatesDir, target.name, rule.source)\n const targetPath = expandHome(rule.target)\n if (!existsSync(sourcePath)) continue\n\n if (statSync(sourcePath).isDirectory()) {\n collectExistingInDir(sourcePath, targetPath, existing)\n } else if (existsSync(targetPath)) {\n existing.push(targetPath)\n }\n }\n return existing\n}\n\n/** 递归收集目录中已存在的目标文件 */\nfunction collectExistingInDir(sourceDir: string, targetDir: string, result: string[]): void {\n if (!existsSync(targetDir)) return\n for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {\n const srcPath = resolve(sourceDir, entry.name)\n const tgtPath = resolve(targetDir, entry.name)\n if (entry.isDirectory()) {\n collectExistingInDir(srcPath, tgtPath, result)\n } else if (existsSync(tgtPath)) {\n result.push(tgtPath)\n }\n }\n}\n\n/** 部署单个文件,返回是否实际部署 */\nasync function deployFile(\n source: string,\n target: string,\n rule: ConfigDeployRule,\n policy: OverwritePolicy,\n): Promise<boolean> {\n switch (rule.strategy) {\n case 'replace':\n return deployReplace(source, target, policy)\n case 'append':\n deployAppend(source, target)\n return true\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 return true\n }\n}\n\n/** 整文件替换(备份旧文件),尊重覆盖策略 */\nasync function deployReplace(\n source: string,\n target: string,\n policy: OverwritePolicy,\n): Promise<boolean> {\n if (existsSync(target)) {\n if (policy === 'none') return false\n if (policy === 'ask') {\n const yes = await confirm({\n message: ` 覆盖 ${basename(target)}?`,\n default: false,\n })\n if (!yes) return false\n }\n const backupPath = `${target}.bak.${Date.now()}`\n renameSync(target, backupPath)\n }\n copyFileSync(source, target)\n return true\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/** 部署整个目录(递归复制),尊重覆盖策略 */\nasync function deployDirectory(\n sourceDir: string,\n targetDir: string,\n _strategy: string,\n policy: OverwritePolicy,\n): Promise<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 += await deployDirectory(srcPath, tgtPath, _strategy, policy)\n } else {\n if (existsSync(tgtPath)) {\n if (policy === 'none') continue\n if (policy === 'ask') {\n const yes = await confirm({\n message: ` 覆盖 ${basename(tgtPath)}?`,\n default: false,\n })\n if (!yes) continue\n }\n }\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, dirname, relative } from 'node:path'\nimport { select, confirm } from '@inquirer/prompts'\nimport { execInherit, commandExists } from '../utils/shell.js'\nimport * as logger from '../utils/logger.js'\nimport { getBundledTemplatesDir } from '../core/config-source.js'\nimport { getCliVersion } from '../utils/version.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: getCliVersion(),\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 await 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/claude-commands-trellis/ → {cwd}/.claude/commands/trellis/\n * templates/init/trellis-scripts/ → {cwd}/.trellis/scripts/\n * templates/init/openspec-config/ → {cwd}/openspec/\n */\nasync function 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: 'claude-commands-trellis', target: '.claude/commands/trellis' },\n { source: 'trellis-scripts', target: '.trellis/scripts' },\n { source: 'openspec-config', target: 'openspec' },\n ]\n\n // Phase 1: 收集所有待部署的文件\n const operations: Array<{ src: string; tgt: string; exists: boolean }> = []\n for (const { source, target } of mappings) {\n const srcDir = resolve(templatesDir, source)\n if (!existsSync(srcDir)) continue\n\n for (const entry of readdirSync(srcDir, { withFileTypes: true })) {\n if (entry.isFile()) {\n const src = resolve(srcDir, entry.name)\n const tgt = resolve(cwd, target, entry.name)\n operations.push({ src, tgt, exists: existsSync(tgt) })\n }\n }\n }\n\n if (operations.length === 0) return\n\n // Phase 2: 处理已存在的文件\n const existing = operations.filter((op) => op.exists)\n let overwritePolicy: 'all' | 'none' | 'ask' = 'all'\n\n if (existing.length > 0) {\n console.log()\n logger.warn(`以下 ${existing.length} 个文件已存在:`)\n for (const op of existing) {\n logger.info(` - ${relative(cwd, op.tgt)}`)\n }\n overwritePolicy = await select({\n message: '如何处理已存在的文件?',\n choices: [\n { name: '全部覆盖', value: 'all' as const },\n { name: '跳过已存在', value: 'none' as const },\n { name: '逐个确认', value: 'ask' as const },\n ],\n })\n }\n\n // Phase 3: 部署\n let count = 0\n for (const op of operations) {\n mkdirSync(dirname(op.tgt), { recursive: true })\n\n if (op.exists) {\n if (overwritePolicy === 'none') continue\n if (overwritePolicy === 'ask') {\n const yes = await confirm({\n message: `覆盖 ${relative(cwd, op.tgt)}?`,\n default: false,\n })\n if (!yes) continue\n }\n }\n\n copyFileSync(op.src, op.tgt)\n count++\n }\n\n if (count > 0) {\n logger.success(`Deployed ${count} zhuge enhanced file(s)`)\n }\n\n // 引导用户修改 openspec/config.yaml 中的项目特定配置\n const configYaml = resolve(cwd, 'openspec/config.yaml')\n if (existsSync(configYaml)) {\n console.log()\n logger.warn('请编辑 openspec/config.yaml 中的项目特定配置:')\n logger.info(' - context.Tech stack: 修改为你的项目实际技术栈')\n logger.info(' - context.Domain: 修改为你的项目领域描述')\n logger.info(` 文件路径: ${configYaml}`)\n }\n}\n","import { readFileSync } from 'node:fs'\n\ntype PackageJson = {\n version?: string\n}\n\nconst FALLBACK_VERSION = '0.0.0'\nconst PACKAGE_JSON_RELATIVE_PATHS = ['../package.json', '../../package.json'] as const\n\nexport function getCliVersion(): string {\n for (const relativePath of PACKAGE_JSON_RELATIVE_PATHS) {\n try {\n const packageJsonPath = new URL(relativePath, import.meta.url)\n const packageJsonRaw = readFileSync(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(packageJsonRaw) as PackageJson\n\n if (packageJson.version) {\n return packageJson.version\n }\n } catch {\n continue\n }\n }\n\n return FALLBACK_VERSION\n}\n"],"mappings":"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","names":["chalk","confirm","select","resolve","resolve","existsSync","resolve","resolve","existsSync","resolve","dirname","existsSync","statSync","resolve","existsSync","resolve","existsSync","dirname","statSync","existsSync","existsSync","confirm","select","chalk","existsSync","writeFileSync","readFileSync","mkdirSync","copyFileSync","readdirSync","resolve","dirname","select","confirm","readFileSync","existsSync","resolve","mkdirSync","writeFileSync","readFileSync","readdirSync","select","dirname","confirm","copyFileSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zhuge-workflow",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "AI development workflow installer and manager",
5
5
  "author": "blackzhuge",
6
6
  "homepage": "https://github.com/blackzhuge/zhuge-workflow#readme",