@jspg-ai/coding-bb 0.0.3-beta.34 → 0.0.3-beta.36
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.
|
@@ -99,39 +99,6 @@ trigger: always_on
|
|
|
99
99
|
|
|
100
100
|
**检验标准:** 用户从未因"AI 直接改了代码没打招呼"而感到意外。
|
|
101
101
|
|
|
102
|
-
## 8. 业务空间开发模式(双模式,用户选择制)
|
|
103
|
-
|
|
104
|
-
**仅当工作目录是业务空间根(存在 `CBB-WORKSPACE.json` 且 `.git` 为目录)时生效。空间支持两种开发模式,能力对称(都能修改 workspace 内容与应用代码、都强制分支隔离、交付均有 MR 与直合并两条通道,ADR 0007/0008),由用户显式选择,agent 只给推荐不代决。**
|
|
105
|
-
|
|
106
|
-
**模式一 · 本地模式(单线程快改,当前会话就地干):**
|
|
107
|
-
|
|
108
|
-
- 就地切分支:根 + 各涉及应用 `.codespace/<app>/` 同名 `checkout -b`(基线 = `origin/<main>`,经 `cbb-local-mode` 技能执行)
|
|
109
|
-
- 当前会话原地开发,相对路径原样生效;**一次只承载一个需求**(独占本地检出;期间并行新需求走 worktree 模式,互不干扰)
|
|
110
|
-
- 收尾(收尾合并门禁,ADR 0007):`merge-branches.js --check` 判定已合并;未合并须三选一(提 MR / 直合并 `--allow-checkout` / 确认废弃)后方可收尾;各参与仓库 `checkout main && pull && 删分支`
|
|
111
|
-
|
|
112
|
-
**模式二 · worktree 模式(并行 / 隔离):**
|
|
113
|
-
|
|
114
|
-
- `cbb-worktree-init` 建隔离 worktree(AI 配置内容子目录已 junction 就位),**开发会话开进 `.worktrees/worktree-<需求名>/`**,可多需求并行;app 检出收拢在 `<wt>/.codespace/<app>/`——**镜像空间根布局**(`.codespace/<app>/...` 相对路径两模式通用,ADR 0003)
|
|
115
|
-
- 根会话保留作控制面(worktree 生灭、`cbb update` 等空间级操作);**会话形态按工具定,能自动则 agent 亲自做**:OpenCode 桌面端 = agent 自动把会话切进/切出 worktree(`session_move`,上下文保留、不列入用户待办,空间根路径在案供回切);无会话搬移能力的桌面端 = 用户手动切根;CLI/TUI = 新开会话进 worktree
|
|
116
|
-
|
|
117
|
-
**基准与防线(两模式共同,ADR 0002):**
|
|
118
|
-
|
|
119
|
-
- **基准 = `origin/main`(唯一真相源);`.codespace/<app>/` 的检出 = 视图**——本地模式可暂态被需求分支占用,收尾恢复
|
|
120
|
-
- **严禁直接在任何 main 检出上提交载荷**:分支感知 pre-commit hook 机械拦截(workspace 仓库仅放行控制面白名单:`CBB-WORKSPACE.json` / `.gitignore` / `AGENTS.md` / `openspec/config.yaml` / `openspec/schemas/**`;应用仓库 main 全拦;**merge 提交(`MERGE_HEAD` 存在)放行**,见 ADR 0007)——**被拦是防线生效,不是故障**;`--no-verify` 绕过仅限用户显式要求
|
|
121
|
-
- 需求分支推送唯一出口 = `cbb-worktree-push`(init 创建流程零远端操作,lazy push);推送后可选提 MR 或**直接合并**(`merge-branches.js`,主干 / 测试分支,ADR 0008);收尾合并门禁同源(ADR 0007)
|
|
122
|
-
- **收尾合并门禁(ADR 0007)**:两模式收尾均须每仓库"已合并"(`safety-check` / `merge-branches.js --check` 判定);未合并三选一——提 MR / 直合并 / 确认废弃(远程重命名 `<分支>-deprecated`);交付完成自动删本地+远程分支
|
|
123
|
-
- **模式误判零代价**:本地模式中途要并行/隔离 → 重跑 `cbb-worktree-init`(分支已存在自动复用,提交随身带走)
|
|
124
|
-
|
|
125
|
-
**三时刻对齐(agent 必须遵守):**
|
|
126
|
-
|
|
127
|
-
1. **开工前——状态自检**(`cbb-local-mode` 的 `check-local-state.js`):干净态零交互直接开工;**遗留态(别的需求未收尾,任一仓库检出在非主干分支)必须让用户四选一**(继续 / 先收尾 / 升级 worktree / 丢弃),不得自行决定
|
|
128
|
-
2. **开工时——布局确认**:向用户展示参与仓库与分支名,确认后执行
|
|
129
|
-
3. **进行中——插单归属**:用户插入非本需求的改动,先确认归属(并入 / 收尾后处理 / 转 worktree),不得静默混入
|
|
130
|
-
|
|
131
|
-
**读基准代码约定:** 本地模式进行中,工作区是开发态而非基准——要读"main 现状"先确认检出分支,或直接 `git show main:<path>` / `git diff main`;不要默认工作区即基准。
|
|
132
|
-
|
|
133
|
-
**检验标准:** 任何 main 检出上无载荷提交(hook 兜底,git log 可机械审计;merge 提交除外);本地模式收尾后全部仓库回主干且 clean;worktree 模式的变更产物只出现在需求工作树内;需求分支只经 push 技能产生;**未合并且非废弃的分支无法通过收尾(门禁兜底)**。
|
|
134
|
-
|
|
135
102
|
---
|
|
136
103
|
|
|
137
104
|
**这些准则生效的标志:** diff 中不必要的改动减少、不会因过度设计而重写、澄清问题在实现前而非出错后提出。
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
trigger: always_on
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 业务空间开发纪律(双模式,用户选择制)
|
|
6
|
+
|
|
7
|
+
**仅当工作目录是业务空间根(存在 `CBB-WORKSPACE.json` 且 `.git` 为目录)时生效。空间支持两种开发模式,能力对称(都能修改 workspace 内容与应用代码、都强制分支隔离、交付均有 MR 与直合并两条通道,ADR 0007/0008),由用户显式选择,agent 只给推荐不代决。**
|
|
8
|
+
|
|
9
|
+
**模式一 · 本地模式(单线程快改,当前会话就地干):**
|
|
10
|
+
|
|
11
|
+
- 就地切分支:根 + 各涉及应用 `.codespace/<app>/` 同名 `checkout -b`(基线 = `origin/<main>`,经 `cbb-local-mode` 技能执行)
|
|
12
|
+
- 当前会话原地开发,相对路径原样生效;**一次只承载一个需求**(独占本地检出;期间并行新需求走 worktree 模式,互不干扰)
|
|
13
|
+
- 收尾(收尾合并门禁,ADR 0007):`merge-branches.js --check` 判定已合并;未合并须三选一(提 MR / 直合并 `--allow-checkout` / 确认废弃)后方可收尾;各参与仓库 `checkout main && pull && 删分支`
|
|
14
|
+
|
|
15
|
+
**模式二 · worktree 模式(并行 / 隔离):**
|
|
16
|
+
|
|
17
|
+
- `cbb-worktree-init` 建隔离 worktree(AI 配置内容子目录已 junction 就位),**开发会话开进 `.worktrees/worktree-<需求名>/`**,可多需求并行;app 检出收拢在 `<wt>/.codespace/<app>/`——**镜像空间根布局**(`.codespace/<app>/...` 相对路径两模式通用,ADR 0003)
|
|
18
|
+
- 根会话保留作控制面(worktree 生灭、`cbb update` 等空间级操作);**会话形态按工具定,能自动则 agent 亲自做**:OpenCode 桌面端 = agent 自动把会话切进/切出 worktree(`session_move`,上下文保留、不列入用户待办,空间根路径在案供回切);无会话搬移能力的桌面端 = 用户手动切根;CLI/TUI = 新开会话进 worktree
|
|
19
|
+
|
|
20
|
+
**基准与防线(两模式共同,ADR 0002):**
|
|
21
|
+
|
|
22
|
+
- **基准 = `origin/main`(唯一真相源);`.codespace/<app>/` 的检出 = 视图**——本地模式可暂态被需求分支占用,收尾恢复
|
|
23
|
+
- **严禁直接在任何 main 检出上提交载荷**:分支感知 pre-commit hook 机械拦截(workspace 仓库仅放行控制面白名单:`CBB-WORKSPACE.json` / `.gitignore` / `AGENTS.md` / `openspec/config.yaml` / `openspec/schemas/**`;应用仓库 main 全拦;**merge 提交(`MERGE_HEAD` 存在)放行**,见 ADR 0007)——**被拦是防线生效,不是故障**;`--no-verify` 绕过仅限用户显式要求
|
|
24
|
+
- 需求分支推送唯一出口 = `cbb-worktree-push`(init 创建流程零远端操作,lazy push);推送后可选提 MR 或**直接合并**(`merge-branches.js`,主干 / 测试分支,ADR 0008);收尾合并门禁同源(ADR 0007)
|
|
25
|
+
- **收尾合并门禁(ADR 0007)**:两模式收尾均须每仓库"已合并"(`safety-check` / `merge-branches.js --check` 判定);未合并三选一——提 MR / 直合并 / 确认废弃(远程重命名 `<分支>-deprecated`);交付完成自动删本地+远程分支
|
|
26
|
+
- **模式误判零代价**:本地模式中途要并行/隔离 → 重跑 `cbb-worktree-init`(分支已存在自动复用,提交随身带走)
|
|
27
|
+
|
|
28
|
+
**三时刻对齐(agent 必须遵守):**
|
|
29
|
+
|
|
30
|
+
1. **开工前——状态自检**(`cbb-local-mode` 的 `check-local-state.js`):干净态零交互直接开工;**遗留态(别的需求未收尾,任一仓库检出在非主干分支)必须让用户四选一**(继续 / 先收尾 / 升级 worktree / 丢弃),不得自行决定
|
|
31
|
+
2. **开工时——布局确认**:向用户展示参与仓库与分支名,确认后执行
|
|
32
|
+
3. **进行中——插单归属**:用户插入非本需求的改动,先确认归属(并入 / 收尾后处理 / 转 worktree),不得静默混入
|
|
33
|
+
|
|
34
|
+
**读基准代码约定:** 本地模式进行中,工作区是开发态而非基准——要读"main 现状"先确认检出分支,或直接 `git show main:<path>` / `git diff main`;不要默认工作区即基准。
|
|
35
|
+
|
|
36
|
+
**检验标准:** 任何 main 检出上无载荷提交(hook 兜底,git log 可机械审计;merge 提交除外);本地模式收尾后全部仓库回主干且 clean;worktree 模式的变更产物只出现在需求工作树内;需求分支只经 push 技能产生;**未合并且非废弃的分支无法通过收尾(门禁兜底)**。
|
package/cbb/lib/install/init.js
CHANGED
|
@@ -396,7 +396,7 @@ function deployCoreRules(adapter, isUpgrade, managedPaths) {
|
|
|
396
396
|
const rulesDest = path.join(TARGET_DIR, adapter.rulesDir);
|
|
397
397
|
const action = isUpgrade ? '更新' : '安装';
|
|
398
398
|
|
|
399
|
-
const coreRules = ['cbb-coding-rule.md', 'cbb-priority.md', 'cbb-ai-behavior.md'];
|
|
399
|
+
const coreRules = ['cbb-coding-rule.md', 'cbb-priority.md', 'cbb-ai-behavior.md', 'cbb-workspace-discipline.md'];
|
|
400
400
|
|
|
401
401
|
// 确保目标目录存在
|
|
402
402
|
fs.mkdirSync(rulesDest, { recursive: true });
|
|
@@ -1086,13 +1086,14 @@ async function init(targetDir, options = {}) {
|
|
|
1086
1086
|
newPaths.add(`${adapter.rulesDir}/cbb-coding-rule.md`);
|
|
1087
1087
|
newPaths.add(`${adapter.rulesDir}/cbb-priority.md`);
|
|
1088
1088
|
newPaths.add(`${adapter.rulesDir}/cbb-ai-behavior.md`);
|
|
1089
|
+
newPaths.add(`${adapter.rulesDir}/cbb-workspace-discipline.md`);
|
|
1089
1090
|
// opencode:rules glob 登记进 .opencode/opencode.json instructions,并迁移根文件旧登记
|
|
1090
1091
|
if (adapter.instructionsFile) {
|
|
1091
1092
|
injectInstructions(adapter, newPaths, managedPaths);
|
|
1092
1093
|
migrateLegacyInstructions(adapter);
|
|
1093
1094
|
}
|
|
1094
1095
|
});
|
|
1095
|
-
log(`核心规则 → ${selectedAdapters.map(a => a.rulesDir).join(', ')} (
|
|
1096
|
+
log(`核心规则 → ${selectedAdapters.map(a => a.rulesDir).join(', ')} (4 个文件)`, 'success');
|
|
1096
1097
|
|
|
1097
1098
|
// 安装 Skills(支持 skills 的适配器)
|
|
1098
1099
|
const skillsAdapters = selectedAdapters.filter(a => a.skillsDir);
|
|
@@ -1212,15 +1213,6 @@ async function init(targetDir, options = {}) {
|
|
|
1212
1213
|
setupOpenSpec(isUpgrade, managedPaths);
|
|
1213
1214
|
newPaths.add('openspec/config.yaml');
|
|
1214
1215
|
|
|
1215
|
-
// 业务空间根专属:空间导航 AGENTS.md(仅缺失时生成,永不覆盖)+ 旧版导航文案提示
|
|
1216
|
-
let agentsMdState = null;
|
|
1217
|
-
if (isWorkspaceRoot) {
|
|
1218
|
-
agentsMdState = workspaces.ensureWorkspaceAgentsMd(TARGET_DIR);
|
|
1219
|
-
if (workspaces.detectLegacyAgentsMd(TARGET_DIR)) {
|
|
1220
|
-
log('空间根 AGENTS.md 仍是旧版导航文案(单层安装改造前模板)。建议删除该文件后重跑 cbb update 重新生成(仅缺失时生成,不会覆盖你的增补内容)', 'warn');
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
1216
|
// AGENTS.md 规则导航块(声明 agentsNav 的适配器;MiniMax 唯一项目级规则注入通道)。
|
|
1225
1217
|
// 选中 → 注入/更新托管块(块外用户内容不动);未选中(本次 update 取消勾选)→ 精确摘除。
|
|
1226
1218
|
let agentsNavState = null;
|
|
@@ -1366,7 +1358,6 @@ async function init(targetDir, options = {}) {
|
|
|
1366
1358
|
if (hasCommands) extras.push('Commands');
|
|
1367
1359
|
if (hasHooks) extras.push('版本检查 hook');
|
|
1368
1360
|
if (hookSummary) extras.push('提交防线 pre-commit hook');
|
|
1369
|
-
if (agentsMdState === 'created') extras.push('AGENTS.md(空间导航)');
|
|
1370
1361
|
if (agentsNavState === 'created' || agentsNavState === 'updated') extras.push('AGENTS.md(规则导航)');
|
|
1371
1362
|
if (extras.length > 0) {
|
|
1372
1363
|
console.log(` ${extras.join(' / ')} 已配置`);
|
|
@@ -1983,7 +1974,7 @@ async function setupUserLevelComponents(targetAdapters = toolSelection.selectabl
|
|
|
1983
1974
|
* cbb update:就地升级当前目录内容 + 用户级组件。
|
|
1984
1975
|
*
|
|
1985
1976
|
* 单层安装:统一安装器按空间根判定(CBB-WORKSPACE.json + .git 目录)补齐
|
|
1986
|
-
* worktree
|
|
1977
|
+
* worktree 管理入口;旧子集清单升级时由清单差集机制自动补齐全量内容。
|
|
1987
1978
|
*/
|
|
1988
1979
|
async function updateInstalled() {
|
|
1989
1980
|
// 用户级组件沿用本目录的工具选择(.last-tools),无记录或为空才回退全量。
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
* - 加载 + 校验
|
|
9
9
|
* - 归一化 remote URL(兼容 SSH / HTTPS 两种写法)
|
|
10
10
|
* - 检测当前目录是否已拉取指定 workspace 的仓库
|
|
11
|
-
* - 空间种子文件生成(AGENTS.md 空间导航,仅缺失时)
|
|
12
11
|
*/
|
|
13
12
|
|
|
14
13
|
const fs = require('fs');
|
|
@@ -17,7 +16,6 @@ const { execSync } = require('child_process');
|
|
|
17
16
|
|
|
18
17
|
const DEFAULT_CONFIG = 'config/workspaces.json';
|
|
19
18
|
const SAMPLE_CONFIG = 'config/CBB-WORKSPACE.sample.json';
|
|
20
|
-
const SAMPLE_AGENTS_MD = 'config/workspace-agents.sample.md';
|
|
21
19
|
|
|
22
20
|
/**
|
|
23
21
|
* 归一化 git remote URL:提取 "namespace/repo" 形式(去掉 .git 后缀)。
|
|
@@ -168,51 +166,6 @@ function validateWorkspaceConfig(configPath) {
|
|
|
168
166
|
return { valid: true, config: raw };
|
|
169
167
|
}
|
|
170
168
|
|
|
171
|
-
/**
|
|
172
|
-
* 确保业务空间根目录存在 AGENTS.md(空间导航文件,讲清目录职责与协作约定)。
|
|
173
|
-
*
|
|
174
|
-
* 仅缺失时从包内模板复制;已存在(可能含团队自维护内容)一律不覆盖。
|
|
175
|
-
* 该文件不登记安装清单,升级 / 卸载均不触碰。
|
|
176
|
-
*
|
|
177
|
-
* @param {string} targetDir 业务空间根目录
|
|
178
|
-
* @returns {'exists' | 'created'}
|
|
179
|
-
*/
|
|
180
|
-
function ensureWorkspaceAgentsMd(targetDir) {
|
|
181
|
-
const agentsPath = path.join(targetDir, 'AGENTS.md');
|
|
182
|
-
if (fs.existsSync(agentsPath)) return 'exists';
|
|
183
|
-
|
|
184
|
-
const samplePath = path.resolve(__dirname, '..', '..', '..', SAMPLE_AGENTS_MD);
|
|
185
|
-
fs.copyFileSync(samplePath, agentsPath);
|
|
186
|
-
return 'created';
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// 旧版空间导航模板的特征语句(命中即提示用户删除后重跑 cbb update 重新生成;
|
|
190
|
-
// 该文件归用户所有、永不覆盖)。分两代:
|
|
191
|
-
// - 0.0.3 单层安装改造前:前两条
|
|
192
|
-
// - 双模式重构前(≤0.0.3-beta.21,worktree 默认 + 轻量模式):后两条
|
|
193
|
-
const LEGACY_AGENTS_MD_MARKERS = [
|
|
194
|
-
'故意不含编码规范',
|
|
195
|
-
'自动安装沙箱内的编码规范',
|
|
196
|
-
'轻量模式',
|
|
197
|
-
'AI 会话始终停在空间根',
|
|
198
|
-
];
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* 检测空间根 AGENTS.md 是否仍为旧版导航文案(命中任一特征语句即为旧版)。
|
|
202
|
-
* 仅用于安装时打印提示,不修改文件。
|
|
203
|
-
* @returns {boolean}
|
|
204
|
-
*/
|
|
205
|
-
function detectLegacyAgentsMd(targetDir) {
|
|
206
|
-
const agentsPath = path.join(targetDir, 'AGENTS.md');
|
|
207
|
-
if (!fs.existsSync(agentsPath)) return false;
|
|
208
|
-
try {
|
|
209
|
-
const content = fs.readFileSync(agentsPath, 'utf-8');
|
|
210
|
-
return LEGACY_AGENTS_MD_MARKERS.some(m => content.includes(m));
|
|
211
|
-
} catch (_) {
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
169
|
/**
|
|
217
170
|
* 在指定目录执行 `git remote -v`,解析出 [{ name, url }] 列表。
|
|
218
171
|
* 任何异常静默返回空数组,便于上层用 state 机判定。
|
|
@@ -306,13 +259,10 @@ function findSampleApps(apps) {
|
|
|
306
259
|
module.exports = {
|
|
307
260
|
DEFAULT_CONFIG,
|
|
308
261
|
SAMPLE_CONFIG,
|
|
309
|
-
SAMPLE_AGENTS_MD,
|
|
310
262
|
normalizeRepoUrl,
|
|
311
263
|
matchesConfiguredRepo,
|
|
312
264
|
loadWorkspaces,
|
|
313
265
|
validateWorkspaceConfig,
|
|
314
|
-
ensureWorkspaceAgentsMd,
|
|
315
|
-
detectLegacyAgentsMd,
|
|
316
266
|
readGitRemotes,
|
|
317
267
|
detectRepo,
|
|
318
268
|
extractRepoBasename,
|
package/package.json
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# AGENTS.md
|
|
2
|
-
|
|
3
|
-
本空间由 `@jspg-ai/coding-bb` 初始化(升级用 `cbb update`)。
|
|
4
|
-
|
|
5
|
-
- **行为准则与开发纪律**(双模式、基准 = `origin/main`、提交防线、推送出口):见你所用 AI 工具规则目录中的 `cbb-ai-behavior.md`——各工具自动加载;未适配的工具可任选一处直接读,如 `.claude/rules/cbb-ai-behavior.md` 或 `.qoder/rules/` 下同名文件。
|
|
6
|
-
- **空间事实**:关联应用清单(增减应用即编辑它)见 `CBB-WORKSPACE.json`;目录职责建议维护在你自己的 `README.md`。
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
本文件由 `@jspg-ai/coding-bb` 生成(仅缺失时写入,之后不会覆盖或删除,可自由增补团队约定)。
|