@jspg-ai/coding-bb 0.0.3-beta.32 → 0.0.3-beta.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cbb/dev-standards/rules/cbb-ai-behavior.md +5 -4
- package/cbb/lib/utils/githook.js +6 -2
- package/cbb/worktrees/_shared/scripts/check-unarchived.js +77 -0
- package/cbb/worktrees/_shared/scripts/deprecate-branches.js +119 -0
- package/cbb/worktrees/_shared/scripts/install-git-hook.js +1 -1
- package/cbb/worktrees/_shared/scripts/merge-branches.js +469 -0
- package/cbb/worktrees/skills/cbb-local-mode/SKILL.md +38 -6
- package/cbb/worktrees/skills/cbb-local-mode/scripts/deprecate-branches.js +119 -0
- package/cbb/worktrees/skills/cbb-local-mode/scripts/install-git-hook.js +1 -1
- package/cbb/worktrees/skills/cbb-local-mode/scripts/merge-branches.js +469 -0
- package/cbb/worktrees/skills/cbb-worktree-close/SKILL.md +86 -51
- package/cbb/worktrees/skills/cbb-worktree-close/scripts/check-unarchived.js +3 -1
- package/cbb/worktrees/skills/cbb-worktree-close/scripts/delete-branches.js +4 -2
- package/cbb/worktrees/skills/cbb-worktree-close/scripts/deprecate-branches.js +119 -0
- package/cbb/worktrees/skills/cbb-worktree-close/scripts/merge-branches.js +469 -0
- package/cbb/worktrees/skills/cbb-worktree-close/scripts/safety-check.js +4 -2
- package/cbb/worktrees/skills/cbb-worktree-init/scripts/install-git-hook.js +1 -1
- package/cbb/worktrees/skills/cbb-worktree-push/SKILL.md +143 -20
- package/cbb/worktrees/skills/cbb-worktree-push/scripts/check-unarchived.js +77 -0
- package/config/openspec/schemas/spec-driven/schema.yaml +1 -0
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cbb-worktree-push
|
|
3
|
-
description: "提交并推送当前需求的所有关联仓库(跨 worktree
|
|
3
|
+
description: "提交并推送当前需求的所有关联仓库(跨 worktree 批量),推送后提供交付选择:提 MR(预填链接)或由 agent 直接合并到目标分支(主干/测试分支,ADR 0008)。触发:用户说'提交'/'commit'/'push'/'推送'/'提交并push'/'推到远端'/'提MR'/'提合并请求'/'merge request';用户在 .worktrees/worktree-<需求名>/ 下工作要求批量推送;apply 完成后准备推送所有 worktree;close-worktree 前需要先推送未提交改动。注意:本技能会先识别场景——不在 cbb 工作空间时降级为普通单仓库提交推送。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Push Worktrees(跨平台脚本化版本 v2.0)
|
|
@@ -15,7 +15,7 @@ description: "提交并推送当前需求的所有关联仓库(跨 worktree
|
|
|
15
15
|
|
|
16
16
|
- 本技能的所有原子操作封装为 `scripts/*.js` Node.js 脚本,**跨平台执行**
|
|
17
17
|
- **两阶段**:先 `commit-worktrees.js` 提交所有 dirty 仓库,再 `push-worktrees.js` 推送所有 worktree 仓库。两个脚本独立退出码,AI agent 区分阶段
|
|
18
|
-
- **push
|
|
18
|
+
- **push 后交付选择(Step 7,ADR 0008)**:三选一——提 MR(`make-mr-urls.js` 生成预填链接,可自动开浏览器;只生成链接,提交/评审/合并由人在平台完成,不触碰凭据)/ **直接合并**(`merge-branches.js` 把需求分支合入目标分支并推送;需经归档前置、提交检查、目标选择与风险确认)/ 暂不处理
|
|
19
19
|
- 复用 `cbb-worktree-push/scripts/push-core.js` 的 `pushSingle` / `classifyError` —— 与 `cbb-worktree-init` 的 `push-branches.js` 行为完全一致,错误码契约统一
|
|
20
20
|
- `find-workspace-root.js` / `find-target-worktree.js` 为共享脚本:源仓库真源在 `cbb/worktrees/_shared/scripts/`,部署后位于本 skill 的 `scripts/` 下,与 `cbb-worktree-init` / `cbb-worktree-close` 逻辑完全一致
|
|
21
21
|
- **本技能支持两层执行位置**(与 `cbb-worktree-close` 对称):
|
|
@@ -216,21 +216,25 @@ node "<skill_dir>/scripts/push-worktrees.js" "<ws_root>/.worktrees/worktree-<bra
|
|
|
216
216
|
|
|
217
217
|
---
|
|
218
218
|
|
|
219
|
-
## Step 7
|
|
219
|
+
## Step 7:交付选择(MR / 直接合并 / 暂不处理)
|
|
220
220
|
|
|
221
|
-
Step 5 的 `PUSH_RESULT` 中至少一个仓库为 `pushed` / `skipped`(feature 分支已在远端)时,用 `AskUserQuestion
|
|
221
|
+
Step 5 的 `PUSH_RESULT` 中至少一个仓库为 `pushed` / `skipped`(feature 分支已在远端)时,用 `AskUserQuestion` 提案。**动作与目标解耦**(ADR 0008):
|
|
222
222
|
|
|
223
223
|
```
|
|
224
|
-
|
|
225
|
-
[提 MR
|
|
226
|
-
[
|
|
227
|
-
[
|
|
224
|
+
推送完成。接下来怎么交付?
|
|
225
|
+
[提 MR](推荐) 生成预填的合并请求链接,由人工在浏览器合入
|
|
226
|
+
[直接合并] 由 agent 直接合并到目标分支并推送远端(不经过 MR)
|
|
227
|
+
[暂不处理] 结束本步,分支已推到远端
|
|
228
228
|
```
|
|
229
229
|
|
|
230
|
-
|
|
230
|
+
### 7.1 目标分支候选(A / B 两出口共用)
|
|
231
231
|
|
|
232
|
-
|
|
233
|
-
|
|
232
|
+
`git branch -r` 列出**现场实际存在**的候选(主干 / dev / test / release-* 等),交互式让用户指定(**禁止 AI 代决**)。全仓库统一用一个目标分支;远端不存在该分支的仓库自动跳过。
|
|
233
|
+
|
|
234
|
+
### 7.2 出口 A · 提 MR
|
|
235
|
+
|
|
236
|
+
1. 确定目标分支(见 7.1)
|
|
237
|
+
2. 生成链接:
|
|
234
238
|
|
|
235
239
|
```bash
|
|
236
240
|
node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --open
|
|
@@ -245,7 +249,116 @@ node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --o
|
|
|
245
249
|
|
|
246
250
|
> 平台识别:`github.com` → PR compare、`gitee.com` → compare、**其余默认 GitLab**(企业自建主流);误判用 `--platform` 覆盖。
|
|
247
251
|
|
|
248
|
-
3. **提 MR 后提醒用户后续链路**:测试环境部署 → 用户验收 → 验收通过后 `/opsx:archive` → 正式分支合并走公司发布流程 → 最后 `cbb-worktree-close
|
|
252
|
+
3. **提 MR 后提醒用户后续链路**:测试环境部署 → 用户验收 → 验收通过后 `/opsx:archive` → 正式分支合并走公司发布流程 → 最后 `cbb-worktree-close`(其收尾合并门禁会校验主干合并状态,未合并且非废弃不放行;见 ADR 0007)
|
|
253
|
+
|
|
254
|
+
### 7.3 出口 B · 直接合并(ADR 0008)
|
|
255
|
+
|
|
256
|
+
**前置顺序:先归档(仅目标 = 主干)、后提交检查;两步都满足才可合并。**
|
|
257
|
+
|
|
258
|
+
#### B1 归档前置(仅当目标 = 主干)
|
|
259
|
+
|
|
260
|
+
目标为主干时**合并前必须已归档**;检查(共享脚本):
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
node "<skill_dir>/scripts/check-unarchived.js" "<ws_root>" "<branch>"
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
- 末行 `UNARCHIVED_RESULT` 的 `changes` 为空 → 通过,进 B2
|
|
267
|
+
- 非空 → `AskUserQuestion`:
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
⚠️ 检测到未归档 change:<名称>
|
|
271
|
+
合并进主干前必须已归档(/opsx:archive)。
|
|
272
|
+
|
|
273
|
+
[去归档](推荐) 立即执行归档流程;归档产物落盘后自动回到本步
|
|
274
|
+
[改为提 MR] 转出口 A
|
|
275
|
+
[中止] 结束本步
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
选「去归档」→ agent 执行归档流程(`/opsx:archive`,产物落 `openspec/changes/archive/`)→ 进入 B2(归档产物属未提交改动,由 B2 处理)。
|
|
279
|
+
|
|
280
|
+
> 目标为测试 / 中间分支时**不要求归档**(归档仍在验收通过后执行);「已提交」检查两类目标都适用。
|
|
281
|
+
|
|
282
|
+
#### B2 提交检查(通用)
|
|
283
|
+
|
|
284
|
+
逐仓库 `git status --porcelain`。存在未提交改动(含归档产物)时:
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
⚠️ 检测到未提交改动:
|
|
288
|
+
- workspace: 2 个文件
|
|
289
|
+
|
|
290
|
+
是否提交并推送后再继续合并?
|
|
291
|
+
[提交并推送](推荐) 走提交推送流程,完成后自动回到合并
|
|
292
|
+
[中止] 我先手动处理
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
- 选「提交并推送」→ 执行本技能 Step 2 → Step 5(dry-run 预览 → 批量 commit → 批量 push)→ **直接回到 B3**(不再重复动作选择,避免递归)
|
|
296
|
+
- 选「中止」→ 结束本步(**前置不满足,不予合并**)
|
|
297
|
+
|
|
298
|
+
#### B3 目标分支确认
|
|
299
|
+
|
|
300
|
+
从 7.1 的候选里选定,明确显示主干项:
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
请选择直接合并的目标分支:
|
|
304
|
+
[主干 main] 合并进正式主干(跳过测试与验收)
|
|
305
|
+
[dev] / [test] / … 合并进中间分支(验收后主干仍需另行交付)
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
#### B4 风险提醒 + 确认(必须显式确认)
|
|
309
|
+
|
|
310
|
+
目标 = 主干(强提醒):
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
⚠️ 你选择直接合并到主干 <main> —— 将跳过:
|
|
314
|
+
• 测试环境部署与用户验收
|
|
315
|
+
• 公司正式发布流程
|
|
316
|
+
• MR 评审记录(平台无评审痕迹)
|
|
317
|
+
|
|
318
|
+
合并后内容立即进入主干并推送远端,撤回只能靠 revert 补救。
|
|
319
|
+
|
|
320
|
+
[确认合并] 我已知晓,执行合并
|
|
321
|
+
[改为提 MR] 转出口 A
|
|
322
|
+
[中止] 结束本步
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
目标 = 测试 / 中间分支(弱提醒):
|
|
326
|
+
|
|
327
|
+
```
|
|
328
|
+
⚠️ 你选择直接合并到 <dev> —— 将跳过 MR 评审(平台无记录);
|
|
329
|
+
验收通过后主干仍需另行交付。
|
|
330
|
+
|
|
331
|
+
[确认合并] / [改为提 MR] / [中止]
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
#### B5 执行与报告
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
node "<skill_dir>/scripts/merge-branches.js" "<ws_root>" "<branch>" --apps "<app1,app2>" --target "<目标>"
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
- 缺省 / `--target` 等于探测主干 → 主干快路径(本地主干检出上 `merge --no-ff` → push)
|
|
341
|
+
- `--target` 为非主干分支 → **临时 worktree** 合并(基于 `origin/<目标>`,不动用户检出)
|
|
342
|
+
|
|
343
|
+
**解读末行 `MERGE_RESULT`**:
|
|
344
|
+
- 退出码 0 → 交付完成
|
|
345
|
+
- `need-mr`(目标分支受保护)→ 报明细并**转出口 A**
|
|
346
|
+
- `failed`(含 `merge-failed` / `push-failed`)→ 报明细,修复后重跑(幂等)
|
|
347
|
+
|
|
348
|
+
报告形态:
|
|
349
|
+
|
|
350
|
+
```
|
|
351
|
+
✅ 直接合并完成
|
|
352
|
+
目标分支:main
|
|
353
|
+
workspace: merged(merge --no-ff + push origin/main)
|
|
354
|
+
jspg-cvat: merged
|
|
355
|
+
jspg-cvat-model-factory: skipped(远端无该分支)
|
|
356
|
+
|
|
357
|
+
后续:主干已交付 → cbb-worktree-close 收尾将直接放行并自动删分支;
|
|
358
|
+
中间分支已交付(dev)→ 验收通过后主干仍需另行交付
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
> **直接合并成功后不删分支**(ADR 0008):分支与 worktree 保留(验收可能需修复),删除由收尾门禁(`cbb-worktree-close`)统一执行。
|
|
249
362
|
|
|
250
363
|
---
|
|
251
364
|
|
|
@@ -263,7 +376,7 @@ node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --o
|
|
|
263
376
|
workspace: ✅ origin/<branch>
|
|
264
377
|
ep-foo-app: ✅ origin/<branch>
|
|
265
378
|
ep-bar-app: ⚠️ 远程分支已存在(需用户决策 → 已关联)
|
|
266
|
-
后续:Step 7
|
|
379
|
+
后续:Step 7 交付选择(提 MR 到测试分支 → 部署验收 → /opsx:archive → 正式发布;或直接合并到主干/测试分支,ADR 0008)→ 最后 cbb-worktree-close
|
|
267
380
|
```
|
|
268
381
|
|
|
269
382
|
---
|
|
@@ -285,7 +398,9 @@ node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --o
|
|
|
285
398
|
| 远程分支已存在 | push 退出码 2,AI 输出元信息后由用户决策(关联/终止) |
|
|
286
399
|
| push 失败(SSH/HTTPS/网络/保护) | push 退出码 2,AI 按错误码分类处理,阻塞并询问用户 |
|
|
287
400
|
| close-worktree 前调用 | 先调本 skill 把 ahead 推送完,避免 close 时丢提交 |
|
|
288
|
-
| push 完成后 | Step 7 MR
|
|
401
|
+
| push 完成后 | Step 7 交付选择:提 MR → make-mr-urls.js 生成预填链接 + 开浏览器(不代合并);直接合并 → B1 归档(仅主干)→ B2 提交检查 → B3 目标 → B4 风险确认 → merge-branches.js 执行;暂不处理 |
|
|
402
|
+
| 直合并前置 | 目标=主干必须先归档(check-unarchived.js);有未提交改动则询问后走本技能提交推送流程;未确认不合并 |
|
|
403
|
+
| 直合并后 | **不删分支**(ADR 0008),删除归 cbb-worktree-close 收尾门禁 |
|
|
289
404
|
| MR 目标分支 | 交互式:`git branch -r` 列主干候选由用户指定,全仓库统一;缺该分支的仓库自动跳过(no-target) |
|
|
290
405
|
| MR 平台误判 | 非 github.com/gitee.com 默认按 GitLab 拼 URL;有误判用 `--platform gitlab\|github\|gitee` 强制 |
|
|
291
406
|
| --dry-run | 任何时候想预览将要 commit 的内容时使用,不实际修改任何东西 |
|
|
@@ -311,13 +426,13 @@ node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --o
|
|
|
311
426
|
|
|
312
427
|
### close-worktree 前忘记先 push
|
|
313
428
|
|
|
314
|
-
- **问题:** 调 close-worktree 时,
|
|
315
|
-
- **修复:** close-worktree/SKILL.md Step 3.
|
|
429
|
+
- **问题:** 调 close-worktree 时,safety-check 检测到 ahead 提交 → 询问用户「先推送 / 继续 / 中止」;用户没意识到要调本 skill
|
|
430
|
+
- **修复:** close-worktree/SKILL.md Step 3.3 决策点已提示「先推送」选项;本 skill 是该选项的执行入口。走「直合并」出口时,ahead 提交会随合并一并推送到主干
|
|
316
431
|
|
|
317
432
|
### apply 完成后不调 push 直接 close
|
|
318
433
|
|
|
319
|
-
- **问题:** apply 实现完 → 用户关掉 IDE → 调 close-worktree →
|
|
320
|
-
- **修复:**
|
|
434
|
+
- **问题:** apply 实现完 → 用户关掉 IDE → 调 close-worktree → 收尾合并门禁触发(ADR 0007),未合并且非废弃不放行
|
|
435
|
+
- **修复:** 走门禁三选一:提 MR(先经本 skill 推送 feature)或直合并(ahead 提交随合并推送到主干)
|
|
321
436
|
|
|
322
437
|
### 多仓库硬塞同一条 commit 信息
|
|
323
438
|
|
|
@@ -346,7 +461,10 @@ node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --o
|
|
|
346
461
|
- 远程分支已存在时脚本自动 set-upstream-to
|
|
347
462
|
- AI 询问关联选项前不输出 commit 元信息
|
|
348
463
|
- 运行环境 node 不可用时强行继续 → 改为 fail-fast 提示用户
|
|
349
|
-
-
|
|
464
|
+
- MR 出口下代为合并 / 触碰平台凭据 → MR 出口只生成预填链接,提交与合并由人在平台完成。**直合并只能经 Step 7 出口 B 的 `merge-branches.js` 执行(ADR 0008),且必须先过 B1 归档前置、B2 提交检查、B4 风险确认**
|
|
465
|
+
- 直合并跳过风险提醒直接执行 → 目标为主干时必须强提醒并显式确认;**未经确认不得合并**
|
|
466
|
+
- 目标为主干但未归档就合并 → 必须先归档(B1)
|
|
467
|
+
- 直合并成功后擅自删除分支 → 分支保留,删除归收尾门禁(ADR 0007)
|
|
350
468
|
- MR 目标分支由 AI 猜测代决 → 必须列候选让用户指定
|
|
351
469
|
|
|
352
470
|
**必须执行**
|
|
@@ -360,7 +478,9 @@ node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --o
|
|
|
360
478
|
- 多个仓库改动语义不同时必须逐仓库分别生成(`--per-repo`),禁止硬塞同一条
|
|
361
479
|
- commit-worktrees / push-worktrees 退出码 2 时必须阻塞流程
|
|
362
480
|
- 远程分支已存在时 AI 必须先输出 commit 元信息再询问
|
|
363
|
-
- push 成功后必须走 Step 7
|
|
481
|
+
- push 成功后必须走 Step 7 交付选择(AskUserQuestion 固定选项;用户选"暂不处理"则正常结束)
|
|
482
|
+
- 直合并严格按 B1(归档,仅主干)→ B2(提交检查)→ B3(目标)→ B4(确认)→ B5(执行)顺序;前置不满足不予合并
|
|
483
|
+
- 直合并目标为中间分支时跳过 B1(不要求归档);两类目标都必须过 B2
|
|
364
484
|
|
|
365
485
|
---
|
|
366
486
|
|
|
@@ -374,3 +494,6 @@ node "<skill_dir>/scripts/make-mr-urls.js" "<ws_root>" "<branch>" "<target>" --o
|
|
|
374
494
|
| `push-worktrees.js` | 批量 push(复用 push-core 错误归类) | ws_root, branch(或 wt_path) | 0/1/2 |
|
|
375
495
|
| `make-mr-urls.js` | 生成预填 MR/PR 创建链接(平台识别 + 远端校验 + diff 判定 + `--open` 开浏览器) | ws_root, branch, target(或 wt_path, target), --platform, --open | 0/1/2 |
|
|
376
496
|
| `push-core.js` | 推送核心(classifyError / pushSingle / collectRemoteMetadata,共享脚本,源仓库真源在 `_shared/scripts/`) | (共享模块) | - |
|
|
497
|
+
| `check-unarchived.js` | 未归档 change 检查(Step 7 直合并的归档前置,共享脚本) | ws_root, branch | 0/1 |
|
|
498
|
+
| `merge-branches.js` | 直合并(Step 7 出口 B / 收尾门禁;预检 → merge --no-ff → push;`--target` 支持测试分支,共享脚本) | ws_root, branch, --apps / --target / --allow-checkout / --dry-run / --check | 0/1/2 |
|
|
499
|
+
| `deprecate-branches.js` | 废弃重命名(收尾门禁出口三,共享脚本) | ws_root, branch, --apps | 0/1/2 |
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
require('./silence-popup');
|
|
3
|
+
/**
|
|
4
|
+
* 未归档 change 检查(共享脚本,真源:cbb/worktrees/_shared/scripts/)
|
|
5
|
+
*
|
|
6
|
+
* 供 cbb-worktree-close(收尾安全评估)与 cbb-worktree-push(Step 7 直合并前置,ADR 0008)调用。
|
|
7
|
+
*
|
|
8
|
+
* 用法:node check-unarchived.js <ws_root> [branch]
|
|
9
|
+
*
|
|
10
|
+
* 双扫(ADR 0002):
|
|
11
|
+
* - <ws_root>/openspec/changes/ → 空间根当前检出(本地模式产物 / 空间根遗留)
|
|
12
|
+
* - <ws_root>/.worktrees/worktree-<branch>/openspec/changes/ → worktree 模式产物
|
|
13
|
+
* (branch 未传时跳过 worktree 扫描,保持旧调用兼容)
|
|
14
|
+
*
|
|
15
|
+
* 输出:changes 为两处合集(去重);detail 标注每个 change 的来源
|
|
16
|
+
* ('root' / 'worktree',同名两处共存时为 'both')。
|
|
17
|
+
* 本检查为信息收集性质,不阻断流程。
|
|
18
|
+
*
|
|
19
|
+
* 退出码:
|
|
20
|
+
* 0 - 检查完成(无论是否有未归档 change)
|
|
21
|
+
* 1 - 参数错误
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
const path = require('path');
|
|
26
|
+
|
|
27
|
+
const wsRoot = process.argv[2];
|
|
28
|
+
const branch = process.argv[3];
|
|
29
|
+
|
|
30
|
+
if (!wsRoot) {
|
|
31
|
+
console.error('Usage: node check-unarchived.js <ws_root> [branch]');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 扫描单个 changes 目录,返回未归档 change 名数组(目录不存在返回 [])。
|
|
37
|
+
*/
|
|
38
|
+
function scanDir(changesDir) {
|
|
39
|
+
if (!fs.existsSync(changesDir)) return [];
|
|
40
|
+
let entries;
|
|
41
|
+
try {
|
|
42
|
+
entries = fs.readdirSync(changesDir, { withFileTypes: true });
|
|
43
|
+
} catch (e) {
|
|
44
|
+
console.error('Failed to read ' + changesDir + ':', e.message);
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
return entries
|
|
48
|
+
.filter(e => e.isDirectory() && e.name !== 'archive')
|
|
49
|
+
.map(e => e.name);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const rootChanges = scanDir(path.join(wsRoot, 'openspec', 'changes'));
|
|
53
|
+
|
|
54
|
+
const worktreeDir = branch
|
|
55
|
+
? path.join(wsRoot, '.worktrees', 'worktree-' + branch, 'openspec', 'changes')
|
|
56
|
+
: null;
|
|
57
|
+
const wtChanges = worktreeDir ? scanDir(worktreeDir) : [];
|
|
58
|
+
|
|
59
|
+
const detail = {};
|
|
60
|
+
for (const name of rootChanges) detail[name] = 'root';
|
|
61
|
+
for (const name of wtChanges) {
|
|
62
|
+
detail[name] = detail[name] === 'root' ? 'both' : 'worktree';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const changes = Object.keys(detail).sort();
|
|
66
|
+
|
|
67
|
+
if (rootChanges.length === 0 && wtChanges.length === 0) {
|
|
68
|
+
console.log('ℹ️ 未发现未归档 change(根与 worktree' + (worktreeDir ? '' : '(未指定 branch,跳过)') + '均无)');
|
|
69
|
+
} else {
|
|
70
|
+
console.log('ℹ️ 未归档 change:' + (changes.join(', ') || '无'));
|
|
71
|
+
for (const name of changes) {
|
|
72
|
+
console.log(' - ' + name + '(来源:' + detail[name] + ')');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
console.log('UNARCHIVED_RESULT', JSON.stringify({ changes, detail }));
|
|
77
|
+
process.exit(0);
|
|
@@ -251,6 +251,7 @@ verify:
|
|
|
251
251
|
|
|
252
252
|
- **路径 A · 先验收后归档(推荐)**:执行 `cbb-worktree-push` 推送 feature 分支并提 MR 到测试分支 → 测试环境部署、用户验收 → 验收要改则在 worktree 内修复后再次 push(小改动无需重跑 verify)→ 验收通过后才 `/opsx:archive`
|
|
253
253
|
- **路径 B · 先归档后推送**:立即 `/opsx:archive` 落定变更产物(归档移动与 spec 同步发生在 feature 分支上)→ 再执行 `cbb-worktree-push` 一并推送 → 提 MR 到测试分支验收。注意:验收若发现问题,产物已归档,修复需走新 change 或将归档移回后继续;适合改动小、验收把握大的场景
|
|
254
|
+
- **Step 7 交付选择(ADR 0008)**:两条路径的 `cbb-worktree-push` 推送完成后,除「提 MR」外均可选「直接合并」——合测试分支不要求归档,合主干要求已归档 + 强提醒确认;合并成功不删分支(删除归 `cbb-worktree-close` 收尾门禁)
|
|
254
255
|
|
|
255
256
|
用户选定后按该路径执行;官方模板的单一 "suggest archive" 提示语以本段为准。
|
|
256
257
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jspg-ai/coding-bb",
|
|
3
|
-
"version": "0.0.3-beta.
|
|
3
|
+
"version": "0.0.3-beta.33",
|
|
4
4
|
"description": "整合业界热门且高价值的工具、框架与技能,为 AI CODING AGENT 提供统一的行为准则与工作流,辅助开发者将需求高效落地为符合规范的代码",
|
|
5
5
|
"main": "cbb/lib/install/init.js",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"scripts": {
|
|
21
21
|
"sync:shared": "node scripts/sync-shared.js",
|
|
22
22
|
"pretest": "node scripts/sync-shared.js --check",
|
|
23
|
-
"test": "node test/lib/install/cleanup.test.js && node test/lib/utils/settings.test.js && node test/lib/utils/gitignore.test.js && node test/lib/utils/githook.test.js && node test/lib/utils/version.test.js && node test/lib/install/workspaces.test.js && node test/lib/utils/checkbox.test.js && node test/lib/utils/output.test.js && node test/lib/install/cli-help.test.js && node test/lib/install/adapters.test.js && node test/lib/install/tool-selection.test.js && node test/lib/install/agents-nav.test.js && node test/lib/install/command-skill.test.js && node test/lib/utils/plugin-hook.test.js && node test/lib/wiki/wiki-publish.test.js && node test/lib/wiki/wiki-parse-args.test.js && node test/lib/wiki/wiki-split.test.js && node test/lib/superpowers/superpowers.test.js && node test/lib/external/external.test.js && node test/worktrees/push-branches.test.js && node test/worktrees/commit-worktrees.test.js && node test/worktrees/push-worktrees.test.js && node test/worktrees/check-env-deep.test.js && node test/worktrees/create-worktrees.test.js && node test/worktrees/make-mr-urls.test.js && node test/lib/install/setup-decision.test.js && node test/lib/openspec/protected-paths.test.js"
|
|
23
|
+
"test": "node test/lib/install/cleanup.test.js && node test/lib/utils/settings.test.js && node test/lib/utils/gitignore.test.js && node test/lib/utils/githook.test.js && node test/lib/utils/version.test.js && node test/lib/install/workspaces.test.js && node test/lib/utils/checkbox.test.js && node test/lib/utils/output.test.js && node test/lib/install/cli-help.test.js && node test/lib/install/adapters.test.js && node test/lib/install/tool-selection.test.js && node test/lib/install/agents-nav.test.js && node test/lib/install/command-skill.test.js && node test/lib/utils/plugin-hook.test.js && node test/lib/wiki/wiki-publish.test.js && node test/lib/wiki/wiki-parse-args.test.js && node test/lib/wiki/wiki-split.test.js && node test/lib/superpowers/superpowers.test.js && node test/lib/external/external.test.js && node test/worktrees/push-branches.test.js && node test/worktrees/commit-worktrees.test.js && node test/worktrees/push-worktrees.test.js && node test/worktrees/check-env-deep.test.js && node test/worktrees/create-worktrees.test.js && node test/worktrees/make-mr-urls.test.js && node test/lib/install/setup-decision.test.js && node test/lib/openspec/protected-paths.test.js && node test/worktrees/merge-branches.test.js && node test/worktrees/deprecate-branches.test.js"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"cbb",
|