@longzai-intelligence-agent-tools/cli 0.0.1 → 0.0.2

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.
@@ -1,5 +1,5 @@
1
1
  import { join } from 'node:path';
2
- import { DEFAULT_SOURCES, ENV_KEYS, LZI_DIR, VALID_IDES } from '@longzai-intelligence-agent-tools/core';
2
+ import { DEFAULT_SOURCES, ENV_KEYS, LZI_DIR, VALID_AGENTS } from '@longzai-intelligence-agent-tools/core';
3
3
  import { COLORS, stdout } from '../../utils/cli-output';
4
4
  /**
5
5
  * 执行 init 命令
@@ -47,9 +47,9 @@ export const initCommand = async (options) => {
47
47
  stdout('');
48
48
  stdout(`${COLORS.BLUE}后续步骤:${COLORS.RESET}`);
49
49
  stdout(` 1. 编辑 ${LZI_DIR}/agent.md,填写共同指令与 {{KEY}} 占位符`);
50
- stdout(` 2. 按需编辑 ${LZI_DIR}/agent.<ide>.md,填写各 IDE 专属指令`);
51
- stdout(` 3. 创建 .env 文件,配置当前 IDE:`);
52
- stdout(` ${ENV_KEYS.IDE}=<${VALID_IDES.join('|')}>`);
50
+ stdout(` 2. 按需编辑 ${LZI_DIR}/agent.<type>.md,填写各 Agent 专属指令`);
51
+ stdout(` 3. 创建 .env 文件,配置当前 Agent 类型:`);
52
+ stdout(` ${ENV_KEYS.AGENT_TYPE}=<${VALID_AGENTS.join('|')}>`);
53
53
  stdout(` ${ENV_KEYS.PLACEHOLDER_PREFIX}<KEY>=<value> (如 LZI_PLACEHOLDER_LZI_ROOT=/path/to/project)`);
54
54
  stdout(` 4. 运行 lzi-agent-cli sync 同步生成 CLAUDE.md / AGENTS.md`);
55
55
  if (skipped.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from 'node:path';\n\nimport { DEFAULT_SOURCES, ENV_KEYS, LZI_DIR, VALID_IDES } from '@longzai-intelligence-agent-tools/core';\n\nimport { COLORS, stdout } from '@/utils/cli-output';\n\n/**\n * init 命令选项\n */\ninterface InitCommandOptions {\n /** 仅预览将创建的文件,不实际写入 */\n dryRun: boolean;\n}\n\n/**\n * 执行 init 命令\n *\n * 在当前项目创建 .lzi/ 目录和四个源文件骨架。\n * 已存在的文件跳过,不覆盖。\n *\n * @param options - 命令选项\n */\nexport const initCommand = async (options: InitCommandOptions): Promise<void> => {\n /** 项目根目录 */\n const projectRoot = process.cwd();\n\n /** .lzi 目录绝对路径 */\n const lziDir = join(projectRoot, LZI_DIR);\n\n stdout(`${COLORS.BLUE}初始化 Agent Tools 源文件结构...${COLORS.RESET}\\n`);\n\n if (options.dryRun) {\n stdout(`${COLORS.YELLOW}[预览模式] 将创建以下文件:${COLORS.RESET}`);\n }\n\n /** 已跳过的文件列表 */\n const skipped: string[] = [];\n\n /** 已创建的文件列表 */\n const created: string[] = [];\n\n for (const [fileName, content] of Object.entries(DEFAULT_SOURCES)) {\n /** 文件绝对路径 */\n const filePath = join(lziDir, fileName);\n\n /** 检查文件是否已存在 */\n const exists = await Bun.file(filePath).exists();\n\n if (exists) {\n skipped.push(fileName);\n if (!options.dryRun) {\n stdout(` ${COLORS.YELLOW}跳过${COLORS.RESET} ${fileName}(已存在)`);\n }\n continue;\n }\n\n created.push(fileName);\n\n if (options.dryRun) {\n stdout(` ${COLORS.GREEN}将创建${COLORS.RESET} ${LZI_DIR}/${fileName}`);\n continue;\n }\n\n /** 写入文件 */\n await Bun.write(filePath, content);\n stdout(` ${COLORS.GREEN}已创建${COLORS.RESET} ${LZI_DIR}/${fileName}`);\n }\n\n /** 后续提示 */\n stdout('');\n stdout(`${COLORS.BLUE}后续步骤:${COLORS.RESET}`);\n stdout(` 1. 编辑 ${LZI_DIR}/agent.md,填写共同指令与 {{KEY}} 占位符`);\n stdout(` 2. 按需编辑 ${LZI_DIR}/agent.<ide>.md,填写各 IDE 专属指令`);\n stdout(` 3. 创建 .env 文件,配置当前 IDE:`);\n stdout(` ${ENV_KEYS.IDE}=<${VALID_IDES.join('|')}>`);\n stdout(` ${ENV_KEYS.PLACEHOLDER_PREFIX}<KEY>=<value> (如 LZI_PLACEHOLDER_LZI_ROOT=/path/to/project)`);\n stdout(` 4. 运行 lzi-agent-cli sync 同步生成 CLAUDE.md / AGENTS.md`);\n\n if (skipped.length > 0) {\n stdout('');\n stdout(`${COLORS.YELLOW}提示: ${skipped.length} 个文件已存在被跳过${COLORS.RESET}`);\n }\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAE1G,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAUpD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,OAA2B,EAAiB,EAAE;IAC9E,YAAY;IACZ,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,kBAAkB;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE1C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,2BAA2B,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAElE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,kBAAkB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,eAAe;IACf,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,eAAe;IACf,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAClE,aAAa;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExC,gBAAgB;QAChB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QAEjD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,QAAQ,OAAO,CAAC,CAAC;YACjE,CAAC;YACD,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QAED,WAAW;QACX,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,WAAW;IACX,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,WAAW,OAAO,+BAA+B,CAAC,CAAC;IAC1D,MAAM,CAAC,aAAa,OAAO,iCAAiC,CAAC,CAAC;IAC9D,MAAM,CAAC,gCAAgC,CAAC,CAAC;IACzC,MAAM,CAAC,QAAQ,QAAQ,CAAC,UAAU,KAAK,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,CAAC,QAAQ,QAAQ,CAAC,kBAAkB,8DAA8D,CAAC,CAAC;IAC1G,MAAM,CAAC,uDAAuD,CAAC,CAAC;IAEhE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { join } from 'node:path';\n\nimport { DEFAULT_SOURCES, ENV_KEYS, LZI_DIR, VALID_AGENTS } from '@longzai-intelligence-agent-tools/core';\n\nimport { COLORS, stdout } from '@/utils/cli-output';\n\n/**\n * init 命令选项\n */\ninterface InitCommandOptions {\n /** 仅预览将创建的文件,不实际写入 */\n dryRun: boolean;\n}\n\n/**\n * 执行 init 命令\n *\n * 在当前项目创建 .lzi/ 目录和四个源文件骨架。\n * 已存在的文件跳过,不覆盖。\n *\n * @param options - 命令选项\n */\nexport const initCommand = async (options: InitCommandOptions): Promise<void> => {\n /** 项目根目录 */\n const projectRoot = process.cwd();\n\n /** .lzi 目录绝对路径 */\n const lziDir = join(projectRoot, LZI_DIR);\n\n stdout(`${COLORS.BLUE}初始化 Agent Tools 源文件结构...${COLORS.RESET}\\n`);\n\n if (options.dryRun) {\n stdout(`${COLORS.YELLOW}[预览模式] 将创建以下文件:${COLORS.RESET}`);\n }\n\n /** 已跳过的文件列表 */\n const skipped: string[] = [];\n\n /** 已创建的文件列表 */\n const created: string[] = [];\n\n for (const [fileName, content] of Object.entries(DEFAULT_SOURCES)) {\n /** 文件绝对路径 */\n const filePath = join(lziDir, fileName);\n\n /** 检查文件是否已存在 */\n const exists = await Bun.file(filePath).exists();\n\n if (exists) {\n skipped.push(fileName);\n if (!options.dryRun) {\n stdout(` ${COLORS.YELLOW}跳过${COLORS.RESET} ${fileName}(已存在)`);\n }\n continue;\n }\n\n created.push(fileName);\n\n if (options.dryRun) {\n stdout(` ${COLORS.GREEN}将创建${COLORS.RESET} ${LZI_DIR}/${fileName}`);\n continue;\n }\n\n /** 写入文件 */\n await Bun.write(filePath, content);\n stdout(` ${COLORS.GREEN}已创建${COLORS.RESET} ${LZI_DIR}/${fileName}`);\n }\n\n /** 后续提示 */\n stdout('');\n stdout(`${COLORS.BLUE}后续步骤:${COLORS.RESET}`);\n stdout(` 1. 编辑 ${LZI_DIR}/agent.md,填写共同指令与 {{KEY}} 占位符`);\n stdout(` 2. 按需编辑 ${LZI_DIR}/agent.<type>.md,填写各 Agent 专属指令`);\n stdout(` 3. 创建 .env 文件,配置当前 Agent 类型:`);\n stdout(` ${ENV_KEYS.AGENT_TYPE}=<${VALID_AGENTS.join('|')}>`);\n stdout(` ${ENV_KEYS.PLACEHOLDER_PREFIX}<KEY>=<value> (如 LZI_PLACEHOLDER_LZI_ROOT=/path/to/project)`);\n stdout(` 4. 运行 lzi-agent-cli sync 同步生成 CLAUDE.md / AGENTS.md`);\n\n if (skipped.length > 0) {\n stdout('');\n stdout(`${COLORS.YELLOW}提示: ${skipped.length} 个文件已存在被跳过${COLORS.RESET}`);\n }\n};\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 执行 status 命令
3
3
  *
4
- * 显示当前 IDE、源文件存在性、目标文件存在性。
4
+ * 显示当前 Agent 类型、源文件存在性、目标文件存在性。
5
5
  */
6
6
  export declare const statusCommand: () => Promise<void>;
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { join } from 'node:path';
2
- import { ENV_KEYS, LZI_DIR, SYNTHESIS_RULES, VALID_IDES, } from '@longzai-intelligence-agent-tools/core';
2
+ import { ENV_KEYS, LZI_DIR, SYNTHESIS_RULES, VALID_AGENTS, } from '@longzai-intelligence-agent-tools/core';
3
3
  import { COLORS, stdout } from '../../utils/cli-output';
4
4
  /**
5
5
  * 状态标记符号
@@ -18,26 +18,26 @@ const fileExists = async (filePath) => {
18
18
  /**
19
19
  * 执行 status 命令
20
20
  *
21
- * 显示当前 IDE、源文件存在性、目标文件存在性。
21
+ * 显示当前 Agent 类型、源文件存在性、目标文件存在性。
22
22
  */
23
23
  export const statusCommand = async () => {
24
24
  /** 项目根目录 */
25
25
  const projectRoot = process.cwd();
26
26
  /** 源目录绝对路径 */
27
27
  const lziDir = join(projectRoot, LZI_DIR);
28
- /** 从环境变量读 IDE */
29
- const ideRaw = process.env[ENV_KEYS.IDE];
30
- const ideValid = ideRaw && VALID_IDES.includes(ideRaw) ? ideRaw : null;
28
+ /** 从环境变量读 Agent 类型 */
29
+ const agentTypeRaw = process.env[ENV_KEYS.AGENT_TYPE];
30
+ const agentTypeValid = agentTypeRaw && VALID_AGENTS.includes(agentTypeRaw) ? agentTypeRaw : null;
31
31
  stdout(`${COLORS.BLUE}=== Agent Tools 状态 ===${COLORS.RESET}\n`);
32
- /** 当前 IDE */
33
- if (ideValid) {
34
- stdout(`当前 IDE: ${COLORS.GREEN}${ideValid}${COLORS.RESET}`);
32
+ /** 当前 Agent 类型 */
33
+ if (agentTypeValid) {
34
+ stdout(`当前 Agent: ${COLORS.GREEN}${agentTypeValid}${COLORS.RESET}`);
35
35
  }
36
- else if (ideRaw) {
37
- stdout(`当前 IDE: ${COLORS.RED}${ideRaw}(无效,合法值: ${VALID_IDES.join(', ')})${COLORS.RESET}`);
36
+ else if (agentTypeRaw) {
37
+ stdout(`当前 Agent: ${COLORS.RED}${agentTypeRaw}(无效,合法值: ${VALID_AGENTS.join(', ')})${COLORS.RESET}`);
38
38
  }
39
39
  else {
40
- stdout(`当前 IDE: ${COLORS.YELLOW}未设置(请在 .env 配置 ${ENV_KEYS.IDE})${COLORS.RESET}`);
40
+ stdout(`当前 Agent: ${COLORS.YELLOW}未设置(请在 .env 配置 ${ENV_KEYS.AGENT_TYPE})${COLORS.RESET}`);
41
41
  }
42
42
  stdout('');
43
43
  /** 源文件存在性 */
@@ -46,10 +46,10 @@ export const statusCommand = async () => {
46
46
  const sourceFiles = new Set();
47
47
  /** 共同部分 */
48
48
  sourceFiles.add('agent.md');
49
- /** 该 IDE 的独有部分 */
50
- if (ideValid) {
51
- for (const rule of SYNTHESIS_RULES[ideValid]) {
52
- sourceFiles.add(rule.ideSource);
49
+ /** 该 Agent 的独有部分 */
50
+ if (agentTypeValid) {
51
+ for (const rule of SYNTHESIS_RULES[agentTypeValid]) {
52
+ sourceFiles.add(rule.agentSource);
53
53
  }
54
54
  }
55
55
  for (const fileName of sourceFiles) {
@@ -60,9 +60,9 @@ export const statusCommand = async () => {
60
60
  }
61
61
  stdout('');
62
62
  /** 目标文件存在性 */
63
- if (ideValid) {
63
+ if (agentTypeValid) {
64
64
  stdout(`${COLORS.BLUE}输出目标(将覆盖):${COLORS.RESET}`);
65
- for (const rule of SYNTHESIS_RULES[ideValid]) {
65
+ for (const rule of SYNTHESIS_RULES[agentTypeValid]) {
66
66
  /** 目标文件绝对路径 */
67
67
  const targetPath = join(projectRoot, rule.output);
68
68
  const exists = await fileExists(targetPath);
@@ -70,7 +70,7 @@ export const statusCommand = async () => {
70
70
  }
71
71
  }
72
72
  else {
73
- stdout(`${COLORS.YELLOW}IDE 未配置,无法显示输出目标${COLORS.RESET}`);
73
+ stdout(`${COLORS.YELLOW}Agent 类型未配置,无法显示输出目标${COLORS.RESET}`);
74
74
  }
75
75
  };
76
76
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from 'node:path';\n\nimport {\n type AgentIde,\n ENV_KEYS,\n LZI_DIR,\n SYNTHESIS_RULES,\n VALID_IDES,\n} from '@longzai-intelligence-agent-tools/core';\n\nimport { COLORS, stdout } from '@/utils/cli-output';\n\n/**\n * 状态标记符号\n */\nconst STATUS_OK = `${COLORS.GREEN}存在${COLORS.RESET}`;\nconst STATUS_MISSING = `${COLORS.RED}缺失${COLORS.RESET}`;\n\n/**\n * 检测文件是否存在\n *\n * @param filePath - 文件绝对路径\n * @returns 是否存在\n */\nconst fileExists = async (filePath: string): Promise<boolean> => {\n return Bun.file(filePath).exists();\n};\n\n/**\n * 执行 status 命令\n *\n * 显示当前 IDE、源文件存在性、目标文件存在性。\n */\nexport const statusCommand = async (): Promise<void> => {\n /** 项目根目录 */\n const projectRoot = process.cwd();\n\n /** 源目录绝对路径 */\n const lziDir = join(projectRoot, LZI_DIR);\n\n /** 从环境变量读 IDE */\n const ideRaw = process.env[ENV_KEYS.IDE];\n const ideValid = ideRaw && VALID_IDES.includes(ideRaw as AgentIde) ? (ideRaw as AgentIde) : null;\n\n stdout(`${COLORS.BLUE}=== Agent Tools 状态 ===${COLORS.RESET}\\n`);\n\n /** 当前 IDE */\n if (ideValid) {\n stdout(`当前 IDE: ${COLORS.GREEN}${ideValid}${COLORS.RESET}`);\n } else if (ideRaw) {\n stdout(`当前 IDE: ${COLORS.RED}${ideRaw}(无效,合法值: ${VALID_IDES.join(', ')})${COLORS.RESET}`);\n } else {\n stdout(`当前 IDE: ${COLORS.YELLOW}未设置(请在 .env 配置 ${ENV_KEYS.IDE})${COLORS.RESET}`);\n }\n\n stdout('');\n\n /** 源文件存在性 */\n stdout(`${COLORS.BLUE}源文件(${lziDir}):${COLORS.RESET}`);\n\n /** 需要检查的源文件名集合 */\n const sourceFiles = new Set<string>();\n\n /** 共同部分 */\n sourceFiles.add('agent.md');\n\n /** 该 IDE 的独有部分 */\n if (ideValid) {\n for (const rule of SYNTHESIS_RULES[ideValid]) {\n sourceFiles.add(rule.ideSource);\n }\n }\n\n for (const fileName of sourceFiles) {\n /** 文件绝对路径 */\n const filePath = join(lziDir, fileName);\n const exists = await fileExists(filePath);\n stdout(` ${fileName}: ${exists ? STATUS_OK : STATUS_MISSING}`);\n }\n\n stdout('');\n\n /** 目标文件存在性 */\n if (ideValid) {\n stdout(`${COLORS.BLUE}输出目标(将覆盖):${COLORS.RESET}`);\n\n for (const rule of SYNTHESIS_RULES[ideValid]) {\n /** 目标文件绝对路径 */\n const targetPath = join(projectRoot, rule.output);\n const exists = await fileExists(targetPath);\n stdout(` ${rule.output}: ${exists ? STATUS_OK : STATUS_MISSING}`);\n }\n } else {\n stdout(`${COLORS.YELLOW}IDE 未配置,无法显示输出目标${COLORS.RESET}`);\n }\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAEL,QAAQ,EACR,OAAO,EACP,eAAe,EACf,YAAY,GACb,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;AACrD,MAAM,cAAc,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;AAExD;;;;;GAKG;AACH,MAAM,UAAU,GAAG,KAAK,EAAE,QAAgB,EAAoB,EAAE;IAC9D,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;IACrD,YAAY;IACZ,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,cAAc;IACd,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE1C,sBAAsB;IACtB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAyB,CAAC,CAAC,CAAC,CAAE,YAA0B,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7H,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,yBAAyB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAEhE,kBAAkB;IAClB,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,aAAa,MAAM,CAAC,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACxB,MAAM,CAAC,aAAa,MAAM,CAAC,GAAG,GAAG,YAAY,YAAY,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACtG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,aAAa,MAAM,CAAC,MAAM,kBAAkB,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,CAAC;IAEX,aAAa;IACb,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,OAAO,MAAM,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAEvD,kBAAkB;IAClB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,WAAW;IACX,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE5B,oBAAoB;IACpB,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;YACnD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnC,aAAa;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,CAAC;IAEX,cAAc;IACd,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAElD,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;YACnD,eAAe;YACf,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,uBAAuB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { join } from 'node:path';\n\nimport {\n type AgentType,\n ENV_KEYS,\n LZI_DIR,\n SYNTHESIS_RULES,\n VALID_AGENTS,\n} from '@longzai-intelligence-agent-tools/core';\n\nimport { COLORS, stdout } from '@/utils/cli-output';\n\n/**\n * 状态标记符号\n */\nconst STATUS_OK = `${COLORS.GREEN}存在${COLORS.RESET}`;\nconst STATUS_MISSING = `${COLORS.RED}缺失${COLORS.RESET}`;\n\n/**\n * 检测文件是否存在\n *\n * @param filePath - 文件绝对路径\n * @returns 是否存在\n */\nconst fileExists = async (filePath: string): Promise<boolean> => {\n return Bun.file(filePath).exists();\n};\n\n/**\n * 执行 status 命令\n *\n * 显示当前 Agent 类型、源文件存在性、目标文件存在性。\n */\nexport const statusCommand = async (): Promise<void> => {\n /** 项目根目录 */\n const projectRoot = process.cwd();\n\n /** 源目录绝对路径 */\n const lziDir = join(projectRoot, LZI_DIR);\n\n /** 从环境变量读 Agent 类型 */\n const agentTypeRaw = process.env[ENV_KEYS.AGENT_TYPE];\n const agentTypeValid = agentTypeRaw && VALID_AGENTS.includes(agentTypeRaw as AgentType) ? (agentTypeRaw as AgentType) : null;\n\n stdout(`${COLORS.BLUE}=== Agent Tools 状态 ===${COLORS.RESET}\\n`);\n\n /** 当前 Agent 类型 */\n if (agentTypeValid) {\n stdout(`当前 Agent: ${COLORS.GREEN}${agentTypeValid}${COLORS.RESET}`);\n } else if (agentTypeRaw) {\n stdout(`当前 Agent: ${COLORS.RED}${agentTypeRaw}(无效,合法值: ${VALID_AGENTS.join(', ')})${COLORS.RESET}`);\n } else {\n stdout(`当前 Agent: ${COLORS.YELLOW}未设置(请在 .env 配置 ${ENV_KEYS.AGENT_TYPE})${COLORS.RESET}`);\n }\n\n stdout('');\n\n /** 源文件存在性 */\n stdout(`${COLORS.BLUE}源文件(${lziDir}):${COLORS.RESET}`);\n\n /** 需要检查的源文件名集合 */\n const sourceFiles = new Set<string>();\n\n /** 共同部分 */\n sourceFiles.add('agent.md');\n\n /** 该 Agent 的独有部分 */\n if (agentTypeValid) {\n for (const rule of SYNTHESIS_RULES[agentTypeValid]) {\n sourceFiles.add(rule.agentSource);\n }\n }\n\n for (const fileName of sourceFiles) {\n /** 文件绝对路径 */\n const filePath = join(lziDir, fileName);\n const exists = await fileExists(filePath);\n stdout(` ${fileName}: ${exists ? STATUS_OK : STATUS_MISSING}`);\n }\n\n stdout('');\n\n /** 目标文件存在性 */\n if (agentTypeValid) {\n stdout(`${COLORS.BLUE}输出目标(将覆盖):${COLORS.RESET}`);\n\n for (const rule of SYNTHESIS_RULES[agentTypeValid]) {\n /** 目标文件绝对路径 */\n const targetPath = join(projectRoot, rule.output);\n const exists = await fileExists(targetPath);\n stdout(` ${rule.output}: ${exists ? STATUS_OK : STATUS_MISSING}`);\n }\n } else {\n stdout(`${COLORS.YELLOW}Agent 类型未配置,无法显示输出目标${COLORS.RESET}`);\n }\n};\n"]}
@@ -26,7 +26,7 @@ const previewResults = (results) => {
26
26
  stdout(`${COLORS.BLUE}=== 预览模式(不写入文件) ===${COLORS.RESET}\n`);
27
27
  for (const result of results) {
28
28
  stdout(`${COLORS.GREEN}--- ${result.output} ---${COLORS.RESET}`);
29
- stdout(`${COLORS.YELLOW}源: ${result.commonSourcePath} + ${result.ideSourcePath}${COLORS.RESET}`);
29
+ stdout(`${COLORS.YELLOW}源: ${result.commonSourcePath} + ${result.agentSourcePath}${COLORS.RESET}`);
30
30
  stdout('');
31
31
  stdout(result.content);
32
32
  stdout('');
@@ -60,7 +60,7 @@ export const syncCommand = async (options) => {
60
60
  /** 合并所有来源的占位符 */
61
61
  const placeholders = resolvePlaceholders(config.placeholders);
62
62
  /** 合成所有输出文件 */
63
- const results = await synthesizeAll(config.ide, projectRoot, placeholders);
63
+ const results = await synthesizeAll(config.agentType, projectRoot, placeholders);
64
64
  /** dry-run:仅预览 */
65
65
  if (options.dryRun) {
66
66
  previewResults(results);
@@ -92,6 +92,6 @@ export const syncCommand = async (options) => {
92
92
  for (const result of results) {
93
93
  await writeResult(projectRoot, result);
94
94
  }
95
- stdout(`\n${COLORS.GREEN}同步完成${COLORS.RESET} (IDE: ${config.ide},共 ${results.length} 个文件)`);
95
+ stdout(`\n${COLORS.GREEN}同步完成${COLORS.RESET} (Agent: ${config.agentType},共 ${results.length} 个文件)`);
96
96
  };
97
97
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from 'node:path';\n\nimport { loadCliConfig } from '@/config';\nimport { COLORS, promptInput, stdout } from '@/utils/cli-output';\nimport { type SynthesisResult, synthesizeAll } from '@/commands/sync/synthesizer';\nimport { resolvePlaceholders } from '@/utils/placeholder-resolver';\n\n/**\n * sync 命令选项\n */\ninterface SyncCommandOptions {\n /** 仅预览,不写入文件 */\n dryRun: boolean;\n /** 跳过覆盖确认 */\n force: boolean;\n}\n\n/**\n * 检测目标文件是否已存在\n *\n * @param projectRoot - 项目根目录绝对路径\n * @param output - 输出文件相对路径\n * @returns 是否已存在\n */\nconst targetExists = async (projectRoot: string, output: string): Promise<boolean> => {\n /** 目标文件绝对路径 */\n const targetPath = join(projectRoot, output);\n return Bun.file(targetPath).exists();\n};\n\n/**\n * 执行 dry-run 预览\n *\n * 打印每个输出文件的合成内容。\n *\n * @param results - 合成结果列表\n */\nconst previewResults = (results: readonly SynthesisResult[]): void => {\n stdout(`${COLORS.BLUE}=== 预览模式(不写入文件) ===${COLORS.RESET}\\n`);\n\n for (const result of results) {\n stdout(`${COLORS.GREEN}--- ${result.output} ---${COLORS.RESET}`);\n stdout(`${COLORS.YELLOW}源: ${result.commonSourcePath} + ${result.ideSourcePath}${COLORS.RESET}`);\n stdout('');\n stdout(result.content);\n stdout('');\n }\n};\n\n/**\n * 写入合成结果到目标文件\n *\n * @param projectRoot - 项目根目录绝对路径\n * @param result - 单个合成结果\n */\nconst writeResult = async (projectRoot: string, result: SynthesisResult): Promise<void> => {\n /** 目标文件绝对路径 */\n const targetPath = join(projectRoot, result.output);\n\n await Bun.write(targetPath, result.content);\n\n stdout(`${COLORS.GREEN} ✓${COLORS.RESET} ${result.output}`);\n};\n\n/**\n * 执行 sync 命令\n *\n * 按 .env 配置的 IDE 合成源 markdown,同步覆盖目标文件。\n * 目标已存在时提示用户确认,--force 跳过确认,--dry-run 仅预览。\n *\n * @param options - 命令选项\n */\nexport const syncCommand = async (options: SyncCommandOptions): Promise<void> => {\n /** 加载 CLI 配置(IDE + placeholders) */\n const config = await loadCliConfig();\n\n /** 项目根目录 */\n const projectRoot = process.cwd();\n\n /** 合并所有来源的占位符 */\n const placeholders = resolvePlaceholders(config.placeholders);\n\n /** 合成所有输出文件 */\n const results = await synthesizeAll(config.ide, projectRoot, placeholders);\n\n /** dry-run:仅预览 */\n if (options.dryRun) {\n previewResults(results);\n return;\n }\n\n /** 检测已存在的目标文件 */\n const existingTargets: string[] = [];\n\n for (const result of results) {\n if (await targetExists(projectRoot, result.output)) {\n existingTargets.push(result.output);\n }\n }\n\n /** 覆盖确认 */\n if (existingTargets.length > 0 && !options.force) {\n stdout(`${COLORS.YELLOW}将覆盖以下文件:${COLORS.RESET}`);\n for (const target of existingTargets) {\n stdout(` ${target}`);\n }\n\n /** 用户确认 */\n const confirmed = await promptInput(`\\n确认覆盖?(y/N): `);\n\n if (confirmed.toLowerCase() !== 'y') {\n stdout('已取消');\n return;\n }\n }\n\n /** 写入目标文件 */\n stdout('');\n stdout(`${COLORS.BLUE}正在写入...${COLORS.RESET}`);\n\n for (const result of results) {\n await writeResult(projectRoot, result);\n }\n\n stdout(`\\n${COLORS.GREEN}同步完成${COLORS.RESET} (IDE: ${config.ide},共 ${results.length} 个文件)`);\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from 'node:path';\n\nimport { loadCliConfig } from '@/config';\nimport { COLORS, promptInput, stdout } from '@/utils/cli-output';\nimport { type SynthesisResult, synthesizeAll } from '@/commands/sync/synthesizer';\nimport { resolvePlaceholders } from '@/utils/placeholder-resolver';\n\n/**\n * sync 命令选项\n */\ninterface SyncCommandOptions {\n /** 仅预览,不写入文件 */\n dryRun: boolean;\n /** 跳过覆盖确认 */\n force: boolean;\n}\n\n/**\n * 检测目标文件是否已存在\n *\n * @param projectRoot - 项目根目录绝对路径\n * @param output - 输出文件相对路径\n * @returns 是否已存在\n */\nconst targetExists = async (projectRoot: string, output: string): Promise<boolean> => {\n /** 目标文件绝对路径 */\n const targetPath = join(projectRoot, output);\n return Bun.file(targetPath).exists();\n};\n\n/**\n * 执行 dry-run 预览\n *\n * 打印每个输出文件的合成内容。\n *\n * @param results - 合成结果列表\n */\nconst previewResults = (results: readonly SynthesisResult[]): void => {\n stdout(`${COLORS.BLUE}=== 预览模式(不写入文件) ===${COLORS.RESET}\\n`);\n\n for (const result of results) {\n stdout(`${COLORS.GREEN}--- ${result.output} ---${COLORS.RESET}`);\n stdout(`${COLORS.YELLOW}源: ${result.commonSourcePath} + ${result.agentSourcePath}${COLORS.RESET}`);\n stdout('');\n stdout(result.content);\n stdout('');\n }\n};\n\n/**\n * 写入合成结果到目标文件\n *\n * @param projectRoot - 项目根目录绝对路径\n * @param result - 单个合成结果\n */\nconst writeResult = async (projectRoot: string, result: SynthesisResult): Promise<void> => {\n /** 目标文件绝对路径 */\n const targetPath = join(projectRoot, result.output);\n\n await Bun.write(targetPath, result.content);\n\n stdout(`${COLORS.GREEN} ✓${COLORS.RESET} ${result.output}`);\n};\n\n/**\n * 执行 sync 命令\n *\n * 按 .env 配置的 IDE 合成源 markdown,同步覆盖目标文件。\n * 目标已存在时提示用户确认,--force 跳过确认,--dry-run 仅预览。\n *\n * @param options - 命令选项\n */\nexport const syncCommand = async (options: SyncCommandOptions): Promise<void> => {\n /** 加载 CLI 配置(IDE + placeholders) */\n const config = await loadCliConfig();\n\n /** 项目根目录 */\n const projectRoot = process.cwd();\n\n /** 合并所有来源的占位符 */\n const placeholders = resolvePlaceholders(config.placeholders);\n\n /** 合成所有输出文件 */\n const results = await synthesizeAll(config.agentType, projectRoot, placeholders);\n\n /** dry-run:仅预览 */\n if (options.dryRun) {\n previewResults(results);\n return;\n }\n\n /** 检测已存在的目标文件 */\n const existingTargets: string[] = [];\n\n for (const result of results) {\n if (await targetExists(projectRoot, result.output)) {\n existingTargets.push(result.output);\n }\n }\n\n /** 覆盖确认 */\n if (existingTargets.length > 0 && !options.force) {\n stdout(`${COLORS.YELLOW}将覆盖以下文件:${COLORS.RESET}`);\n for (const target of existingTargets) {\n stdout(` ${target}`);\n }\n\n /** 用户确认 */\n const confirmed = await promptInput(`\\n确认覆盖?(y/N): `);\n\n if (confirmed.toLowerCase() !== 'y') {\n stdout('已取消');\n return;\n }\n }\n\n /** 写入目标文件 */\n stdout('');\n stdout(`${COLORS.BLUE}正在写入...${COLORS.RESET}`);\n\n for (const result of results) {\n await writeResult(projectRoot, result);\n }\n\n stdout(`\\n${COLORS.GREEN}同步完成${COLORS.RESET} (Agent: ${config.agentType},共 ${results.length} 个文件)`);\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { type AgentIde, type SynthesisRule } from '@longzai-intelligence-agent-tools/core';
1
+ import { type AgentType, type SynthesisRule } from '@longzai-intelligence-agent-tools/core';
2
2
  import { type ResolvedPlaceholders } from '../../utils/placeholder-resolver';
3
3
  /**
4
4
  * 单个输出文件的合成结果
@@ -11,12 +11,12 @@ export type SynthesisResult = {
11
11
  /** 共同部分源文件路径(绝对) */
12
12
  readonly commonSourcePath: string;
13
13
  /** 独有部分源文件路径(绝对) */
14
- readonly ideSourcePath: string;
14
+ readonly agentSourcePath: string;
15
15
  };
16
16
  /**
17
17
  * 按合成规则合成单个输出文件
18
18
  *
19
- * 读取 agent.md(共同)+ agent.<ide>.md(独有),拼接后做占位符替换。
19
+ * 读取 agent.md(共同)+ agent.<type>.md(独有),拼接后做占位符替换。
20
20
  *
21
21
  * @param rule - 合成规则
22
22
  * @param projectRoot - 项目根目录绝对路径
@@ -26,14 +26,14 @@ export type SynthesisResult = {
26
26
  */
27
27
  export declare const synthesizeOne: (rule: SynthesisRule, projectRoot: string, placeholders: ResolvedPlaceholders) => Promise<SynthesisResult>;
28
28
  /**
29
- * 合成某 IDE 的所有输出文件
29
+ * 合成某 Agent 类型的所有输出文件
30
30
  *
31
31
  * 按 SYNTHESIS_RULES 查表,逐条合成。
32
32
  *
33
- * @param ide - 目标 IDE
33
+ * @param agentType - 目标 Agent 类型
34
34
  * @param projectRoot - 项目根目录绝对路径
35
35
  * @param placeholders - 已解析的占位符表
36
36
  * @returns 所有输出文件的合成结果列表
37
37
  */
38
- export declare const synthesizeAll: (ide: AgentIde, projectRoot: string, placeholders: ResolvedPlaceholders) => Promise<SynthesisResult[]>;
38
+ export declare const synthesizeAll: (agentType: AgentType, projectRoot: string, placeholders: ResolvedPlaceholders) => Promise<SynthesisResult[]>;
39
39
  //# sourceMappingURL=synthesizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"synthesizer.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/synthesizer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,aAAa,EAGnB,MAAM,wCAAwC,CAAC;AAIhD,OAAO,EAAE,KAAK,oBAAoB,EAAuB,MAAM,8BAA8B,CAAC;AAE9F;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe;IACf,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oBAAoB;IACpB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,oBAAoB;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAmBF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,SAClB,aAAa,eACN,MAAM,gBACL,oBAAoB,KACjC,OAAO,CAAC,eAAe,CA+BzB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,QACnB,QAAQ,eACA,MAAM,gBACL,oBAAoB,KACjC,OAAO,CAAC,eAAe,EAAE,CAc3B,CAAC"}
1
+ {"version":3,"file":"synthesizer.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/synthesizer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAGnB,MAAM,wCAAwC,CAAC;AAIhD,OAAO,EAAE,KAAK,oBAAoB,EAAuB,MAAM,8BAA8B,CAAC;AAE9F;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe;IACf,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oBAAoB;IACpB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,oBAAoB;IACpB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,CAAC;AAmBF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,SAClB,aAAa,eACN,MAAM,gBACL,oBAAoB,KACjC,OAAO,CAAC,eAAe,CA+BzB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,cACb,SAAS,eACP,MAAM,gBACL,oBAAoB,KACjC,OAAO,CAAC,eAAe,EAAE,CAc3B,CAAC"}
@@ -18,7 +18,7 @@ const readSourceFile = async (filePath) => {
18
18
  /**
19
19
  * 按合成规则合成单个输出文件
20
20
  *
21
- * 读取 agent.md(共同)+ agent.<ide>.md(独有),拼接后做占位符替换。
21
+ * 读取 agent.md(共同)+ agent.<type>.md(独有),拼接后做占位符替换。
22
22
  *
23
23
  * @param rule - 合成规则
24
24
  * @param projectRoot - 项目根目录绝对路径
@@ -30,41 +30,41 @@ export const synthesizeOne = async (rule, projectRoot, placeholders) => {
30
30
  /** 共同部分源文件绝对路径 */
31
31
  const commonSourcePath = join(projectRoot, LZI_DIR, rule.commonSource);
32
32
  /** 独有部分源文件绝对路径 */
33
- const ideSourcePath = join(projectRoot, LZI_DIR, rule.ideSource);
33
+ const agentSourcePath = join(projectRoot, LZI_DIR, rule.agentSource);
34
34
  /** 读取共同部分 */
35
35
  const commonContent = await readSourceFile(commonSourcePath);
36
36
  if (commonContent === null) {
37
37
  throw new Error(`共同部分源文件不存在: ${commonSourcePath}`);
38
38
  }
39
39
  /** 读取独有部分 */
40
- const ideContent = await readSourceFile(ideSourcePath);
41
- if (ideContent === null) {
42
- throw new Error(`独有部分源文件不存在: ${ideSourcePath}`);
40
+ const agentContent = await readSourceFile(agentSourcePath);
41
+ if (agentContent === null) {
42
+ throw new Error(`独有部分源文件不存在: ${agentSourcePath}`);
43
43
  }
44
44
  /** 拼接共同部分 + 独有部分(空行分隔) */
45
- const combined = `${commonContent.trimEnd()}\n\n${ideContent.trimEnd()}\n`;
45
+ const combined = `${commonContent.trimEnd()}\n\n${agentContent.trimEnd()}\n`;
46
46
  /** 占位符替换 */
47
47
  const content = replacePlaceholders(combined, placeholders);
48
48
  return {
49
49
  output: rule.output,
50
50
  content,
51
51
  commonSourcePath,
52
- ideSourcePath,
52
+ agentSourcePath,
53
53
  };
54
54
  };
55
55
  /**
56
- * 合成某 IDE 的所有输出文件
56
+ * 合成某 Agent 类型的所有输出文件
57
57
  *
58
58
  * 按 SYNTHESIS_RULES 查表,逐条合成。
59
59
  *
60
- * @param ide - 目标 IDE
60
+ * @param agentType - 目标 Agent 类型
61
61
  * @param projectRoot - 项目根目录绝对路径
62
62
  * @param placeholders - 已解析的占位符表
63
63
  * @returns 所有输出文件的合成结果列表
64
64
  */
65
- export const synthesizeAll = async (ide, projectRoot, placeholders) => {
66
- /** 该 IDE 的合成规则列表 */
67
- const rules = SYNTHESIS_RULES[ide];
65
+ export const synthesizeAll = async (agentType, projectRoot, placeholders) => {
66
+ /** 该 Agent 类型的合成规则列表 */
67
+ const rules = SYNTHESIS_RULES[agentType];
68
68
  /** 逐条合成 */
69
69
  const results = [];
70
70
  for (const rule of rules) {
@@ -1 +1 @@
1
- {"version":3,"file":"synthesizer.js","sourceRoot":"","sources":["../../../src/commands/sync/synthesizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EACP,eAAe,GAChB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAA6B,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAgB9F;;;;;GAKG;AACH,MAAM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAA0B,EAAE;IACxE,eAAe;IACf,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,IAAmB,EACnB,WAAmB,EACnB,YAAkC,EACR,EAAE;IAC5B,kBAAkB;IAClB,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAEvE,kBAAkB;IAClB,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEjE,aAAa;IACb,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC7D,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,eAAe,gBAAgB,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,aAAa;IACb,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;IACvD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;IAE3E,YAAY;IACZ,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAE5D,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,gBAAgB;QAChB,aAAa;KACd,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,GAAa,EACb,WAAmB,EACnB,YAAkC,EACN,EAAE;IAC9B,oBAAoB;IACpB,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAEnC,WAAW;IACX,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import {\n type AgentIde,\n type SynthesisRule,\n LZI_DIR,\n SYNTHESIS_RULES,\n} from '@longzai-intelligence-agent-tools/core';\n\nimport { join } from 'node:path';\n\nimport { type ResolvedPlaceholders, replacePlaceholders } from '@/utils/placeholder-resolver';\n\n/**\n * 单个输出文件的合成结果\n */\nexport type SynthesisResult = {\n /** 输出文件相对路径 */\n readonly output: string;\n /** 合成后的完整内容 */\n readonly content: string;\n /** 共同部分源文件路径(绝对) */\n readonly commonSourcePath: string;\n /** 独有部分源文件路径(绝对) */\n readonly ideSourcePath: string;\n};\n\n/**\n * 读取源文件内容\n *\n * @param filePath - 文件绝对路径\n * @returns 文件内容字符串,文件不存在时返回 null\n */\nconst readSourceFile = async (filePath: string): Promise<string | null> => {\n /** Bun 文件句柄 */\n const file = Bun.file(filePath);\n\n if (!(await file.exists())) {\n return null;\n }\n\n return file.text();\n};\n\n/**\n * 按合成规则合成单个输出文件\n *\n * 读取 agent.md(共同)+ agent.<ide>.md(独有),拼接后做占位符替换。\n *\n * @param rule - 合成规则\n * @param projectRoot - 项目根目录绝对路径\n * @param placeholders - 已解析的占位符表\n * @returns 合成结果,源文件缺失时抛出错误\n * @throws Error 当共同部分或独有部分源文件不存在时\n */\nexport const synthesizeOne = async (\n rule: SynthesisRule,\n projectRoot: string,\n placeholders: ResolvedPlaceholders,\n): Promise<SynthesisResult> => {\n /** 共同部分源文件绝对路径 */\n const commonSourcePath = join(projectRoot, LZI_DIR, rule.commonSource);\n\n /** 独有部分源文件绝对路径 */\n const ideSourcePath = join(projectRoot, LZI_DIR, rule.ideSource);\n\n /** 读取共同部分 */\n const commonContent = await readSourceFile(commonSourcePath);\n if (commonContent === null) {\n throw new Error(`共同部分源文件不存在: ${commonSourcePath}`);\n }\n\n /** 读取独有部分 */\n const ideContent = await readSourceFile(ideSourcePath);\n if (ideContent === null) {\n throw new Error(`独有部分源文件不存在: ${ideSourcePath}`);\n }\n\n /** 拼接共同部分 + 独有部分(空行分隔) */\n const combined = `${commonContent.trimEnd()}\\n\\n${ideContent.trimEnd()}\\n`;\n\n /** 占位符替换 */\n const content = replacePlaceholders(combined, placeholders);\n\n return {\n output: rule.output,\n content,\n commonSourcePath,\n ideSourcePath,\n };\n};\n\n/**\n * 合成某 IDE 的所有输出文件\n *\n * 按 SYNTHESIS_RULES 查表,逐条合成。\n *\n * @param ide - 目标 IDE\n * @param projectRoot - 项目根目录绝对路径\n * @param placeholders - 已解析的占位符表\n * @returns 所有输出文件的合成结果列表\n */\nexport const synthesizeAll = async (\n ide: AgentIde,\n projectRoot: string,\n placeholders: ResolvedPlaceholders,\n): Promise<SynthesisResult[]> => {\n /** 该 IDE 的合成规则列表 */\n const rules = SYNTHESIS_RULES[ide];\n\n /** 逐条合成 */\n const results: SynthesisResult[] = [];\n\n for (const rule of rules) {\n /** 单条合成结果 */\n const result = await synthesizeOne(rule, projectRoot, placeholders);\n results.push(result);\n }\n\n return results;\n};\n"]}
1
+ {"version":3,"file":"synthesizer.js","sourceRoot":"","sources":["../../../src/commands/sync/synthesizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EACP,eAAe,GAChB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAA6B,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAgB9F;;;;;GAKG;AACH,MAAM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAA0B,EAAE;IACxE,eAAe;IACf,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,IAAmB,EACnB,WAAmB,EACnB,YAAkC,EACR,EAAE;IAC5B,kBAAkB;IAClB,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAEvE,kBAAkB;IAClB,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAErE,aAAa;IACb,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC7D,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,eAAe,gBAAgB,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,aAAa;IACb,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,CAAC;IAC3D,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,eAAe,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;IAE7E,YAAY;IACZ,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAE5D,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,gBAAgB;QAChB,eAAe;KAChB,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,SAAoB,EACpB,WAAmB,EACnB,YAAkC,EACN,EAAE;IAC9B,wBAAwB;IACxB,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAEzC,WAAW;IACX,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import {\n type AgentType,\n type SynthesisRule,\n LZI_DIR,\n SYNTHESIS_RULES,\n} from '@longzai-intelligence-agent-tools/core';\n\nimport { join } from 'node:path';\n\nimport { type ResolvedPlaceholders, replacePlaceholders } from '@/utils/placeholder-resolver';\n\n/**\n * 单个输出文件的合成结果\n */\nexport type SynthesisResult = {\n /** 输出文件相对路径 */\n readonly output: string;\n /** 合成后的完整内容 */\n readonly content: string;\n /** 共同部分源文件路径(绝对) */\n readonly commonSourcePath: string;\n /** 独有部分源文件路径(绝对) */\n readonly agentSourcePath: string;\n};\n\n/**\n * 读取源文件内容\n *\n * @param filePath - 文件绝对路径\n * @returns 文件内容字符串,文件不存在时返回 null\n */\nconst readSourceFile = async (filePath: string): Promise<string | null> => {\n /** Bun 文件句柄 */\n const file = Bun.file(filePath);\n\n if (!(await file.exists())) {\n return null;\n }\n\n return file.text();\n};\n\n/**\n * 按合成规则合成单个输出文件\n *\n * 读取 agent.md(共同)+ agent.<type>.md(独有),拼接后做占位符替换。\n *\n * @param rule - 合成规则\n * @param projectRoot - 项目根目录绝对路径\n * @param placeholders - 已解析的占位符表\n * @returns 合成结果,源文件缺失时抛出错误\n * @throws Error 当共同部分或独有部分源文件不存在时\n */\nexport const synthesizeOne = async (\n rule: SynthesisRule,\n projectRoot: string,\n placeholders: ResolvedPlaceholders,\n): Promise<SynthesisResult> => {\n /** 共同部分源文件绝对路径 */\n const commonSourcePath = join(projectRoot, LZI_DIR, rule.commonSource);\n\n /** 独有部分源文件绝对路径 */\n const agentSourcePath = join(projectRoot, LZI_DIR, rule.agentSource);\n\n /** 读取共同部分 */\n const commonContent = await readSourceFile(commonSourcePath);\n if (commonContent === null) {\n throw new Error(`共同部分源文件不存在: ${commonSourcePath}`);\n }\n\n /** 读取独有部分 */\n const agentContent = await readSourceFile(agentSourcePath);\n if (agentContent === null) {\n throw new Error(`独有部分源文件不存在: ${agentSourcePath}`);\n }\n\n /** 拼接共同部分 + 独有部分(空行分隔) */\n const combined = `${commonContent.trimEnd()}\\n\\n${agentContent.trimEnd()}\\n`;\n\n /** 占位符替换 */\n const content = replacePlaceholders(combined, placeholders);\n\n return {\n output: rule.output,\n content,\n commonSourcePath,\n agentSourcePath,\n };\n};\n\n/**\n * 合成某 Agent 类型的所有输出文件\n *\n * 按 SYNTHESIS_RULES 查表,逐条合成。\n *\n * @param agentType - 目标 Agent 类型\n * @param projectRoot - 项目根目录绝对路径\n * @param placeholders - 已解析的占位符表\n * @returns 所有输出文件的合成结果列表\n */\nexport const synthesizeAll = async (\n agentType: AgentType,\n projectRoot: string,\n placeholders: ResolvedPlaceholders,\n): Promise<SynthesisResult[]> => {\n /** 该 Agent 类型的合成规则列表 */\n const rules = SYNTHESIS_RULES[agentType];\n\n /** 逐条合成 */\n const results: SynthesisResult[] = [];\n\n for (const rule of rules) {\n /** 单条合成结果 */\n const result = await synthesizeOne(rule, projectRoot, placeholders);\n results.push(result);\n }\n\n return results;\n};\n"]}
package/dist/config.d.ts CHANGED
@@ -1,21 +1,21 @@
1
- import { type AgentIde } from '@longzai-intelligence-agent-tools/core';
1
+ import { type AgentType } from '@longzai-intelligence-agent-tools/core';
2
2
  /**
3
3
  * CLI 运行时配置
4
4
  *
5
- * 合并来源:环境变量(IDE)+ lzi.config.ts(placeholders)。
5
+ * 合并来源:环境变量(Agent 类型)+ lzi.config.ts(placeholders)。
6
6
  */
7
7
  export type CliConfig = {
8
- /** 当前 IDE */
9
- readonly ide: AgentIde;
8
+ /** 当前 Agent 类型 */
9
+ readonly agentType: AgentType;
10
10
  /** 占位符表(已合并所有来源) */
11
11
  readonly placeholders?: Record<string, string>;
12
12
  };
13
13
  /**
14
14
  * 加载完整 CLI 配置
15
15
  *
16
- * IDE 来自环境变量,placeholders 来自 lzi.config.ts(容错回退)。
16
+ * Agent 类型来自环境变量,placeholders 来自 lzi.config.ts
17
17
  *
18
- * @returns CLI 配置,IDE 未配置时退出进程
18
+ * @returns CLI 配置,Agent 类型未配置时退出进程
19
19
  */
20
20
  export declare const loadCliConfig: () => Promise<CliConfig>;
21
21
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,wCAAwC,CAAC;AAIhD;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,aAAa;IACb,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,oBAAoB;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD,CAAC;AAqDF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,SAAS,CAiBvD,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,wCAAwC,CAAC;AAKhD;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,kBAAkB;IAClB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,oBAAoB;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD,CAAC;AAsCF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,SAAS,CAiBvD,CAAC"}
package/dist/config.js CHANGED
@@ -1,68 +1,55 @@
1
- import { ENV_KEYS, VALID_IDES, } from '@longzai-intelligence-agent-tools/core';
1
+ import { ENV_KEYS, VALID_AGENTS, } from '@longzai-intelligence-agent-tools/core';
2
+ import { loadUnifiedConfig } from '@longzai-intelligence-shared-config/core';
2
3
  import { stderr } from './utils/cli-output';
3
4
  /**
4
- * 从环境变量读取当前 IDE
5
+ * 从环境变量读取当前 Agent 类型
5
6
  *
6
- * @returns IDE 标识,若未配置或非法则返回 null
7
+ * @returns Agent 类型标识,若未配置或非法则返回 null
7
8
  */
8
- const readIdeFromEnv = () => {
9
+ const readAgentTypeFromEnv = () => {
9
10
  /** 环境变量值 */
10
- const raw = process.env[ENV_KEYS.IDE];
11
+ const raw = process.env[ENV_KEYS.AGENT_TYPE];
11
12
  if (!raw) {
12
13
  return null;
13
14
  }
14
- if (!VALID_IDES.includes(raw)) {
15
- stderr(`错误: ${ENV_KEYS.IDE} 值 '${raw}' 无效,合法值为: ${VALID_IDES.join(', ')}`);
15
+ if (!VALID_AGENTS.includes(raw)) {
16
+ stderr(`错误: ${ENV_KEYS.AGENT_TYPE} 值 '${raw}' 无效,合法值为: ${VALID_AGENTS.join(', ')}`);
16
17
  return null;
17
18
  }
18
19
  return raw;
19
20
  };
20
21
  /**
21
- * lzi.config.ts 读取 agentTools 配置
22
+ * 从统一配置 lzi.config.ts 读取 agentTools 配置
22
23
  *
23
- * 动态 import shared-config/core,失败时容错回退。
24
+ * 使用 shared-config 的 loadUnifiedConfig 统一加载。
24
25
  *
25
- * @returns agentTools 配置,shared-config 不可用时返回 undefined
26
+ * @returns agentTools 配置,未找到时返回 undefined
26
27
  */
27
28
  const loadAgentToolsConfig = async () => {
28
- try {
29
- /**
30
- * 动态 import,避免 shared-config 未安装时静态解析失败
31
- */
32
- const sharedConfig = await import('@longzai-intelligence-shared-config/core');
33
- /** 加载工作区配置 */
34
- const { config } = await sharedConfig.loadConfig();
35
- /** agentTools namespace */
36
- const agentTools = config.agentTools;
37
- return agentTools;
38
- }
39
- catch {
40
- /**
41
- * shared-config 加载失败(未安装或未找到 lzi.config.ts)
42
- * 返回 undefined,placeholders 仍可从环境变量获取
43
- */
44
- return undefined;
45
- }
29
+ const result = await loadUnifiedConfig({
30
+ unifiedField: 'agentTools',
31
+ });
32
+ return result.success ? result.config : undefined;
46
33
  };
47
34
  /**
48
35
  * 加载完整 CLI 配置
49
36
  *
50
- * IDE 来自环境变量,placeholders 来自 lzi.config.ts(容错回退)。
37
+ * Agent 类型来自环境变量,placeholders 来自 lzi.config.ts
51
38
  *
52
- * @returns CLI 配置,IDE 未配置时退出进程
39
+ * @returns CLI 配置,Agent 类型未配置时退出进程
53
40
  */
54
41
  export const loadCliConfig = async () => {
55
- /** 从环境变量读 IDE */
56
- const ide = readIdeFromEnv();
57
- if (!ide) {
58
- stderr(`错误: 环境变量 ${ENV_KEYS.IDE} 未设置`);
59
- stderr(`请在 .env 中配置,合法值为: ${VALID_IDES.join(', ')}`);
42
+ /** 从环境变量读 Agent 类型 */
43
+ const agentType = readAgentTypeFromEnv();
44
+ if (!agentType) {
45
+ stderr(`错误: 环境变量 ${ENV_KEYS.AGENT_TYPE} 未设置`);
46
+ stderr(`请在 .env 中配置,合法值为: ${VALID_AGENTS.join(', ')}`);
60
47
  process.exit(1);
61
48
  }
62
49
  /** 加载 agentTools 配置 */
63
50
  const agentTools = await loadAgentToolsConfig();
64
51
  return {
65
- ide,
52
+ agentType,
66
53
  placeholders: agentTools?.placeholders,
67
54
  };
68
55
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACR,UAAU,GACX,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAc5C;;;;GAIG;AACH,MAAM,cAAc,GAAG,GAAoB,EAAE;IAC3C,YAAY;IACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAe,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,OAAO,QAAQ,CAAC,GAAG,OAAO,GAAG,cAAc,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAe,CAAC;AACzB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG,KAAK,IAA2C,EAAE;IAC7E,IAAI,CAAC;QACH;;WAEG;QACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,0CAA0C,CAAC,CAAC;QAE9E,cAAc;QACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAEnD,2BAA2B;QAC3B,MAAM,UAAU,GAAI,MAA4C,CAAC,UAAU,CAAC;QAE5E,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP;;;WAGG;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAwB,EAAE;IAC1D,iBAAiB;IACjB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAE7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,YAAY,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAEhD,OAAO;QACL,GAAG;QACH,YAAY,EAAE,UAAU,EAAE,YAAY;KACvC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n type AgentIde,\n type AgentToolsConfig,\n ENV_KEYS,\n VALID_IDES,\n} from '@longzai-intelligence-agent-tools/core';\n\nimport { stderr } from '@/utils/cli-output';\n\n/**\n * CLI 运行时配置\n *\n * 合并来源:环境变量(IDE)+ lzi.config.ts(placeholders)。\n */\nexport type CliConfig = {\n /** 当前 IDE */\n readonly ide: AgentIde;\n /** 占位符表(已合并所有来源) */\n readonly placeholders?: Record<string, string>;\n};\n\n/**\n * 从环境变量读取当前 IDE\n *\n * @returns IDE 标识,若未配置或非法则返回 null\n */\nconst readIdeFromEnv = (): AgentIde | null => {\n /** 环境变量值 */\n const raw = process.env[ENV_KEYS.IDE];\n\n if (!raw) {\n return null;\n }\n\n if (!VALID_IDES.includes(raw as AgentIde)) {\n stderr(`错误: ${ENV_KEYS.IDE} 值 '${raw}' 无效,合法值为: ${VALID_IDES.join(', ')}`);\n return null;\n }\n\n return raw as AgentIde;\n};\n\n/**\n * lzi.config.ts 读取 agentTools 配置\n *\n * 动态 import shared-config/core,失败时容错回退。\n *\n * @returns agentTools 配置,shared-config 不可用时返回 undefined\n */\nconst loadAgentToolsConfig = async (): Promise<AgentToolsConfig | undefined> => {\n try {\n /**\n * 动态 import,避免 shared-config 未安装时静态解析失败\n */\n const sharedConfig = await import('@longzai-intelligence-shared-config/core');\n\n /** 加载工作区配置 */\n const { config } = await sharedConfig.loadConfig();\n\n /** agentTools namespace */\n const agentTools = (config as { agentTools?: AgentToolsConfig }).agentTools;\n\n return agentTools;\n } catch {\n /**\n * shared-config 加载失败(未安装或未找到 lzi.config.ts)\n * 返回 undefined,placeholders 仍可从环境变量获取\n */\n return undefined;\n }\n};\n\n/**\n * 加载完整 CLI 配置\n *\n * IDE 来自环境变量,placeholders 来自 lzi.config.ts(容错回退)。\n *\n * @returns CLI 配置,IDE 未配置时退出进程\n */\nexport const loadCliConfig = async (): Promise<CliConfig> => {\n /** 从环境变量读 IDE */\n const ide = readIdeFromEnv();\n\n if (!ide) {\n stderr(`错误: 环境变量 ${ENV_KEYS.IDE} 未设置`);\n stderr(`请在 .env 中配置,合法值为: ${VALID_IDES.join(', ')}`);\n process.exit(1);\n }\n\n /** 加载 agentTools 配置 */\n const agentTools = await loadAgentToolsConfig();\n\n return {\n ide,\n placeholders: agentTools?.placeholders,\n };\n};\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACR,YAAY,GACb,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAc5C;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,GAAqB,EAAE;IAClD,YAAY;IACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAgB,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,OAAO,QAAQ,CAAC,UAAU,OAAO,GAAG,cAAc,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG,KAAK,IAA2C,EAAE;IAC7E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAmB;QACvD,YAAY,EAAE,YAAY;KAC3B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAwB,EAAE;IAC1D,sBAAsB;IACtB,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;IAEzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,YAAY,QAAQ,CAAC,UAAU,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,qBAAqB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAEhD,OAAO;QACL,SAAS;QACT,YAAY,EAAE,UAAU,EAAE,YAAY;KACvC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n type AgentToolsConfig,\n type AgentType,\n ENV_KEYS,\n VALID_AGENTS,\n} from '@longzai-intelligence-agent-tools/core';\nimport { loadUnifiedConfig } from '@longzai-intelligence-shared-config/core';\n\nimport { stderr } from '@/utils/cli-output';\n\n/**\n * CLI 运行时配置\n *\n * 合并来源:环境变量(Agent 类型)+ lzi.config.ts(placeholders)。\n */\nexport type CliConfig = {\n /** 当前 Agent 类型 */\n readonly agentType: AgentType;\n /** 占位符表(已合并所有来源) */\n readonly placeholders?: Record<string, string>;\n};\n\n/**\n * 从环境变量读取当前 Agent 类型\n *\n * @returns Agent 类型标识,若未配置或非法则返回 null\n */\nconst readAgentTypeFromEnv = (): AgentType | null => {\n /** 环境变量值 */\n const raw = process.env[ENV_KEYS.AGENT_TYPE];\n\n if (!raw) {\n return null;\n }\n\n if (!VALID_AGENTS.includes(raw as AgentType)) {\n stderr(`错误: ${ENV_KEYS.AGENT_TYPE} 值 '${raw}' 无效,合法值为: ${VALID_AGENTS.join(', ')}`);\n return null;\n }\n\n return raw as AgentType;\n};\n\n/**\n * 从统一配置 lzi.config.ts 读取 agentTools 配置\n *\n * 使用 shared-config 的 loadUnifiedConfig 统一加载。\n *\n * @returns agentTools 配置,未找到时返回 undefined\n */\nconst loadAgentToolsConfig = async (): Promise<AgentToolsConfig | undefined> => {\n const result = await loadUnifiedConfig<AgentToolsConfig>({\n unifiedField: 'agentTools',\n });\n\n return result.success ? result.config : undefined;\n};\n\n/**\n * 加载完整 CLI 配置\n *\n * Agent 类型来自环境变量,placeholders 来自 lzi.config.ts。\n *\n * @returns CLI 配置,Agent 类型未配置时退出进程\n */\nexport const loadCliConfig = async (): Promise<CliConfig> => {\n /** 从环境变量读 Agent 类型 */\n const agentType = readAgentTypeFromEnv();\n\n if (!agentType) {\n stderr(`错误: 环境变量 ${ENV_KEYS.AGENT_TYPE} 未设置`);\n stderr(`请在 .env 中配置,合法值为: ${VALID_AGENTS.join(', ')}`);\n process.exit(1);\n }\n\n /** 加载 agentTools 配置 */\n const agentTools = await loadAgentToolsConfig();\n\n return {\n agentType,\n placeholders: agentTools?.placeholders,\n };\n};\n"]}
package/dist/index.js CHANGED
@@ -37,10 +37,10 @@ ${CLI_NAME} - Longzai Intelligence Agent Tools
37
37
  [--dry-run] 仅预览,不写入文件
38
38
  [--force] 跳过覆盖确认
39
39
 
40
- status 显示当前 IDE、源文件存在性、输出目标
40
+ status 显示当前 Agent 类型、源文件存在性、输出目标
41
41
 
42
42
  环境变量:
43
- LZI_AGENT_IDE 当前 IDE(claude | trae | zcode)
43
+ LZI_AGENT_TYPE 当前 Agent 类型(claude | trae | zcode)
44
44
  LZI_PLACEHOLDER_<KEY> 占位符值(可选,优先级低于 lzi.config.ts)
45
45
 
46
46
  选项:
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,MAAM,QAAQ,GAAG,eAAe,CAAC;AAEjC;;GAEG;AACH,MAAM,SAAS,GAAG;EAChB,QAAQ;;;;;;;;;;;;IAYN,QAAQ;;;;;;;;;;;;;;;;;;;CAmBX,CAAC;AAEF;;GAEG;AACH,MAAM,QAAQ,GAAG,GAAS,EAAE;IAC1B,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,GAAG,GAAS,EAAE;IAC7B,2BAA2B;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC;IACxB,MAAM,CAAC,GAAG,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAUF,MAAM,cAAc,GAAG,CAAC,IAAuB,EAAwB,EAAE;IACvE,iBAAiB;IACjB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,eAAe;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEvC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,2BAA2B;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC9C,QAAQ,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QAC5B,WAAW,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,WAAW;IACX,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,WAAW;IACX,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,EAAE,CAAC;YACZ,WAAW;YACX,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,MAAM;QACR,CAAC;QACD,KAAK,MAAM,EAAE,CAAC;YACZ,WAAW;YACX,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACrC,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,aAAa,EAAE,CAAC;YACtB,MAAM;QACR,CAAC;QACD,SAAS,CAAC;YACR,MAAM,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC;YAChC,MAAM,CAAC,OAAO,QAAQ,iBAAiB,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,MAAM,CAAC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env bun\n/**\n * Longzai Intelligence Agent Tools CLI\n * 把 .lzi/ 下的源 markdown 按当前 IDE 合成,同步覆盖为 CLAUDE.md / AGENTS.md。\n */\n\nimport { initCommand } from '@/commands/init';\nimport { statusCommand } from '@/commands/status';\nimport { syncCommand } from '@/commands/sync';\n\nimport { stderr, stdout } from '@/utils/cli-output';\n\n/**\n * CLI 工具名称\n */\nconst CLI_NAME = 'lzi-agent-cli';\n\n/**\n * 全局帮助信息\n */\nconst HELP_TEXT = `\n${CLI_NAME} - Longzai Intelligence Agent Tools\n\n把 .lzi/ 下的源 markdown(共同部分 + 各 IDE 独有部分)按当前 IDE 自动合成,\n同步覆盖为 CLAUDE.md / AGENTS.md。\n\n源文件(.lzi/ 下):\n agent.md 共同部分\n agent.claude.md claude 独有\n agent.trae.md trae 独有\n agent.zcode.md zcode 独有\n\n用法:\n ${CLI_NAME} <command> [options]\n\n命令:\n init 创建 .lzi/ 目录和源文件骨架\n [--dry-run] 仅预览将创建的文件\n\n sync 合成并同步覆盖目标文件\n [--dry-run] 仅预览,不写入文件\n [--force] 跳过覆盖确认\n\n status 显示当前 IDE、源文件存在性、输出目标\n\n环境变量:\n LZI_AGENT_IDE 当前 IDE(claude | trae | zcode)\n LZI_PLACEHOLDER_<KEY> 占位符值(可选,优先级低于 lzi.config.ts)\n\n选项:\n --help 显示帮助信息\n --version 显示版本号\n`;\n\n/**\n * 显示全局帮助信息并退出\n */\nconst showHelp = (): void => {\n stdout(HELP_TEXT.trim());\n process.exit(0);\n};\n\n/**\n * 显示版本号并退出\n */\nconst showVersion = (): void => {\n /** 从 package.json 读取版本号 */\n const version = '0.0.1';\n stdout(`${CLI_NAME} v${version}`);\n process.exit(0);\n};\n\n/**\n * 解析 sync 命令标志\n *\n * @param args - 参数列表\n * @returns 解析后的标志\n */\ntype ParseSyncFlagsResult = { dryRun: boolean; force: boolean };\n\nconst parseSyncFlags = (args: readonly string[]): ParseSyncFlagsResult => {\n /** dry-run 标志 */\n const dryRun = args.includes('--dry-run');\n /** force 标志 */\n const force = args.includes('--force');\n\n return { dryRun, force };\n};\n\n/**\n * CLI 主入口函数\n *\n * 解析命令行参数并路由到对应命令。\n */\nconst main = async (): Promise<void> => {\n /** 命令行参数(去除 node 和脚本路径) */\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help') {\n showHelp();\n return;\n }\n\n if (args[0] === '--version') {\n showVersion();\n return;\n }\n\n /** 命令名称 */\n const command = args[0];\n\n /** 命令参数 */\n const cmdArgs = args.slice(1);\n\n switch (command) {\n case 'init': {\n /** 解析标志 */\n const { dryRun } = parseSyncFlags(cmdArgs);\n await initCommand({ dryRun });\n break;\n }\n case 'sync': {\n /** 解析标志 */\n const { dryRun, force } = parseSyncFlags(cmdArgs);\n await syncCommand({ dryRun, force });\n break;\n }\n case 'status': {\n await statusCommand();\n break;\n }\n default: {\n stderr(`错误: 未知命令 '${command}'`);\n stderr(`使用 '${CLI_NAME} --help' 查看可用命令`);\n process.exit(1);\n }\n }\n};\n\nmain().catch((err) => {\n stderr('错误:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env bun\n/**\n * Longzai Intelligence Agent Tools CLI\n * 把 .lzi/ 下的源 markdown 按当前 IDE 合成,同步覆盖为 CLAUDE.md / AGENTS.md。\n */\n\nimport { initCommand } from '@/commands/init';\nimport { statusCommand } from '@/commands/status';\nimport { syncCommand } from '@/commands/sync';\n\nimport { stderr, stdout } from '@/utils/cli-output';\n\n/**\n * CLI 工具名称\n */\nconst CLI_NAME = 'lzi-agent-cli';\n\n/**\n * 全局帮助信息\n */\nconst HELP_TEXT = `\n${CLI_NAME} - Longzai Intelligence Agent Tools\n\n把 .lzi/ 下的源 markdown(共同部分 + 各 IDE 独有部分)按当前 IDE 自动合成,\n同步覆盖为 CLAUDE.md / AGENTS.md。\n\n源文件(.lzi/ 下):\n agent.md 共同部分\n agent.claude.md claude 独有\n agent.trae.md trae 独有\n agent.zcode.md zcode 独有\n\n用法:\n ${CLI_NAME} <command> [options]\n\n命令:\n init 创建 .lzi/ 目录和源文件骨架\n [--dry-run] 仅预览将创建的文件\n\n sync 合成并同步覆盖目标文件\n [--dry-run] 仅预览,不写入文件\n [--force] 跳过覆盖确认\n\n status 显示当前 Agent 类型、源文件存在性、输出目标\n\n环境变量:\n LZI_AGENT_TYPE 当前 Agent 类型(claude | trae | zcode)\n LZI_PLACEHOLDER_<KEY> 占位符值(可选,优先级低于 lzi.config.ts)\n\n选项:\n --help 显示帮助信息\n --version 显示版本号\n`;\n\n/**\n * 显示全局帮助信息并退出\n */\nconst showHelp = (): void => {\n stdout(HELP_TEXT.trim());\n process.exit(0);\n};\n\n/**\n * 显示版本号并退出\n */\nconst showVersion = (): void => {\n /** 从 package.json 读取版本号 */\n const version = '0.0.1';\n stdout(`${CLI_NAME} v${version}`);\n process.exit(0);\n};\n\n/**\n * 解析 sync 命令标志\n *\n * @param args - 参数列表\n * @returns 解析后的标志\n */\ntype ParseSyncFlagsResult = { dryRun: boolean; force: boolean };\n\nconst parseSyncFlags = (args: readonly string[]): ParseSyncFlagsResult => {\n /** dry-run 标志 */\n const dryRun = args.includes('--dry-run');\n /** force 标志 */\n const force = args.includes('--force');\n\n return { dryRun, force };\n};\n\n/**\n * CLI 主入口函数\n *\n * 解析命令行参数并路由到对应命令。\n */\nconst main = async (): Promise<void> => {\n /** 命令行参数(去除 node 和脚本路径) */\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help') {\n showHelp();\n return;\n }\n\n if (args[0] === '--version') {\n showVersion();\n return;\n }\n\n /** 命令名称 */\n const command = args[0];\n\n /** 命令参数 */\n const cmdArgs = args.slice(1);\n\n switch (command) {\n case 'init': {\n /** 解析标志 */\n const { dryRun } = parseSyncFlags(cmdArgs);\n await initCommand({ dryRun });\n break;\n }\n case 'sync': {\n /** 解析标志 */\n const { dryRun, force } = parseSyncFlags(cmdArgs);\n await syncCommand({ dryRun, force });\n break;\n }\n case 'status': {\n await statusCommand();\n break;\n }\n default: {\n stderr(`错误: 未知命令 '${command}'`);\n stderr(`使用 '${CLI_NAME} --help' 查看可用命令`);\n process.exit(1);\n }\n }\n};\n\nmain().catch((err) => {\n stderr('错误:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-agent-tools/cli",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Longzai Intelligence Agent Tools CLI",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -34,7 +34,7 @@
34
34
  "clean": "rimraf dist out .cache"
35
35
  },
36
36
  "dependencies": {
37
- "@longzai-intelligence-agent-tools/core": "0.0.1",
38
- "@longzai-intelligence-shared-config/core": "^0.0.1"
37
+ "@longzai-intelligence-agent-tools/core": "0.0.2",
38
+ "@longzai-intelligence-shared-config/core": "^0.0.4"
39
39
  }
40
40
  }
@@ -1,18 +0,0 @@
1
- /**
2
- * init 命令选项
3
- */
4
- interface InitCommandOptions {
5
- /** 仅预览将创建的文件,不实际写入 */
6
- dryRun: boolean;
7
- }
8
- /**
9
- * 执行 init 命令
10
- *
11
- * 在当前项目创建 .lzi/ 目录和四个源文件骨架。
12
- * 已存在的文件跳过,不覆盖。
13
- *
14
- * @param options - 命令选项
15
- */
16
- export declare const initCommand: (options: InitCommandOptions) => Promise<void>;
17
- export {};
18
- //# sourceMappingURL=index.d.ts.map
@@ -1,20 +0,0 @@
1
- /**
2
- * sync 命令选项
3
- */
4
- interface SyncCommandOptions {
5
- /** 仅预览,不写入文件 */
6
- dryRun: boolean;
7
- /** 跳过覆盖确认 */
8
- force: boolean;
9
- }
10
- /**
11
- * 执行 sync 命令
12
- *
13
- * 按 .env 配置的 IDE 合成源 markdown,同步覆盖目标文件。
14
- * 目标已存在时提示用户确认,--force 跳过确认,--dry-run 仅预览。
15
- *
16
- * @param options - 命令选项
17
- */
18
- export declare const syncCommand: (options: SyncCommandOptions) => Promise<void>;
19
- export {};
20
- //# sourceMappingURL=index.d.ts.map
package/dist/index.d.ts DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * Longzai Intelligence Agent Tools CLI
4
- * 把 .lzi/ 下的源 markdown 按当前 IDE 合成,同步覆盖为 CLAUDE.md / AGENTS.md。
5
- */
6
- export {};
7
- //# sourceMappingURL=index.d.ts.map
@@ -1,35 +0,0 @@
1
- /**
2
- * CLI 输出工具
3
- *
4
- * 按 ADR 0038,禁止 console.*;所有 CLI 用户输出统一通过 process.stdout.write / process.stderr.write。
5
- */
6
- /**
7
- * 输出 ANSI 颜色常量
8
- */
9
- export declare const COLORS: {
10
- readonly RED: '\u001B[0;31m';
11
- readonly GREEN: '\u001B[0;32m';
12
- readonly YELLOW: '\u001B[1;33m';
13
- readonly BLUE: '\u001B[0;34m';
14
- readonly RESET: '\u001B[0m';
15
- };
16
- /**
17
- * 输出到标准输出(等价 console.log,自动追加换行)
18
- *
19
- * @param args - 任意参数列表
20
- */
21
- export declare function stdout(...args: readonly unknown[]): void;
22
- /**
23
- * 输出到标准错误流(等价 console.error,自动追加换行)
24
- *
25
- * @param args - 任意参数列表
26
- */
27
- export declare function stderr(...args: readonly unknown[]): void;
28
- /**
29
- * 交互式提示用户输入(从 stdin 读取一行)
30
- *
31
- * @param message - 提示信息
32
- * @returns 用户输入的字符串(已去除首尾空白)
33
- */
34
- export declare function promptInput(message: string): Promise<string>;
35
- //# sourceMappingURL=cli-output.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-output.d.ts","sourceRoot":"","sources":["../../src/utils/cli-output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM;aACjB,GAAG,EAAE,cAAY;aACjB,KAAK,EAAE,cAAY;aACnB,MAAM,EAAE,cAAY;aACpB,IAAI,EAAE,cAAY;aAClB,KAAK,EAAE,WAAS;CACR,CAAC;AAwBX;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAExD;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAExD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBlE"}
@@ -1,82 +0,0 @@
1
- /**
2
- * CLI 输出工具
3
- *
4
- * 按 ADR 0038,禁止 console.*;所有 CLI 用户输出统一通过 process.stdout.write / process.stderr.write。
5
- */
6
- /**
7
- * 输出 ANSI 颜色常量
8
- */
9
- export const COLORS = {
10
- RED: '\x1b[0;31m',
11
- GREEN: '\x1b[0;32m',
12
- YELLOW: '\x1b[1;33m',
13
- BLUE: '\x1b[0;34m',
14
- RESET: '\x1b[0m',
15
- };
16
- /**
17
- * 将多个参数拼接为单行字符串(仿 console.log 行为)
18
- *
19
- * 对象/数组使用 JSON.stringify,其他类型直接 String()。
20
- *
21
- * @param args - 任意参数列表
22
- * @returns 拼接后的字符串
23
- */
24
- function formatArgs(args) {
25
- return args
26
- .map((arg) => {
27
- if (typeof arg === 'string')
28
- return arg;
29
- if (arg instanceof Error)
30
- return arg.message;
31
- try {
32
- return JSON.stringify(arg);
33
- }
34
- catch {
35
- return String(arg);
36
- }
37
- })
38
- .join(' ');
39
- }
40
- /**
41
- * 输出到标准输出(等价 console.log,自动追加换行)
42
- *
43
- * @param args - 任意参数列表
44
- */
45
- export function stdout(...args) {
46
- process.stdout.write(`${formatArgs(args)}\n`);
47
- }
48
- /**
49
- * 输出到标准错误流(等价 console.error,自动追加换行)
50
- *
51
- * @param args - 任意参数列表
52
- */
53
- export function stderr(...args) {
54
- process.stderr.write(`${formatArgs(args)}\n`);
55
- }
56
- /**
57
- * 交互式提示用户输入(从 stdin 读取一行)
58
- *
59
- * @param message - 提示信息
60
- * @returns 用户输入的字符串(已去除首尾空白)
61
- */
62
- export async function promptInput(message) {
63
- process.stdout.write(message);
64
- return new Promise((resolve) => {
65
- /**
66
- * 标准输入流
67
- */
68
- const stdin = process.stdin;
69
- stdin.setEncoding('utf8');
70
- stdin.resume();
71
- /**
72
- * 数据到达时读取首行并关闭
73
- */
74
- const onData = (chunk) => {
75
- stdin.removeListener('data', onData);
76
- stdin.pause();
77
- resolve(chunk.toString().trim());
78
- };
79
- stdin.once('data', onData);
80
- });
81
- }
82
- //# sourceMappingURL=cli-output.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/utils/cli-output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,YAAY;IACjB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,SAAS;CACR,CAAC;AAEX;;;;;;;GAOG;AACH,SAAS,UAAU,CAAC,IAAwB;IAC1C,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACxC,IAAI,GAAG,YAAY,KAAK;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,GAAG,IAAwB;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,GAAG,IAAwB;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B;;WAEG;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,MAAM,EAAE,CAAC;QAEf;;WAEG;QACH,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;YAC9C,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * CLI 输出工具\n *\n * 按 ADR 0038,禁止 console.*;所有 CLI 用户输出统一通过 process.stdout.write / process.stderr.write。\n */\n\n/**\n * 输出 ANSI 颜色常量\n */\nexport const COLORS = {\n RED: '\\x1b[0;31m',\n GREEN: '\\x1b[0;32m',\n YELLOW: '\\x1b[1;33m',\n BLUE: '\\x1b[0;34m',\n RESET: '\\x1b[0m',\n} as const;\n\n/**\n * 将多个参数拼接为单行字符串(仿 console.log 行为)\n *\n * 对象/数组使用 JSON.stringify,其他类型直接 String()。\n *\n * @param args - 任意参数列表\n * @returns 拼接后的字符串\n */\nfunction formatArgs(args: readonly unknown[]): string {\n return args\n .map((arg) => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) return arg.message;\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(' ');\n}\n\n/**\n * 输出到标准输出(等价 console.log,自动追加换行)\n *\n * @param args - 任意参数列表\n */\nexport function stdout(...args: readonly unknown[]): void {\n process.stdout.write(`${formatArgs(args)}\\n`);\n}\n\n/**\n * 输出到标准错误流(等价 console.error,自动追加换行)\n *\n * @param args - 任意参数列表\n */\nexport function stderr(...args: readonly unknown[]): void {\n process.stderr.write(`${formatArgs(args)}\\n`);\n}\n\n/**\n * 交互式提示用户输入(从 stdin 读取一行)\n *\n * @param message - 提示信息\n * @returns 用户输入的字符串(已去除首尾空白)\n */\nexport async function promptInput(message: string): Promise<string> {\n process.stdout.write(message);\n\n return new Promise((resolve) => {\n /**\n * 标准输入流\n */\n const stdin = process.stdin;\n\n stdin.setEncoding('utf8');\n stdin.resume();\n\n /**\n * 数据到达时读取首行并关闭\n */\n const onData = (chunk: Buffer | string): void => {\n stdin.removeListener('data', onData);\n stdin.pause();\n resolve(chunk.toString().trim());\n };\n\n stdin.once('data', onData);\n });\n}\n"]}
@@ -1,27 +0,0 @@
1
- /**
2
- * 占位符解析结果
3
- */
4
- export type ResolvedPlaceholders = Record<string, string>;
5
- /**
6
- * 合并所有来源的占位符
7
- *
8
- * 优先级(后者覆盖前者):
9
- * 1. 内置占位符(DATE、PROJECT_NAME)
10
- * 2. 环境变量 LZI_PLACEHOLDER_*
11
- * 3. lzi.config.ts 的 agentTools.placeholders
12
- *
13
- * @param configPlaceholders - 来自 lzi.config.ts 的占位符
14
- * @returns 合并后的完整占位符表
15
- */
16
- export declare const resolvePlaceholders: (configPlaceholders?: Record<string, string>) => ResolvedPlaceholders;
17
- /**
18
- * 替换内容中的占位符
19
- *
20
- * 将所有 {{KEY}} 替换为对应值。未匹配的占位符原样保留。
21
- *
22
- * @param content - 待替换的内容字符串
23
- * @param placeholders - 占位符键值对
24
- * @returns 替换后的内容字符串
25
- */
26
- export declare const replacePlaceholders: (content: string, placeholders: ResolvedPlaceholders) => string;
27
- //# sourceMappingURL=placeholder-resolver.d.ts.map