@jspg-ai/coding-bb 0.0.3-beta.15 → 0.0.3-beta.16
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,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WorkBuddy / CodeBuddy 适配器
|
|
3
3
|
*
|
|
4
|
-
* 腾讯 WorkBuddy
|
|
5
|
-
*
|
|
4
|
+
* 腾讯 WorkBuddy 桌面工作台的项目级配置目录为 `.workbuddy/`(实测:skill 只有
|
|
5
|
+
* 放在 `.workbuddy/skills/` 才生效;旧版假设「与 CodeBuddy 共用 .codebuddy/」不成立)。
|
|
6
|
+
* 0.0.3-beta.16 起目录与用户级 settings 全部切到 `.workbuddy`,`.codebuddy` 作为
|
|
7
|
+
* legacy 由安装流程迁移清理(legacyDirs / legacySettingsFile)。
|
|
6
8
|
*
|
|
7
9
|
* 与 Claude Code / Qoder 的映射差异:
|
|
8
|
-
* - rules:`.
|
|
10
|
+
* - rules:`.workbuddy/rules/*.md`(扁平文件、递归加载),frontmatter 用
|
|
9
11
|
* `alwaysApply: true`(Qoder 的 `trigger: always_on` 需改写,见 ruleRewrites)
|
|
10
|
-
* - skills:`.
|
|
11
|
-
* - commands:`.
|
|
12
|
-
* - hooks
|
|
12
|
+
* - skills:`.workbuddy/skills/<name>/SKILL.md`,结构与 Claude 同构
|
|
13
|
+
* - commands:`.workbuddy/commands/`,支持目录嵌套(`/group:command`),与 Claude 同风格
|
|
14
|
+
* - hooks:兼容 Claude Code Hooks 规范,settings 结构一致,直接复用 settingsManager
|
|
13
15
|
*/
|
|
14
16
|
|
|
15
17
|
const path = require('path');
|
|
@@ -18,13 +20,16 @@ const os = require('os');
|
|
|
18
20
|
module.exports = {
|
|
19
21
|
name: 'codebuddy',
|
|
20
22
|
displayName: 'WorkBuddy(CodeBuddy)',
|
|
21
|
-
rulesDir: '.
|
|
22
|
-
skillsDir: '.
|
|
23
|
-
commandsDir: '.
|
|
23
|
+
rulesDir: '.workbuddy/rules',
|
|
24
|
+
skillsDir: '.workbuddy/skills',
|
|
25
|
+
commandsDir: '.workbuddy/commands/opsx',
|
|
24
26
|
// 规则 frontmatter 改写:Qoder 风格 → CodeBuddy 风格
|
|
25
27
|
ruleRewrites: [['trigger: always_on', 'alwaysApply: true']],
|
|
26
28
|
// 用户级 settings,写入全局生效,不污染项目目录
|
|
27
|
-
settingsFile: path.join(os.homedir(), '.
|
|
29
|
+
settingsFile: path.join(os.homedir(), '.workbuddy', 'settings.json'),
|
|
28
30
|
settingsFileIsUserLevel: true,
|
|
29
31
|
hookEvents: ['UserPromptSubmit'],
|
|
32
|
+
// 旧版目录/文件(beta.15 及以前写入 .codebuddy):安装时迁移清理
|
|
33
|
+
legacyDirs: ['.codebuddy'],
|
|
34
|
+
legacySettingsFile: path.join(os.homedir(), '.codebuddy', 'settings.json'),
|
|
30
35
|
};
|
package/cbb/lib/install/init.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* 将AI 编码规范与工作流套件安装到目标项目中。
|
|
7
7
|
* 支持工具:Claude Code (.claude/rules/)、Qoder (.qoder/rules/)、opencode (.opencode/rules/)、
|
|
8
|
-
* WorkBuddy/CodeBuddy (.
|
|
8
|
+
* WorkBuddy/CodeBuddy (.workbuddy/rules/)、TraeWork/TraeCode (.trae/rules/)
|
|
9
9
|
*
|
|
10
10
|
* 使用方式:
|
|
11
11
|
* npm install -g @jspg-ai/coding-bb # 首次使用
|
|
@@ -94,6 +94,16 @@ function hookOpts(adapter) {
|
|
|
94
94
|
return adapter.hookDialect ? { dialect: adapter.hookDialect } : {};
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
+
/**
|
|
98
|
+
* 迁移清理:移除本包写在旧用户级 settings 里的 hook(如 WorkBuddy 适配修正:
|
|
99
|
+
* ~/.codebuddy/settings.json → ~/.workbuddy/settings.json)。
|
|
100
|
+
* removeHooks 只删 _managedBy: cbb 标记的条目,文件清空则删除。返回 true 表示有改动。
|
|
101
|
+
*/
|
|
102
|
+
function cleanLegacySettings(adapter) {
|
|
103
|
+
if (!adapter.legacySettingsFile || !adapter.hookEvents) return false;
|
|
104
|
+
return settingsManager.removeHooks(adapter.legacySettingsFile, adapter.hookEvents, hookOpts(adapter));
|
|
105
|
+
}
|
|
106
|
+
|
|
97
107
|
// 清单驱动的文件清理决策(保护用户文档 CLAUDE.md / AGENTS.md 等)
|
|
98
108
|
const { pathsToDelete, protectedKeptPaths } = require('./cleanup');
|
|
99
109
|
|
|
@@ -1153,6 +1163,10 @@ async function init(targetDir, options = {}) {
|
|
|
1153
1163
|
if (settingsManager.removeLegacyHooks(settingsPath, hookOpts(adapter))) {
|
|
1154
1164
|
log(`清理 ${adapter.displayName} 遗留的 SessionStart hook`, 'success');
|
|
1155
1165
|
}
|
|
1166
|
+
// 迁移:清理旧用户级 settings(如 ~/.codebuddy → ~/.workbuddy)
|
|
1167
|
+
if (cleanLegacySettings(adapter)) {
|
|
1168
|
+
log(`迁移清理旧用户级配置 ${adapter.legacySettingsFile}`, 'success');
|
|
1169
|
+
}
|
|
1156
1170
|
if (!adapter.settingsFileIsUserLevel) newPaths.add(adapter.settingsFile);
|
|
1157
1171
|
});
|
|
1158
1172
|
log(`版本检查 hook → ${hookAdapters.map(a => a.displayName).join(', ')} (${hookAdapters[0].hookEvents.join(', ')})`, 'success');
|
|
@@ -1776,6 +1790,7 @@ async function setupUserLevelComponents(targetAdapters = adapters) {
|
|
|
1776
1790
|
hookAdapters.forEach(adapter => {
|
|
1777
1791
|
settingsManager.addHooks(adapter.settingsFile, command, adapter.hookEvents, hookOpts(adapter));
|
|
1778
1792
|
settingsManager.removeLegacyHooks(adapter.settingsFile, hookOpts(adapter));
|
|
1793
|
+
cleanLegacySettings(adapter);
|
|
1779
1794
|
});
|
|
1780
1795
|
summaryParts.push(`版本检查 hook → ${hookAdapters.map(a => a.displayName).join('、')}`);
|
|
1781
1796
|
}
|
|
@@ -1894,6 +1909,9 @@ async function uninstallUserLevelComponents() {
|
|
|
1894
1909
|
if (settingsManager.removeHooks(adapter.settingsFile, adapter.hookEvents, hookOpts(adapter))) {
|
|
1895
1910
|
log(`${adapter.settingsFile}: 移除版本检查 hook,保留用户配置`, 'success');
|
|
1896
1911
|
}
|
|
1912
|
+
if (cleanLegacySettings(adapter)) {
|
|
1913
|
+
log(`${adapter.legacySettingsFile}: 移除版本检查 hook(旧路径),保留用户配置`, 'success');
|
|
1914
|
+
}
|
|
1897
1915
|
});
|
|
1898
1916
|
|
|
1899
1917
|
removePath(USER_MANIFEST_FILE);
|
|
@@ -1922,7 +1940,7 @@ async function uninstall() {
|
|
|
1922
1940
|
// 是否同时卸载用户级组件(工具 skills + 版本检查 hook,作用于 ~/.claude 等用户目录)
|
|
1923
1941
|
let removeUserLevel = false;
|
|
1924
1942
|
if (fs.existsSync(USER_MANIFEST_FILE)) {
|
|
1925
|
-
const answerUser = await ask('是否同时卸载用户级组件(~/.claude、~/.qoder、~/.
|
|
1943
|
+
const answerUser = await ask('是否同时卸载用户级组件(~/.claude、~/.qoder、~/.workbuddy、~/.trae-cn 的版本检查 hook)?(y/N): ');
|
|
1926
1944
|
removeUserLevel = answerUser.toLowerCase() === 'y' || answerUser.toLowerCase() === 'yes';
|
|
1927
1945
|
}
|
|
1928
1946
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 背景 bug(0.0.3-beta.15 修复):旧版 decideUpgradeIfInstalled 只比较
|
|
7
7
|
* 「已装版本 vs 当前包版本」,版本一致即 skip——导致「空间已是当前版本 +
|
|
8
8
|
* 本次新选了工具(如 WorkBuddy)」被整体跳过,新工具的空间级目录
|
|
9
|
-
* (.
|
|
9
|
+
* (.workbuddy/ 等)永不生成,.last-tools 也不更新。
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
const fs = require('fs');
|
|
@@ -20,6 +20,7 @@ const GITIGNORE_RULES = [
|
|
|
20
20
|
{ add: '.codespace/', accept: ['.codespace/', '.codespace'] },
|
|
21
21
|
{ add: '.opencode', accept: ['.opencode', '.opencode/'] },
|
|
22
22
|
{ add: '.codebuddy', accept: ['.codebuddy', '.codebuddy/'] },
|
|
23
|
+
{ add: '.workbuddy', accept: ['.workbuddy', '.workbuddy/'] },
|
|
23
24
|
{ add: '.trae', accept: ['.trae', '.trae/'] },
|
|
24
25
|
];
|
|
25
26
|
|
|
@@ -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/` `.
|
|
23
|
+
| `.claude/` `.qoder/` `.opencode/` `.workbuddy/` `.trae/` | AI 工具适配目录:编码规范规则、OpenSpec 命令、worktree 管理技能(skill 形态) | 由 cbb 按 setup 时选择的工具安装;已 gitignore,不提交,勿手动改 |
|
|
24
24
|
| `.cbb/` | cbb 安装清单与状态(`.managed-by-cbb`、`.last-tools`) | 由 cbb 管理;**勿手动编辑** |
|
|
25
25
|
|
|
26
26
|
## 典型流程
|