@jspg-ai/coding-bb 0.0.3-beta.17 → 0.0.3-beta.19

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.
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * 将AI 编码规范与工作流套件安装到目标项目中。
7
7
  * 支持工具:Claude Code (.claude/rules/)、Qoder (.qoder/rules/)、opencode (.opencode/rules/)、
8
- * WorkBuddy (.workbuddy/rules/)、TraeWork/TraeCode (.trae/rules/)
8
+ * WorkBuddy (.workbuddy/rules/)、TraeWork/TraeCode 中国版 (.trae-cn/rules/)
9
9
  *
10
10
  * 使用方式:
11
11
  * npm install -g @jspg-ai/coding-bb # 首次使用
@@ -1006,12 +1006,15 @@ async function init(targetDir, options = {}) {
1006
1006
  // 选择优先级:调用方预设(cbb setup)> .last-tools(非交互沿用)> 交互选择;无记录才回退全选
1007
1007
  const isNonInteractive = yes || !process.stdin.isTTY;
1008
1008
  let selectedAdapters;
1009
+ let fromRecord = false; // 选择来自预设或 .last-tools 记录(需落盘归一化后的新工具名)
1009
1010
  if (presetAdapters && presetAdapters.length > 0) {
1010
1011
  selectedAdapters = presetAdapters;
1012
+ fromRecord = true;
1011
1013
  } else if (isNonInteractive) {
1012
1014
  const lastTools = readLastTools();
1013
1015
  const reused = lastTools ? adapters.filter(a => lastTools.has(a.name)) : [];
1014
1016
  selectedAdapters = reused.length > 0 ? reused : adapters;
1017
+ fromRecord = reused.length > 0;
1015
1018
  if (yes && process.stdin.isTTY) {
1016
1019
  log(reused.length > 0
1017
1020
  ? `--yes 非交互模式,沿用上次工具选择:${reused.map(a => a.displayName).join('、')}`
@@ -1020,8 +1023,9 @@ async function init(targetDir, options = {}) {
1020
1023
  } else {
1021
1024
  selectedAdapters = await selectTools(isUpgrade);
1022
1025
  }
1023
- // 业务空间根记录本次选择,供 cbb update 等非交互场景沿用
1024
- if (isWorkspaceRoot && presetAdapters && presetAdapters.length > 0) {
1026
+ // 业务空间根记录本次选择,供 cbb update 等非交互场景沿用;
1027
+ // 沿用旧记录时同样落盘,使历史工具名(codebuddy → workbuddy)归一化自愈
1028
+ if (isWorkspaceRoot && fromRecord) {
1025
1029
  saveLastTools(selectedAdapters);
1026
1030
  }
1027
1031
 
@@ -1,16 +1,20 @@
1
1
  /**
2
- * TraeWork / TraeCode 适配器
2
+ * TraeWork / TraeCode 适配器(中国版)
3
3
  *
4
- * 字节 TraeWork 桌面工作台与 TraeCode IDE 共用项目级配置目录 `.trae/`,
5
- * 故一个适配器同时覆盖两者。
4
+ * 字节 TraeWork 桌面工作台与 TraeCode IDE 的中国版共用项目级配置目录
5
+ * `.trae-cn/`(与国际版 `.trae/` 区分),故一个适配器同时覆盖两者。
6
+ * 我司及团队主要使用中国版,beta.19 起不再支持国际版目录分发。
6
7
  *
7
8
  * 与 Claude Code / Qoder 的映射差异:
8
- * - rules:`.trae/rules/*.md`(扁平文件、支持子目录,最多 3 层),frontmatter 用
9
+ * - rules:`.trae-cn/rules/*.md`(扁平文件、支持子目录,最多 3 层),frontmatter 用
9
10
  * `alwaysApply: true`(Qoder 的 `trigger: always_on` 需改写,见 ruleRewrites)
10
- * - skills:`.trae/skills/<name>/SKILL.md`,结构与 Claude 同构
11
- * - commands:`.trae/commands/`,支持目录嵌套(最多 3 层),与 Claude 同风格
11
+ * - skills:`.trae-cn/skills/<name>/SKILL.md`,结构与 Claude 同构
12
+ * - commands:`.trae-cn/commands/`,支持目录嵌套(最多 3 层),与 Claude 同风格
12
13
  * - hooks:`~/.trae-cn/hooks.json`,格式与 Claude 相近但需顶层 `version: 1`
13
14
  * (由 settingsManager 的 hookDialect 处理),事件名/输出字段一致
15
+ *
16
+ * 注意:不设 legacyDirs —— 项目级 `.trae/` 可能是用户自建的国际版配置,
17
+ * cbb 不做目录删除;仅 .gitignore 遗留行在卸载时清理。
14
18
  */
15
19
 
16
20
  const path = require('path');
@@ -18,13 +22,13 @@ const os = require('os');
18
22
 
19
23
  module.exports = {
20
24
  name: 'trae',
21
- displayName: 'TraeWork(TraeCode)',
22
- rulesDir: '.trae/rules',
23
- skillsDir: '.trae/skills',
24
- commandsDir: '.trae/commands/opsx',
25
+ displayName: 'TraeWork(TraeCode·中国版)',
26
+ rulesDir: '.trae-cn/rules',
27
+ skillsDir: '.trae-cn/skills',
28
+ commandsDir: '.trae-cn/commands/opsx',
25
29
  // 规则 frontmatter 改写:Qoder 风格 → Trae 风格
26
30
  ruleRewrites: [['trigger: always_on', 'alwaysApply: true']],
27
- // 用户级 hooks 配置(Trae 用 hooks.json,国内版目录为 ~/.trae-cn/)
31
+ // 用户级 hooks 配置(Trae 中国版用 hooks.json,目录为 ~/.trae-cn/)
28
32
  settingsFile: path.join(os.homedir(), '.trae-cn', 'hooks.json'),
29
33
  settingsFileIsUserLevel: true,
30
34
  hookEvents: ['UserPromptSubmit'],
@@ -25,6 +25,7 @@ const CACHE_TTL = 24 * 60 * 60 * 1000;
25
25
  function getProjectDir() {
26
26
  return process.env.WORKBUDDY_PROJECT_DIR
27
27
  || process.env.CODEBUDDY_PROJECT_DIR
28
+ || process.env.TRAE_CN_PROJECT_DIR
28
29
  || process.env.TRAE_PROJECT_DIR
29
30
  || process.env.QODER_PROJECT_DIR
30
31
  || process.env.CLAUDE_PROJECT_DIR
@@ -34,9 +35,10 @@ function getProjectDir() {
34
35
  /** 通过环境变量检测当前调用方对应的适配器名称 */
35
36
  function detectAdapterName() {
36
37
  // 兼容变量(CLAUDE_PROJECT_DIR)由 Trae / WorkBuddy 一并注入,故优先判定各自专属变量;
37
- // CODEBUDDY_PROJECT_DIR 为 WorkBuddy 沿用的历史变量名,一并识别为 workbuddy
38
+ // CODEBUDDY_PROJECT_DIR 为 WorkBuddy 沿用的历史变量名,一并识别为 workbuddy;
39
+ // TRAE_CN_PROJECT_DIR / TRAE_PROJECT_DIR 为中国版 Trae 的变量名(不同版本注入不一),均识别为 trae
38
40
  if (process.env.WORKBUDDY_PROJECT_DIR || process.env.CODEBUDDY_PROJECT_DIR) return 'workbuddy';
39
- if (process.env.TRAE_PROJECT_DIR) return 'trae';
41
+ if (process.env.TRAE_CN_PROJECT_DIR || process.env.TRAE_PROJECT_DIR) return 'trae';
40
42
  if (process.env.QODER_PROJECT_DIR) return 'qoder';
41
43
  if (process.env.CLAUDE_PROJECT_DIR) return 'claude-code';
42
44
  return null;
@@ -22,7 +22,10 @@ const GITIGNORE_RULES = [
22
22
  // .codebuddy:beta.15 及以前写入的旧目录,不再新增(add: null),但卸载/清理时仍移除其行
23
23
  { add: null, accept: ['.codebuddy', '.codebuddy/'] },
24
24
  { add: '.workbuddy', accept: ['.workbuddy', '.workbuddy/'] },
25
- { add: '.trae', accept: ['.trae', '.trae/'] },
25
+ // .trae:beta.18 及以前(国际版)写入的旧目录,不再新增(add: null,目录可能为用户自建、不清理),
26
+ // 但卸载时仍移除其 gitignore 行
27
+ { add: null, accept: ['.trae', '.trae/'] },
28
+ { add: '.trae-cn', accept: ['.trae-cn', '.trae-cn/'] },
26
29
  ];
27
30
 
28
31
  /** 将 .gitignore 文本拆为行数组。 */
@@ -20,7 +20,7 @@
20
20
  | `.codespace/` | 各关联应用的基准代码(每个应用一个子目录) | `cbb setup` 与 worktree 流程自动 clone / fetch;**勿手动编辑**;已 gitignore,不提交 |
21
21
  | `.worktrees/` | 需求隔离开发区(每个需求一个 `worktree-<需求名>/` 目录) | worktree 命令自动创建 / 清理;不提交(首次执行 worktree 流程时自动加入 .gitignore) |
22
22
  | `openspec/` | OpenSpec 工作流配置(`config.yaml` + `schemas/`) | 由 cbb 安装;变更产物(`openspec/changes/` 等)worktree 模式在**需求工作树内**生成随需求分支提交,轻量模式直接在空间根生成提交 main |
23
- | `.claude/` `.qoder/` `.opencode/` `.workbuddy/` `.trae/` | AI 工具适配目录:编码规范规则、OpenSpec 命令、worktree 管理技能(skill 形态) | 由 cbb 按 setup 时选择的工具安装;已 gitignore,不提交,勿手动改 |
23
+ | `.claude/` `.qoder/` `.opencode/` `.workbuddy/` `.trae-cn/` | AI 工具适配目录:编码规范规则、OpenSpec 命令、worktree 管理技能(skill 形态) | 由 cbb 按 setup 时选择的工具安装;已 gitignore,不提交,勿手动改 |
24
24
  | `.cbb/` | cbb 安装清单与状态(`.managed-by-cbb`、`.last-tools`) | 由 cbb 管理;**勿手动编辑** |
25
25
 
26
26
  ## 典型流程
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jspg-ai/coding-bb",
3
- "version": "0.0.3-beta.17",
3
+ "version": "0.0.3-beta.19",
4
4
  "description": "整合业界热门且高价值的工具、框架与技能,为 AI CODING AGENT 提供统一的行为准则与工作流,辅助开发者将需求高效落地为符合规范的代码",
5
5
  "main": "cbb/lib/install/init.js",
6
6
  "bin": {