@jspg-ai/coding-bb 0.0.3-beta.3 → 0.0.3-beta.31

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.
Files changed (145) hide show
  1. package/cbb/dev-standards/rules/cbb-ai-behavior.md +135 -116
  2. package/cbb/lib/external/index.js +228 -0
  3. package/cbb/lib/install/agents-nav.js +92 -0
  4. package/cbb/lib/install/claude-code.js +7 -2
  5. package/cbb/lib/install/command-skill.js +105 -0
  6. package/cbb/lib/install/init.js +502 -168
  7. package/cbb/lib/install/minimax.js +60 -0
  8. package/cbb/lib/install/opencode.js +3 -5
  9. package/cbb/lib/install/qoder.js +1 -3
  10. package/cbb/lib/install/rule-rewrite.js +27 -0
  11. package/cbb/lib/install/setup-decision.js +48 -0
  12. package/cbb/lib/install/tool-selection.js +45 -0
  13. package/cbb/lib/install/trae.js +43 -0
  14. package/cbb/lib/install/workbuddy.js +36 -0
  15. package/cbb/lib/install/workspaces.js +21 -17
  16. package/cbb/lib/openspec/index.js +337 -554
  17. package/cbb/lib/superpowers/index.js +246 -265
  18. package/cbb/lib/utils/check-update.js +17 -2
  19. package/cbb/lib/utils/githook.js +226 -0
  20. package/cbb/lib/utils/gitignore.js +16 -3
  21. package/cbb/lib/utils/plugin-hook.js +92 -0
  22. package/cbb/lib/utils/settings.js +17 -4
  23. package/cbb/lib/utils/tar.js +92 -0
  24. package/cbb/lib/utils/upstream.js +90 -0
  25. package/cbb/worktrees/_shared/scripts/check-local-state.js +114 -0
  26. package/cbb/worktrees/_shared/scripts/find-target-worktree.js +148 -96
  27. package/cbb/worktrees/_shared/scripts/find-workspace-root.js +7 -7
  28. package/cbb/worktrees/_shared/scripts/install-git-hook.js +70 -0
  29. package/cbb/worktrees/_shared/scripts/junction-ai-config.js +127 -0
  30. package/cbb/worktrees/_shared/scripts/start-local.js +180 -0
  31. package/cbb/worktrees/skills/cbb-local-mode/SKILL.md +158 -0
  32. package/cbb/worktrees/skills/cbb-local-mode/scripts/check-local-state.js +114 -0
  33. package/cbb/worktrees/skills/cbb-local-mode/scripts/install-git-hook.js +70 -0
  34. package/cbb/worktrees/skills/cbb-local-mode/scripts/silence-popup.js +23 -0
  35. package/cbb/worktrees/skills/cbb-local-mode/scripts/start-local.js +180 -0
  36. package/cbb/worktrees/skills/cbb-worktree-close/SKILL.md +60 -43
  37. package/cbb/worktrees/skills/cbb-worktree-close/scripts/check-env.js +3 -3
  38. package/cbb/worktrees/skills/cbb-worktree-close/scripts/check-unarchived.js +75 -48
  39. package/cbb/worktrees/skills/cbb-worktree-close/scripts/delete-branches.js +1 -1
  40. package/cbb/worktrees/skills/cbb-worktree-close/scripts/discover-apps.js +14 -5
  41. package/cbb/worktrees/skills/cbb-worktree-close/scripts/find-target-worktree.js +148 -96
  42. package/cbb/worktrees/skills/cbb-worktree-close/scripts/find-workspace-root.js +7 -7
  43. package/cbb/worktrees/skills/cbb-worktree-close/scripts/remove-worktrees.js +13 -4
  44. package/cbb/worktrees/skills/cbb-worktree-close/scripts/safety-check.js +11 -2
  45. package/cbb/worktrees/skills/cbb-worktree-init/SKILL.md +138 -129
  46. package/cbb/worktrees/skills/cbb-worktree-init/scripts/check-env.js +1 -1
  47. package/cbb/worktrees/skills/cbb-worktree-init/scripts/check-repos.js +2 -2
  48. package/cbb/worktrees/skills/cbb-worktree-init/scripts/create-branches.js +33 -8
  49. package/cbb/worktrees/skills/cbb-worktree-init/scripts/create-worktrees.js +60 -46
  50. package/cbb/worktrees/skills/cbb-worktree-init/scripts/find-workspace-root.js +7 -7
  51. package/cbb/worktrees/skills/cbb-worktree-init/scripts/install-git-hook.js +70 -0
  52. package/cbb/worktrees/skills/cbb-worktree-init/scripts/junction-ai-config.js +127 -0
  53. package/cbb/worktrees/skills/cbb-worktree-init/scripts/parse-config.js +7 -7
  54. package/cbb/worktrees/skills/cbb-worktree-init/scripts/push-branches.js +3 -3
  55. package/cbb/worktrees/skills/cbb-worktree-init/scripts/sync-repos.js +11 -7
  56. package/cbb/worktrees/skills/cbb-worktree-init/scripts/update-gitignore.js +37 -9
  57. package/cbb/worktrees/skills/cbb-worktree-push/SKILL.md +140 -71
  58. package/cbb/worktrees/skills/cbb-worktree-push/scripts/commit-worktrees.js +70 -12
  59. package/cbb/worktrees/skills/cbb-worktree-push/scripts/find-target-worktree.js +148 -96
  60. package/cbb/worktrees/skills/cbb-worktree-push/scripts/find-workspace-root.js +7 -7
  61. package/cbb/worktrees/skills/cbb-worktree-push/scripts/make-mr-urls.js +211 -0
  62. package/cbb/worktrees/skills/cbb-worktree-push/scripts/push-worktrees.js +67 -20
  63. package/config/{workspace-config.sample.json → CBB-WORKSPACE.sample.json} +1 -1
  64. package/config/openspec/schemas/spec-driven/schema.yaml +40 -30
  65. package/config/openspec/schemas/spec-driven/templates/design.md +0 -18
  66. package/config/openspec/schemas/spec-driven/templates/proposal.md +4 -3
  67. package/config/upstream-mirrors.json +17 -0
  68. package/config/workspace-agents.sample.md +4 -33
  69. package/external/frontend-design/.version +6 -0
  70. package/external/frontend-design/LICENSE.txt +177 -0
  71. package/external/frontend-design/SKILL.md +71 -0
  72. package/openspec/.version +2 -3
  73. package/openspec/commands/apply.md +189 -175
  74. package/openspec/commands/archive.md +244 -216
  75. package/openspec/commands/bulk-archive.md +362 -327
  76. package/openspec/commands/continue.md +115 -105
  77. package/openspec/commands/explore.md +230 -199
  78. package/openspec/commands/ff.md +115 -104
  79. package/openspec/commands/new.md +74 -63
  80. package/openspec/commands/onboard.md +562 -548
  81. package/openspec/commands/propose.md +161 -150
  82. package/openspec/commands/sync.md +277 -249
  83. package/openspec/commands/update.md +98 -80
  84. package/openspec/commands/verify.md +206 -162
  85. package/openspec/skills/openspec-apply-change/SKILL.md +20 -5
  86. package/openspec/skills/openspec-archive-change/SKILL.md +40 -11
  87. package/openspec/skills/openspec-bulk-archive-change/SKILL.md +46 -9
  88. package/openspec/skills/openspec-continue-change/SKILL.md +14 -3
  89. package/openspec/skills/openspec-explore/SKILL.md +22 -10
  90. package/openspec/skills/openspec-ff-change/SKILL.md +15 -3
  91. package/openspec/skills/openspec-new-change/SKILL.md +13 -1
  92. package/openspec/skills/openspec-onboard/SKILL.md +58 -43
  93. package/openspec/skills/openspec-propose/SKILL.md +15 -3
  94. package/openspec/skills/openspec-sync-specs/SKILL.md +31 -2
  95. package/openspec/skills/openspec-update-change/SKILL.md +34 -15
  96. package/openspec/skills/openspec-verify-change/SKILL.md +72 -26
  97. package/package.json +3 -2
  98. package/superpowers/.version +4 -4
  99. package/superpowers/skills/brainstorming/SKILL.md +47 -12
  100. package/superpowers/skills/brainstorming/scripts/frame-template.html +213 -213
  101. package/superpowers/skills/brainstorming/scripts/server.cjs +723 -723
  102. package/superpowers/skills/brainstorming/visual-companion.md +6 -6
  103. package/superpowers/skills/diagnosing-superpowers/SKILL.md +120 -0
  104. package/superpowers/skills/diagnosing-superpowers/prompts/analyst-common.md +38 -0
  105. package/superpowers/skills/diagnosing-superpowers/prompts/cost-and-time.md +28 -0
  106. package/superpowers/skills/diagnosing-superpowers/prompts/plan-adherence.md +29 -0
  107. package/superpowers/skills/diagnosing-superpowers/prompts/quality-evidence.md +26 -0
  108. package/superpowers/skills/diagnosing-superpowers/prompts/repeated-work.md +30 -0
  109. package/superpowers/skills/diagnosing-superpowers/prompts/request-conflicts.md +20 -0
  110. package/superpowers/skills/diagnosing-superpowers/prompts/scrub-audit.md +33 -0
  111. package/superpowers/skills/diagnosing-superpowers/prompts/scrub.md +29 -0
  112. package/superpowers/skills/diagnosing-superpowers/prompts/similar-session.md +38 -0
  113. package/superpowers/skills/diagnosing-superpowers/prompts/skill-timeline.md +30 -0
  114. package/superpowers/skills/diagnosing-superpowers/prompts/stumbles.md +28 -0
  115. package/superpowers/skills/diagnosing-superpowers/references/context-safety.md +22 -0
  116. package/superpowers/skills/diagnosing-superpowers/references/github-issues.md +47 -0
  117. package/superpowers/skills/diagnosing-superpowers/references/redaction-policy.md +34 -0
  118. package/superpowers/skills/diagnosing-superpowers/references/session-discovery.md +31 -0
  119. package/superpowers/skills/diagnosing-superpowers/templates/bundle-README.md +77 -0
  120. package/superpowers/skills/diagnosing-superpowers/templates/case.md +64 -0
  121. package/superpowers/skills/diagnosing-superpowers/templates/issue.md +51 -0
  122. package/superpowers/skills/diagnosing-superpowers/templates/report.md +82 -0
  123. package/superpowers/skills/executing-plans/SKILL.md +350 -41
  124. package/superpowers/skills/executing-plans/scripts/task-done +52 -0
  125. package/superpowers/skills/executing-plans/scripts/task-start +28 -0
  126. package/superpowers/skills/requesting-code-review/SKILL.md +1 -1
  127. package/superpowers/skills/requesting-code-review/code-reviewer.md +17 -0
  128. package/superpowers/skills/subagent-driven-development/SKILL.md +18 -18
  129. package/superpowers/skills/subagent-driven-development/re-review-prompt.md +1 -1
  130. package/superpowers/skills/subagent-driven-development/scripts/review-package +53 -46
  131. package/superpowers/skills/subagent-driven-development/scripts/sdd-workspace +82 -40
  132. package/superpowers/skills/subagent-driven-development/scripts/task-brief +43 -41
  133. package/superpowers/skills/subagent-driven-development/task-reviewer-prompt.md +2 -2
  134. package/superpowers/skills/systematic-debugging/root-cause-tracing.md +1 -1
  135. package/superpowers/skills/test-driven-development/SKILL.md +10 -0
  136. package/superpowers/skills/using-superpowers/SKILL.md +2 -0
  137. package/superpowers/skills/using-superpowers/references/claude-code-tools.md +29 -0
  138. package/superpowers/skills/using-superpowers/references/muse-tools.md +35 -0
  139. package/superpowers/skills/writing-plans/SKILL.md +62 -29
  140. package/superpowers/skills/writing-skills/SKILL.md +4 -2
  141. package/superpowers/skills/writing-skills/graphviz-conventions.dot +171 -171
  142. package/cbb/worktrees/commands/worktree-close.md +0 -64
  143. package/cbb/worktrees/commands/worktree-init.md +0 -51
  144. package/cbb/worktrees/commands/worktree-push.md +0 -42
  145. package/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +0 -49
@@ -1,40 +1,42 @@
1
1
  ---
2
2
  name: cbb-worktree-init
3
- description: "为一个需求在 workspace 与各关联应用仓库(= workspace-config.json 全量 apps)同步创建同名物理 git worktree,直聚在 `.worktrees/worktree-<需求名>/` 下。触发:用户明确要求创建需求工作空间/开发隔离环境,或为已有需求补齐新增应用(重跑本技能即幂等)。禁止自动串联 cbb-worktree-close——除非用户明确说了要关闭。"
4
- license: MIT
5
- compatibility: Requires git (>=2.30) and Node.js (>=16.7.0). All commands are pure Node.js scripts under `scripts/`, fully cross-platform (Windows / macOS / Linux, bash / PowerShell / Git Bash).
6
- metadata:
7
- author: Contributors
8
- version: "2.0"
9
- generatedBy: coding-bb
3
+ description: "为一个需求在 workspace 与各关联应用仓库同步创建同名物理 git worktree,直聚在 `.worktrees/worktree-<需求名>/` 下,并把 AI 配置以 junction 链入工作树(开发会话开进 worktree)。触发:用户明确要求创建需求工作空间/开发隔离环境/并行开发,或双模式选择时用户选 worktree 模式,或为已有需求补齐新增应用(重跑本技能即幂等)。单线程快改且不需要隔离时引导用 cbb-local-mode(本地模式)。禁止自动串联 cbb-worktree-close——除非用户明确说了要关闭。"
10
4
  ---
11
5
 
12
- # Init Worktree(跨平台脚本化版本 v2.0)
6
+ # Init Worktree(跨平台脚本化版本 v3.0)
13
7
 
14
- 为一个需求在 workspace 与各关联应用仓库同步创建同名 git worktree,物理直聚在 `.worktrees/worktree-<需求名>/` 目录下。当你需要跨多个微服务仓库并行开发某个需求时,本技能一次性完成工作空间和所有关联应用仓库的 worktree 创建。
8
+ 为一个需求在 workspace 与各关联应用仓库同步创建同名 git worktree,物理直聚在 `.worktrees/worktree-<需求名>/` 目录下。当你需要跨多个微服务仓库并行开发某个需求、或需要隔离环境时,本技能一次性完成工作空间和关联应用仓库的 worktree 创建(ADR 0002 worktree 模式)。
15
9
 
16
10
  **启动时声明:** "我正在使用 cbb-worktree-init 技能来创建多仓库联动的隔离 worktree 环境。"
17
11
 
18
12
  ## 核心原则
19
13
 
20
14
  - 本技能的所有原子操作封装为 `scripts/*.js` Node.js 脚本,**跨平台执行**(Windows PowerShell / macOS bash / Linux bash / Git Bash 均无需适配)
21
- - 物理位置与 `init-worktree` 兼容:`.worktrees/worktree-<需求名>/<应用名>/`
22
- - 所有仓库使用统一的分支名(不加前缀);worktree 目录名自动加 `worktree-` 前缀
23
- - **本技能必须在业务工作空间根目录执行**(即由 `cbb setup` 初始化、包含 `workspace-config.json` 的目录)
15
+ - 物理位置(ADR 0003):workspace worktree 在 `.worktrees/worktree-<需求名>/`,各 app worktree 收拢在其 `.codespace/<应用名>/` 容器内——**镜像空间根布局**(应用检出恒在 `.codespace/<app>/`,相对路径两模式通用)
16
+ - 所有仓库使用统一的分支名(不加前缀);worktree 目录名自动加 `worktree-` 前缀;**分支基线统一取 `origin/<main>`(ADR 0002,不取 HEAD)**
17
+ - **lazy push(ADR 0002)**:本技能**不向远端推送任何分支**——远端副作用收敛到 `cbb-worktree-push` 唯一出口;推送失败早暴露的职责由 push 技能的 dry-run 承担
18
+ - **AI 配置 junction(ADR 0002 防线 B)**:创建 worktree 后把根的 AI 配置**内容子目录**(rules / skills / commands)junction 进工作树——开发会话开在 `<wt_path>`(上游 `/opsx:*` 相对路径原样生效,零翻译);工具状态落在工作树自建空壳目录,不互相污染;`cbb update` 在根跑一次全 worktree 生效
19
+ - **本技能必须在业务工作空间根目录执行**(即由 `cbb setup` 初始化、包含 `CBB-WORKSPACE.json` 的目录)
24
20
  - 输入约定:**自由文本**(需求名等)直接在对话中提问并等待回复,禁止使用 `AskUserQuestion`;`AskUserQuestion` 仅用于固定选项决策场景(如 push 失败处理、远程分支已存在时的二选一)
25
- - 关联应用固定为 `workspace-config.json` 的**全量 apps**(无勾选选择);需要增减应用时编辑该文件并重跑本技能(幂等)
21
+ - 关联应用恒为 `CBB-WORKSPACE.json` 的**全量 apps**,AI 不询问范围、不从需求语境收窄(worktree 单仓库创建成本低,全量镜像空间根布局);仅当**用户显式点名**应用时才经 `--apps` 传子集(见 Step 1),需要增减应用时编辑该文件并重跑本技能(幂等)
22
+ - **模式选择(ADR 0002)**:接到需求先判断用户要哪种模式——要**并行 / 隔离** → 本技能;**单线程快改、当前会话就地干** → 引导 `cbb-local-mode`。用户明确指定即遵从,agent 只给推荐不代决
26
23
 
27
24
  ---
28
25
 
29
26
  ## 调用脚本的统一方式
30
27
 
31
- **重要**:所有脚本必须用**绝对路径**调用。`./scripts/...` 相对路径在 Agent 运行环境中不适用(AI agent 的 cwd 不一定是技能目录)。
28
+ **重要**:本技能的所有脚本位于**本 SKILL.md 所在目录的 `scripts/` 下**(skill 目录)。
32
29
 
33
- 调用方式(推荐用绝对路径):
34
- ```
35
- node "D:\workspace\<用户工作空间>\.qoder\skills\cbb-worktree-init\scripts\<name>.js" <参数>
30
+ 调用时用**本技能目录的绝对路径**拼接脚本名(AI 读取本 SKILL.md 时即已知该目录),例如:
31
+
32
+ ```bash
33
+ node "<skill_dir>/scripts/<name>.js" <参数>
36
34
  ```
37
35
 
36
+ > - `<skill_dir>` = 本 SKILL.md 所在目录的绝对路径(AI 从读取路径即可推出)
37
+ > - **cwd 必须保持在工作空间根目录**:脚本按 cwd 定位 `CBB-WORKSPACE.json` 与 git 仓库
38
+ > - 不要用 `./scripts/...` 裸相对路径(AI 的 cwd 不是技能目录,会解析失败)
39
+
38
40
  脚本输出:
39
41
  - 人类可读报告(OK / FAIL / WARN)
40
42
  - 机器可读摘要(末行以 XXX_OK / XXX_FAILED / XXX_RESULT 开头)
@@ -45,7 +47,7 @@ node "D:\workspace\<用户工作空间>\.qoder\skills\cbb-worktree-init\scripts\
45
47
  - `<branch>`:需求名字符串
46
48
  - `<wt_path>`:worktree 绝对路径
47
49
 
48
- 所有脚本读 workspace-config.json:app 列表从 `<ws_root>/workspace-config.json` 读取,不需要传 JSON 参数。
50
+ 所有脚本读 CBB-WORKSPACE.json:app 列表从 `<ws_root>/CBB-WORKSPACE.json` 读取,不需要传 JSON 参数。
49
51
 
50
52
  ---
51
53
 
@@ -54,7 +56,7 @@ node "D:\workspace\<用户工作空间>\.qoder\skills\cbb-worktree-init\scripts\
54
56
  ### 0.1 环境健康探活
55
57
 
56
58
  ```bash
57
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/check-env.js"
59
+ node "<skill_dir>/scripts/check-env.js"
58
60
  ```
59
61
 
60
62
  **解读输出**:
@@ -67,7 +69,7 @@ node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/check-env.j
67
69
  提前检测权限/版本问题,把可能在后续步骤暴露的失败前移到流程最开始:
68
70
 
69
71
  ```bash
70
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/check-env-deep.js"
72
+ node "<skill_dir>/scripts/check-env-deep.js"
71
73
  ```
72
74
 
73
75
  **解读输出**:
@@ -78,10 +80,10 @@ node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/check-env-d
78
80
  - Node.js >= 16.7.0
79
81
  - `.worktrees/` 目录可写
80
82
 
81
- ### 0.2 读取并校验 workspace-config.json
83
+ ### 0.2 读取并校验 CBB-WORKSPACE.json
82
84
 
83
85
  ```bash
84
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/parse-config.js"
86
+ node "<skill_dir>/scripts/parse-config.js"
85
87
  ```
86
88
 
87
89
  **解读输出**:
@@ -91,23 +93,23 @@ node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/parse-confi
91
93
 
92
94
  ### 0.3 配置引导
93
95
 
94
- 当 `workspace-config.json` 缺失、`apps` 为空或格式错误时,向用户说明情况并给出两个选项:
96
+ 当 `CBB-WORKSPACE.json` 缺失、`apps` 为空或格式错误时,向用户说明情况并给出两个选项:
95
97
 
96
98
  ```
97
- ⚠️ 当前工作空间尚未配置关联应用(workspace-config.json 缺失或 apps 为空)。
99
+ ⚠️ 当前工作空间尚未配置关联应用(CBB-WORKSPACE.json 缺失或 apps 为空)。
98
100
  worktree 需要知道要关联哪些应用仓库。
99
101
 
100
102
  请选择:
101
- [1] 我自行配置 workspace-config.json,配好后告诉你继续
102
- [2] 提供应用仓库地址,我帮你写入 workspace-config.json
103
+ [1] 我自行配置 CBB-WORKSPACE.json,配好后告诉你继续
104
+ [2] 提供应用仓库地址,我帮你写入 CBB-WORKSPACE.json
103
105
  ```
104
106
 
105
107
  **选项 1:用户自行配置**
106
108
  - 停止当前技能流程
107
- - 提示用户:*"请编辑 workspace-config.json 后回复'继续',或重新执行 init-worktree。"*
109
+ - 提示用户:*"请编辑 CBB-WORKSPACE.json 后回复'继续',或重新执行 init-worktree。"*
108
110
  - 用户回复"继续"后,重新从 Step 0 开始校验
109
111
 
110
- **选项 2:帮用户写入 workspace-config.json**
112
+ **选项 2:帮用户写入 CBB-WORKSPACE.json**
111
113
  - 直接在对话中请用户提供应用信息,格式示例:
112
114
  ```
113
115
  应用名: ep-user-auth-app
@@ -118,7 +120,7 @@ worktree 需要知道要关联哪些应用仓库。
118
120
  仓库地址: git@code.example.com:team/ep-user-info-server.git
119
121
  类型: back(可选值:front 前端 / back 后端 / mixed 前后端混合)
120
122
  ```
121
- - 解析后写入 `workspace-config.json`:
123
+ - 解析后写入 `CBB-WORKSPACE.json`:
122
124
  ```json
123
125
  {
124
126
  "apps": [
@@ -129,43 +131,43 @@ worktree 需要知道要关联哪些应用仓库。
129
131
  ```
130
132
  - 写入成功后提交到当前分支(确保 Step 2 状态检查通过):
131
133
  ```bash
132
- git add workspace-config.json
133
- git commit -m "chore: add workspace-config.json"
134
+ git add CBB-WORKSPACE.json
135
+ git commit -m "chore: add CBB-WORKSPACE.json"
134
136
  ```
135
137
  > 若当前不在主分支上,提示用户切回主分支后再提交;若已在主分支上则直接提交。
136
138
  - 提交后重新从 Step 0 校验,通过后继续 Step 1
137
139
 
138
- > ⚠️ **禁止**:在 workspace-config.json 无效时跳过本步骤直接创建 worktree,否则无法确定关联应用。
140
+ > ⚠️ **禁止**:在 CBB-WORKSPACE.json 无效时跳过本步骤直接创建 worktree,否则无法确定关联应用。
139
141
 
140
142
  ---
141
143
 
142
144
  ## Step 1:关联应用与代码同步
143
145
 
144
- > ⓘ **关联应用 = `workspace-config.json` 的全量 apps,无勾选选择**。所有脚本自行从 `<ws_root>/workspace-config.json` 读取应用列表,无需 AI 传递应用参数。
145
- > 需要增减应用时,编辑 `workspace-config.json` 后**重跑本技能**即可(幂等,已存在的分支/worktree 自动复用,详见「幂等重跑」章节)。
146
+ > ⓘ **关联应用 = 全量 apps**:直接使用 `CBB-WORKSPACE.json` 的全部应用,**不询问范围、不从需求语境收窄**。仅当用户显式点名应用(如"只建 jspg-cvat",典型用于排除状态异常的无关仓库)时才传子集。范围判断错了零代价——重跑本技能幂等补齐(已存在的分支/worktree 自动复用,详见「幂等重跑」章节)。
147
+ > 需要增减应用时,编辑 `CBB-WORKSPACE.json` 后**重跑本技能**即可。
146
148
 
147
149
  ### 1.1 同步 `.codespace/` 目录代码
148
150
 
149
151
  ```bash
150
152
  # ws_root 来自 AI agent 维护的状态
151
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/sync-repos.js" "<ws_root>"
153
+ node "<skill_dir>/scripts/sync-repos.js" "<ws_root>"
152
154
  ```
153
155
 
154
156
  **用法**:
155
- - `<ws_root>`:工作空间根绝对路径(apps 由脚本内部从 `<ws_root>/workspace-config.json` 读取)
157
+ - `<ws_root>`:工作空间根绝对路径(apps 由脚本内部从 `<ws_root>/CBB-WORKSPACE.json` 读取,全量 fetch/clone)
156
158
 
157
159
  **解读输出**:
158
160
  - 退出码 0 + 末行 `SYNC_RESULT [...]` → 全部成功
159
161
  - 退出码 2 + 末行 `SYNC_RESULT [...]`(含 `clone-failed` 项)→ 部分 clone 失败,**终止流程**
160
162
 
161
- > ⓘ **`.codespace/` 目录**:所有应用代码统一存放在工作空间的 `.codespace/` 下。基准代码由 `cbb setup` 命令首次 clone,本脚本检查时如已存在则 fetch 更新(秒级),不存在则 clone 兜底。该目录在 Step 3.2 加入 `.gitignore`,不被 workspace 仓库跟踪。
163
+ > ⓘ **`.codespace/` 目录**:各应用的**标准本地检出**(基准 = `origin/main`,ADR 0002)。首次由 `cbb setup` clone,本脚本如已存在则 fetch 更新(秒级),不存在则 clone 兜底(并补装提交防线 hook)。该目录已 gitignore,不被 workspace 仓库跟踪。本地模式进行中本脚本仍可安全执行(fetch 不动工作区/分支)。
162
164
 
163
165
  ### 1.2 最终输出
164
166
 
165
- 列出本次关联的应用(`workspace-config.json` 全量)及本地路径(保留序号便于复核),向用户展示并确认:
167
+ 列出本次关联的应用(全量,或用户显式指定的子集)及本地路径(保留序号便于复核),**仅作信息展示,不作为提问确认点**:
166
168
 
167
169
  ```
168
- 确认关联应用(workspace-config.json 全量):
170
+ 关联应用(需求 <需求名>,全量):
169
171
  后端:
170
172
  [1] ep-user-auth-app → .codespace/ep-user-auth-app
171
173
  [2] ep-user-info-server → .codespace/ep-user-info-server
@@ -173,7 +175,7 @@ node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/sync-repos.
173
175
  [3] ep-user-web → .codespace/ep-user-web
174
176
  ```
175
177
 
176
- > 后续所有步骤中的 `APP_REPOS` 均指向 `$WS_ROOT/.codespace/<应用名>/`,不再依赖开发者手动配置本地路径。
178
+ > 后续所有步骤中的 `APP_REPOS` 均指向 `$WS_ROOT/.codespace/<应用名>/`,不再依赖开发者手动配置本地路径。**缺省不传 `--apps`(= 全量);仅当用户显式点名应用时,才把子集名单经 `--apps` 参数传给 Step 3.3 / 3.5 脚本(逗号分隔)。**
177
179
 
178
180
  ---
179
181
 
@@ -192,7 +194,7 @@ node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/sync-repos.
192
194
  | 当前在主分支上 | ✅ | ❌ |
193
195
 
194
196
  ```bash
195
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/check-repos.js" "<ws_root>"
197
+ node "<skill_dir>/scripts/check-repos.js" "<ws_root>"
196
198
  ```
197
199
 
198
200
  **解读输出**:
@@ -220,84 +222,69 @@ node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/check-repos
220
222
  ### 3.2 安全更新 .gitignore(前置)
221
223
 
222
224
  ```bash
223
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/update-gitignore.js "<ws_root>" "<branch>"
225
+ node "<skill_dir>/scripts/update-gitignore.js" "<ws_root>" "<branch>"
224
226
  ```
225
227
 
226
- 脚本内部自动完成:stash 保护 → 切分支 → 添加 `.worktrees/` 和 `.codespace/` → 提交 → 切回 → pop stash
228
+ 脚本内部自动完成:stash 保护 → 分支不存在则从 HEAD 创建 → 切分支 → 添加 `.worktrees/` 和 `.codespace/` → 提交 → 切回 → pop stash
227
229
 
228
230
  **解读输出**:
229
231
  - 退出码 0 + 末行 `GITIGNORE_OK` → 成功
230
232
  - 退出码 2 → 执行失败,**终止流程**
231
233
 
232
- > ⚠️ 必须在提交后切回主分支,否则 Step 3.4 的 `git worktree add` 会因分支已检出而失败(脚本已自动处理)。
234
+ > ⓘ **分支自动创建**:本步骤先于 Step 3.3 执行,workspace 分支此时不存在,脚本会自动从 HEAD 创建(与 `create-branches.js` 对 workspace 的行为一致,Step 3.3 报 `reused`)。`.gitignore` 提交正好落在需求分支上,由 Step 3.4 push 一并推送。
235
+
236
+ > ⚠️ 必须在提交后切回主分支,否则 Step 3.5 的 `git worktree add` 会因分支已检出而失败(脚本已自动处理)。
233
237
 
234
238
  ### 3.3 创建分支
235
239
 
236
240
  ```bash
237
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/create-branches.js" "<ws_root>" "<branch>"
241
+ node "<skill_dir>/scripts/create-branches.js" "<ws_root>" "<branch>" [--apps "app1,app2"]
238
242
  ```
239
243
 
244
+ - `--apps`:仅用户显式点名应用时传入(逗号分隔);缺省 = 全量
245
+
240
246
  **解读输出**:
241
247
  - 退出码 0 + 末行 `BRANCH_RESULT [...]` → 全部创建或复用成功
242
248
  - 退出码 2 + 末行 `BRANCH_RESULT [...]`(含 `failed` 项)→ 部分失败,**终止流程**
243
249
 
244
250
  **报告示例**:
245
251
  ```
246
- ✅ workspace: 分支 feature-login 创建成功(从 HEAD)
252
+ ✅ workspace: 分支 feature-login 创建成功(from origin/main)
247
253
  ⏭️ ep-user-auth-app: 分支已存在,复用
248
254
  ✅ ep-user-info-server: 分支 feature-login 创建成功(从 origin/main)
249
255
  ```
250
256
 
251
- > ⓘ **app 仓库从 `origin/main` 创建分支**:Step 2 已 fetch 确保 `origin/main` 引用是最新的。此方式不依赖 app 仓库当前在哪个分支、是否有未提交修改,实现与本地工作目录状态完全解耦。
257
+ > ⓘ **统一从 `origin/main` 创建分支(ADR 0002)**:workspace 与 app 仓库的分支基线均为 `origin/<main>`(Step 2 已 fetch 刷新)——不取 HEAD,本地模式进行中重跑本技能不被根检出状态污染;与 app 仓库当前在哪个分支、是否有未提交修改完全解耦。
252
258
 
253
- > ⚠️ 必须用 `git branch` 而非 `git checkout -b`:因为同一分支不能同时在主目录和 worktree 中检出,切换后 Step 3.4 的 `git worktree add` 会报 `fatal: '<branch>' is already checked out`。
259
+ > ⚠️ 必须用 `git branch` 而非 `git checkout -b`:因为同一分支不能同时在主目录和 worktree 中检出,切换后 Step 3.5 的 `git worktree add` 会报 `fatal: '<branch>' is already checked out`。
254
260
 
255
261
  **情况 B:任一仓库已存在该分支 → 复用**
256
262
  - 脚本自动跳过已存在分支(`status: 'reused'`),不阻塞流程
257
263
  - 不再提供「复用/修改/中断」选项(脚本自动处理)
264
+ - 本地模式遗留的分支同样直接复用(本地升级 worktree 场景:提交随身带走)
258
265
 
259
- ### 3.4 推送并建立 upstream
266
+ ### 3.4 分支就位(lazy push,不推远端)
260
267
 
261
- ```bash
262
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/push-branches.js" "<ws_root>" "<branch>"
263
- ```
268
+ **本技能不执行任何远端推送(ADR 0002 lazy push)**:分支创建止步于本地。远端副作用收敛到 `cbb-worktree-push` 唯一出口(dry-run 预览 → agent 生成 commit 信息并提交 → push → MR 链接)——推送类失败(认证/网络/保护分支)在 push 技能内暴露并处理,不在创建流程中阻塞。
264
269
 
265
- 脚本内部自动完成:
266
- 1. **远程探测**:每个仓库先 `git remote` 确认存在远程名
267
- 2. **推送**:执行 `git push -u <remote> <branch>` 推送并建立 upstream
268
- 3. **错误归类**:stderr 含 `Permission denied (publickey)` / `Authentication failed` / `Could not resolve host` / `protected branch` / `already exists` / `non-fast-forward` 时归类为对应错误码
269
- 4. **远程分支已存在**:自动采集 `git rev-parse` + `git log -1` 元信息(hash/author/date/message),附加到 PUSH_RESULT
270
-
271
- **解读输出:**
272
- - 退出码 0 + 末行 `PUSH_RESULT [...]` → 全部推送成功,继续 Step 3.5
273
- - 结果项 `skipped`(远程分支已存在且与本地一致)→ 幂等跳过,非失败
274
- - 退出码 2 + 末行 `PUSH_RESULT [...]`(含 `failed` 或 `remote-exists` 项)→ **阻塞流程,AI agent 必须询问用户决策**(见下方"失败处理")
275
-
276
- **失败处理(AI agent 行为):**
277
-
278
- | 错误码 | 处理 |
279
- |--------|------|
280
- | `ssh-auth-failed` / `https-auth-failed` / `network-unreachable` / `branch-protected` / `no-remote` / `non-fast-forward` / `unknown` | 输出失败明细,按 error 码分组汇总。AskUserQuestion 提供三个选项:1) 修复后重试(推荐) 2) 跳过失败仓库继续 3) 完全终止 |
281
- | `remote-exists` | 先在纯文本中输出远程 commit 元信息 + 本地 HEAD hash(**二次确认**),再 AskUserQuestion 提供两个选项:1) 关联到 origin/&lt;branch&gt;(执行 set-upstream-to) 2) 终止流程,关闭需求空间后重新创建 |
270
+ > 旧版在本步骤推送空分支建立 upstream(`push-branches.js`),自 0.0.3-beta.22 起移除:避免每个需求在远端留下空分支尸体;`push-worktrees.js` 首次推送时自动建立 upstream,行为等价。
282
271
 
283
- **禁止:** 脚本**禁止**自动 `git branch --set-upstream-to=origin/<branch>`;AI 在询问关联前**必须**先输出 commit 元信息。
284
-
285
- **为什么 push 放在 worktree 之前:** 失败早暴露,无 worktree 损失;成功后再创建 worktree,分支天然有 upstream;独立脚本便于单测。
286
-
287
- ### 3.5 创建 Worktree(含自愈清理)
272
+ ### 3.5 创建 Worktree
288
273
 
289
274
  ```bash
290
- node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/create-worktrees.js" "<ws_root>" "<branch>"
275
+ node "<skill_dir>/scripts/create-worktrees.js" "<ws_root>" "<branch>" [--apps "app1,app2"]
291
276
  ```
292
277
 
278
+ - `--apps`:与 Step 3.3 相同(仅用户显式点名时传入);缺省 = 全量
279
+
293
280
  脚本内部自动完成:
294
- 1. **自愈清理**:`git worktree prune` + 物理目录清理(close 因 IDE 锁未能删除的物理目录)
281
+ 1. **元数据自愈**:仅 `git worktree prune`(清理"目录已缺失/失效"的注册项);**绝不删除任何物理目录**(0.0.3-beta.11 起——旧版"清理无元数据残留目录"因 Windows 路径分隔符不匹配会误删活跃 worktree,已整体移除)
295
282
  2. **workspace worktree 创建**:`git worktree add .worktrees/worktree-<branch> <branch>`
296
- 3. **app worktree 创建**(物理嵌套在 workspace worktree 内)
283
+ 3. **app worktree 创建**(收拢在 workspace worktree 的 `.codespace/` 容器内,镜像空间根布局);≤beta.23 旧平铺布局自动 `git worktree move` 迁移
297
284
 
298
285
  **解读输出**:
299
286
  - 退出码 0 + 末行 `WT_PATH <绝对路径>` → 全部成功,AI 解析出 worktree 绝对路径供后续 Step 4 使用
300
- - 退出码 2 → workspace worktree 创建失败(分支已检出/权限不足),**终止流程**
287
+ - 退出码 2 → workspace worktree 创建失败(分支已检出/权限不足),或目标目录存在但非有效 worktree(上次 close 被 IDE 锁残留)——**终止流程**,按脚本提示引导用户跑 `cbb-worktree-close` 或手动删除该目录 + `git worktree prune` 后重跑
301
288
  - 退出码 3 → 部分 app worktree 创建失败,**报告已创建/失败详情,用户需手动清理**
302
289
 
303
290
  **报告示例**:
@@ -309,9 +296,23 @@ node "D:/workspace/<ws_root>/.qoder/skills/cbb-worktree-init/scripts/create-work
309
296
  WT_PATH d:\workspace\xxx\.worktrees\worktree-feature-login
310
297
  ```
311
298
 
312
- > ⓘ **tracked 内容自动 checkout**:workspace 主分支 tracked 的所有内容(openspec/、cbb/ 等)在 workspace 工作树创建时**自动从 git 对象库 checkout**——**不需要 `cp`、`git clone` 或任何“带过来”动作**。各应用 worktree 同理。
299
+ > ⓘ **tracked 内容自动 checkout**:workspace 主分支 tracked 的所有内容(openspec/、cbb/ 等)在 workspace 工作树创建时**自动从 git 对象库 checkout**——**不需要 `cp`、`git clone` 或任何"带过来"动作**。各应用 worktree 同理。
313
300
 
314
- > ⓘ **AI 配置目录(.claude/、.qoder/、.opencode/ 等)**:统一安装在业务空间根(`cbb setup` / `cbb update`),**worktree 内不安装**;AI 会话始终以空间根为基础,开发动作指向本 worktree 路径。
301
+ ### 3.6 链入 AI 配置(junction,ADR 0002 防线 B)
302
+
303
+ ```bash
304
+ node "<skill_dir>/scripts/junction-ai-config.js" "<ws_root>" "<wt_path>"
305
+ ```
306
+
307
+ 脚本把根的 AI 配置**内容子目录**(`.claude/`、`.qoder/`、`.opencode/`、`.workbuddy/`、`.trae/`、`.minimax/` 下的 rules / skills / commands)junction 进工作树;`.opencode/opencode.json` 为文件则复制。
308
+
309
+ **解读末行 `JUNCTION_RESULT`**:
310
+ - 退出码 0 → linked / copied / skipped(幂等)任一组合均成功
311
+ - 退出码 2 → junction 失败(权限/文件系统),报告后继续——**AI 配置缺失不阻塞流程**,开发会话仍可退回"根会话 + 显式路径"模式(hook 会拦住写错位置的 commit)
312
+
313
+ > ⓘ **为何只 junction 内容子目录**:工具向配置根写状态(如 `.claude/settings.local.json`)落在工作树自建空壳目录,按项目隔离不串扰(ADR 0001 否决整目录链接的污染点由此规避);内容唯一物理副本仍在根——`cbb update` 跑一次,全部 worktree 经 junction 即时生效。
314
+
315
+ > ⓘ **AI 配置目录形态**:worktree 内 `<wt_path>/.claude/rules` 等是链接(指向根),`.claude/` 本身是物理目录(装工具状态)。**勿在 worktree 内手动改 rules/skills/commands**——改的是根的同一份;规范变更应走 `cbb update`。
315
316
 
316
317
  ---
317
318
 
@@ -319,37 +320,54 @@ WT_PATH d:\workspace\xxx\.worktrees\worktree-feature-login
319
320
 
320
321
  不执行脚本。AI agent 向用户输出最终报告(格式见「最终报告」),并完成以下交接声明:
321
322
 
322
- 1. **继续在当前会话开发**:本技能不打开新窗口;需求工作目录为 `<wt_path>`
323
- 2. **目录纪律**:本会话后续所有产生写操作的命令(git commit / openspec / 构建 / 测试等)必须以 `<wt_path>`(或其应用子目录)为工作目录(显式 `cd` 或绝对路径);**禁止在空间根(主分支)执行任何写操作**
323
+ 1. **开发会话开进 worktree**(按工具形态,**能自动则 agent 亲自做,不推给用户**):
324
+ - **OpenCode 等支持会话搬移的工具(桌面端单窗口工作流)**:由 **agent 自己**把当前会话的工作目录切到 `<wt_path>`(经 code-mode 调用 `opencode.session_move`,`directory = <wt_path>`)——聊天上下文保留、无需新窗口、**不列入用户待办**;AI 配置已 junction 就位(`/opsx:*` 等命令照常可用),`.codespace/<app>/...` 相对路径原样生效
325
+ - **无会话搬移能力的桌面端工具(Claude Code / Qoder 等)**:提示用户把当前窗口的工作区根切到 `<wt_path>`(打开文件夹 / Open Folder / 切换工作目录)
326
+ - **CLI / TUI agent**:新开会话于 `<wt_path>`;根会话保留作控制面——后续创建/关闭 worktree、`cbb update` 等空间级操作在此执行
327
+ - 无论哪种形态,**必须向用户报出空间根绝对路径 `<ws_root>`**(控制面地址:close 关闭 worktree 后回切用)
328
+ 2. **目录纪律(worktree 会话内自然成立)**:会话 cwd == 开发目录,上游相对路径原样生效;**分支感知 hook 已覆盖全部仓库**——任何落 main 的载荷提交会被拦截(大声失败是防线,不是故障)
324
329
  3. 不自动安装依赖:各仓库技术栈不一(Maven 依赖本机 `~/.m2` 全局共享、无需初始化;Node/Python 等由你进入 worktree 后执行正确的命令,如 `npm ci` / `pnpm`)
330
+ 4. **输出下一步建议**:最终报告必须包含「下一步建议」段(格式见「最终报告」),告知用户后续可走的流程;仅提示,不自动串联执行任何后续技能
325
331
 
326
332
  ---
327
333
 
328
334
  ## 最终报告
329
335
 
336
+ > **输出纪律**:严格按下方格式输出,禁止追加规则提醒等额外段落;规则由 rules 系统在触发点呈现,不复述。
337
+
330
338
  最终报告格式:
331
339
 
332
340
  ```
333
341
  ✅ worktree 已创建:<wt_path>
334
- 关联应用:<应用名 → 嵌套路径> 列表
335
- 📌 继续在当前会话开发:后续写操作命令一律以上述目录为工作目录
342
+ 关联应用:<应用名 → .codespace/<应用名> 路径> 列表(全量,或用户显式指定的子集)
343
+ 🔗 AI 配置已 junction 就位:rules / skills / commands(cbb update 一处生效)
344
+ 📌 开发会话已开进 <wt_path>(OpenCode:agent 已自动切换会话工作目录;CLI 端:新开会话;无搬移能力的桌面端:已提示用户切根)
345
+ 空间根路径(控制面,close 后回切):<ws_root>
346
+ 👉 下一步建议:
347
+ 1. 开始需求开发(开发会话内,二选一):
348
+ - 走 OpenSpec 工作流:/opsx:propose → /opsx:apply → /opsx:verify → /opsx:archive
349
+ - 或直接对话开发:把需求告诉我,在 <wt_path> 内实现
350
+ 2. 开发中提交推送:说"提交并推送"(cbb-worktree-push;首次 push 自动建立 upstream)
351
+ 3. 需求完成后:说"关闭工作空间"(cbb-worktree-close)
336
352
  ```
337
353
 
338
- > 若 Step 3.5 为部分失败(退出码 3),报告必须列出已创建/失败详情与回滚清理命令。
354
+ > 若 Step 3.5 为部分失败(退出码 3),报告必须列出已创建/失败详情与回滚清理命令。
339
355
 
340
356
  ---
341
357
 
342
- ## 幂等重跑(增减应用 / 中断恢复)
358
+ ## 幂等重跑(增减应用 / 中断恢复 / 本地模式升级)
343
359
 
344
360
  本技能可安全重跑:在业务工作空间根目录用**同一个需求名**再执行一次即可。
345
361
 
346
362
  | 场景 | 重跑行为 |
347
363
  |------|----------|
348
- | 空间新增了应用(编辑 `workspace-config.json` 后) | Step 1 拉取新应用代码 → Step 3.3 为新应用建分支 → Step 3.4 推送(已一致的分支 `skipped`,不一致则阻塞询问)→ Step 3.5 创建缺失的嵌套 worktree |
364
+ | 空间新增了应用(编辑 `CBB-WORKSPACE.json` 后) | Step 1 拉取新应用代码 → Step 3.3 为新应用建分支 → Step 3.5 在 `.codespace/` 容器内创建缺失的 app worktree → Step 3.6 补 junction |
349
365
  | 上次 init 中途失败 | 已存在的分支 / worktree 自动复用,`.gitignore` 处理自动跳过,仅补齐缺失部分 |
350
- | 应用从 config 移除 | 已创建的分支 / worktree **不会**自动删除;如需清理用 `/cbb:worktree-close` 关闭后重建 |
366
+ | 应用从 config 移除 | 已创建的分支 / worktree **不会**自动删除;如需清理用 `cbb-worktree-close` skill 关闭后重建 |
367
+ | **本地模式升级 worktree**(ADR 0002) | Step 3.3 分支已存在 → reused(本地阶段提交随身带走);先 `git checkout main` 腾出各仓库本地检出,再重跑本技能 |
368
+ | 本地模式进行中重跑 | 安全:分支基线取 `origin/main`(非 HEAD),不受根/应用检出状态影响;fetch 不动工作区 |
351
369
 
352
- > ⓘ 重跑**不会静默推送**开发中的本地提交:远程分支已存在但与本地不一致时,Step 3.4 走阻塞式 `remote-exists` 决策(展示 commit 元信息让用户选择)。
370
+ > ⓘ 本技能**零远端副作用**(lazy push):不存在"重跑推送开发中提交"的风险面——推送只发生在 `cbb-worktree-push`。
353
371
 
354
372
  ---
355
373
 
@@ -357,27 +375,27 @@ WT_PATH d:\workspace\xxx\.worktrees\worktree-feature-login
357
375
 
358
376
  | 场景 | 处理方式 |
359
377
  |------|----------|
360
- | `.worktrees/` 或 `.codespace/` 未在 `.gitignore` | workspace 仓库自动添加并提交(在 Step 3.2) |
378
+ | `.worktrees/` / `.codespace/` 未在 `.gitignore` | `cbb setup` / `cbb update` 已写入(0.0.3-beta.22 起含 `.worktrees/`);存量空间由 Step 3.2 补写提交 |
361
379
  | `git worktree add` 权限被拒 | 运行环境降级,中断并告知用户 |
362
380
  | 状态检查任一失败 | 终止并报告所有问题 |
363
381
  | 部分应用 worktree 创建失败 | 提示已创建的回滚清理命令 |
364
382
  | workspace 主分支 tracked 内容(openspec/、cbb/ 等) | 自动 checkout 到工作树,无需额外动作(cp/clone 都是多余的) |
365
- | AI 配置目录(.claude/、.qoder/、.opencode/ 等) | 统一安装在空间根(`cbb setup` / `cbb update`);worktree 内不安装、也不需要 |
383
+ | AI 配置目录(.claude/、.qoder/、.opencode/ 等) | Step 3.6 junction 内容子目录进工作树;唯一物理副本在空间根,`cbb update` 一处生效 |
366
384
  | 需求名(同时作分支名和工作树目录名) | 用户在对话中纯文本输入,参考 Step 3.1 命名规则(kebab-case,禁 `..`、路径分隔符、空格) |
367
- | 关联应用范围 | 固定为 `workspace-config.json` 全量 apps(无勾选);增减应用后重跑本技能(幂等) |
385
+ | 关联应用范围 | 恒为全量(不询问、不从需求语境收窄);用户显式点名应用时 `--apps` 传子集;增减应用后重跑本技能(幂等) |
386
+ | 单线程快改 / 不需要隔离 | 引导 cbb-local-mode(本地模式,就地切分支) |
368
387
  | 运行环境 node 不可用 | 脚本 fail-fast 并提示用户到系统终端重试 |
369
- | push 失败(SSH/HTTPS/网络/保护) | push-branches.js 退出码 2,AI 阻塞并询问用户三选项(修复后重试/跳过失败仓库/完全终止) |
370
- | 远程分支已存在 | push-branches.js 输出 metadata,AI 展示 commit 元信息后询问两选项(关联/终止+重新创建) |
371
- | 开发过程中推送所有 worktree | Step 3.4 仅覆盖创建时的空 commit;开发过程中产生的提交必须调 `/cbb:worktree-push` 或 `cbb-worktree-push` skill 推送(详见该 skill) |
388
+ | 推送(认证/网络/保护分支/远程已存在) | 不在本技能——`cbb-worktree-push` 处理(lazy push,ADR 0002) |
389
+ | 开发过程中推送所有 worktree | 对 cbb-worktree-push 说"提交并推送";首次 push 自动建立 upstream |
372
390
 
373
391
  ---
374
392
 
375
393
  ## 常见错误
376
394
 
377
- ### 跳过 workspace-config.json 直接硬编码仓库地址
395
+ ### 跳过 CBB-WORKSPACE.json 直接硬编码仓库地址
378
396
 
379
397
  - **问题:** 直接在代码中写死仓库 URL 或本地路径,不同团队的仓库地址不同
380
- - **修复:** 始终从 `workspace-config.json` 读取应用与远程仓库的映射;配置缺失/为空时按 Step 0.3 配置引导处理,不支持在流程中临时指定配置外的仓库
398
+ - **修复:** 始终从 `CBB-WORKSPACE.json` 读取应用与远程仓库的映射;配置缺失/为空时按 Step 0.3 配置引导处理,不支持在流程中临时指定配置外的仓库
381
399
 
382
400
  ### 状态检查对 app 仓库执行完整五项检查
383
401
 
@@ -414,22 +432,12 @@ WT_PATH d:\workspace\xxx\.worktrees\worktree-feature-login
414
432
  - **问题:** 需求名需要用户自由输入文本,却用了 `AskUserQuestion` 工具,被迫提供预设选项
415
433
  - **修复:** 自由文本输入场景一律**直接在对话中提问**并等待用户文本回复;`AskUserQuestion` 仅用于固定选项的选择场景
416
434
 
417
- ### 完成后未进入 worktree
418
-
419
- - **问题:** 流程结束后仍停留在工作空间根目录,或跨多次 Bash 调用后丢失 cwd,后续命令作用在错误上下文
420
- - **修复:** Step 5 起的所有命令用 `cd "<worktree 绝对路径>" && <cmd>` 单次 Bash 调用发起,首条命令后接 `pwd` 确认;最终报告首行输出 `当前目录`
421
-
422
- ### push 失败时跳过失败仓库继续
423
-
424
- - **问题:** push 失败但 init-worktree 流程继续,导致后续 agent 在 worktree 中遇到无 upstream 分支
425
- - **修复:** push-branches.js 退出码 2 时必须阻塞流程并询问用户;不允许脚本或 AI 自动跳过失败仓库
435
+ ### 完成后开发会话未开进 worktree
426
436
 
427
- ### 远程分支已存在时自动 set-upstream
437
+ - **问题:** 流程结束后开发会话仍停留在工作空间根目录(junction 好的 AI 配置没人加载),agent 在根会话里靠路径翻译干活,回到第一代失败模式
438
+ - **修复:** Step 4 交接必须确保"开发会话开在 `<wt_path>`"(OpenCode 等支持会话搬移的工具 = agent 亲自经 `session_move` 切换、不列入用户待办;无该能力的桌面端 = 提示用户切根;CLI = 新开会话);根会话保留作控制面(worktree 生灭、`cbb update`)
428
439
 
429
- - **问题:** 看到 origin/&lt;branch&gt; 已存在就直接 `git branch --set-upstream-to`,可能关联到他人的同名分支
430
- - **修复:** 与本地完全一致时脚本幂等跳过(`skipped`,非失败);不一致时输出 metadata 由用户决策(关联 vs 终止);AI 在 AskUserQuestion 之前必须先输出 commit 元信息作为二次确认
431
-
432
- ### 用 `git checkout -b` 在 push 后切分支
440
+ ### 用 `git checkout -b` 在创建 worktree 前切分支
433
441
 
434
442
  - **问题:** Step 3.5 创建 worktree 前先切到新分支,导致 worktree 创建时分支已检出冲突
435
443
  - **修复:** Step 3.3 已统一用 `git branch`(不切换);Step 3.5 的 `git worktree add` 会自动处理 checkout
@@ -437,12 +445,13 @@ WT_PATH d:\workspace\xxx\.worktrees\worktree-feature-login
437
445
  ### 把脚本调用与 Shell 变量混用
438
446
 
439
447
  - **问题:** 试图在 Bash 调用中嵌套 Node 脚本与 shell 变量,导致变量解析失败
440
- - **修复:** 所有脚本参数(`<ws_root>`、`<branch>`)由 AI agent 在对话上下文中维护,**作为字符串参数传入脚本**,不要在 Bash 命令中拼 shell 变量
448
+ - **修复:** 所有脚本参数(`<ws_root>`、`<branch>`、`--apps` 列表)由 AI agent 在对话上下文中维护,**作为字符串参数传入脚本**,不要在 Bash 命令中拼 shell 变量
449
+
450
+ ### 误把 hook 拦截当故障
441
451
 
442
- ### 在空间根执行写操作命令
452
+ - **问题:** 开发会话在 main 上误打载荷 commit 被分支感知 hook 拦截,agent 以为是环境故障,尝试绕过或反复重试
453
+ - **修复:** 拦截是防线(ADR 0002)的正确行为——回需求分支重做;`--no-verify` 绕过仅限用户显式要求
443
454
 
444
- - **问题:** worktree 创建成功后,会话仍在空间根运行 git commit / openspec / 构建命令,污染主分支或把变更产物生成在主分支上
445
- - **修复:** Step 4 交接已声明需求工作目录 `<wt_path>`;所有写操作命令必须显式 `cd` 或用绝对路径指向 worktree
446
455
 
447
456
  ---
448
457
 
@@ -457,19 +466,17 @@ WT_PATH d:\workspace\xxx\.worktrees\worktree-feature-login
457
466
  - 用 `git checkout -b` 切分支后再建 worktree(分支检出冲突)
458
467
  - 用 `AskUserQuestion` 收集自由文本(需求名 / 分支选项等)
459
468
  - 运行环境 node 不可用时强行继续 → 改为 fail-fast 提示用户
460
- - **Step 3.4 推送失败后跳过失败仓库直接继续** → 必须阻塞并询问用户决策
461
- - **远程分支已存在时脚本自动 set-upstream-to** → 必须由用户决策,避免关联到他人的同名分支
462
- - **AI 询问关联选项前不输出 commit 元信息** → 必须先在 AskUserQuestion 之前输出远程 hash/author/date/message + 本地 hash
463
- - **在空间根执行 git/openspec/构建等写操作命令** → 必须显式指定需求工作树路径(`<wt_path>` 或其应用子目录)
469
+ - **在本技能内向远端推送任何分支**(lazy push,ADR 0002)——推送只发生在 `cbb-worktree-push`
470
+ - **hook 拦截 main 载荷提交后用 `--no-verify` 绕过**——仅限用户显式要求
464
471
 
465
472
  **必须执行**
466
473
 
467
474
  - workspace 仓库标准检查(当前在主分支等),app 仓库轻量检查(fetch + `origin/main` 可用即可)
468
- - app 仓库分支从 `origin/main` 创建(`git branch <需求名> ${REMOTE}/${MAIN}`),不依赖本地主分支状态
469
- - 严格 Step 3.3 → Step 3.4 顺序(先统一创建分支,再统一创建 worktree;workspace 工作树先建,各应用按序补建)
470
- - 所有脚本调用以 `node "<WS_ROOT>\.qoder\skills\cbb-worktree-init\scripts\<name>.js" "<绝对路径>" "<branch>"` 形式发起(apps 由脚本内部从 workspace-config.json 读取),**不依赖跨调用的 cwd**
471
- - **Step 3.4 push 步骤必须执行且插入在 create-branches.js (3.3) 之后、create-worktrees.js (3.5) 之前** — 失败时阻塞整个 init-worktree 流程
472
- - **Step 3.4 仅覆盖创建 worktree 时的空 commit** — 开发过程中产生的本地 commit(如 apply 任务实现)必须由用户在 worktree 中手动提交并调 `cbb-worktree-push` 推送;不允许依赖 Step 3.4 之后的自动推送(不存在)
475
+ - 所有仓库分支统一从 `origin/<main>` 创建(`git branch <需求名> ${REMOTE}/${MAIN}`),不依赖本地检出状态(本地模式进行中重跑不受污染)
476
+ - 严格 Step 3.3 → Step 3.5 顺序(先统一创建分支,再统一创建 worktree;workspace 工作树先建,各应用按序补建)
477
+ - Step 3.6 junction AI 配置(失败不阻塞,但要报告)
478
+ - 所有脚本调用以 `node "<skill_dir>/scripts/<name>.js" "<绝对路径>" "<branch>"` 形式发起(apps 缺省由脚本内部从 CBB-WORKSPACE.json 读取,子集用 `--apps` 传入);**执行时 cwd 保持在工作空间根**(`check-env.js` / `parse-config.js` 按 cwd 定位)
479
+ - Step 4 交接必须确保"开发会话开在 `<wt_path>`"(支持会话搬移的工具 = agent 自动 `session_move` 切换,**禁止把切根列入用户待办**;其余 = 用户切根 / CLI 新开会话)、空间根路径在案作控制面
473
480
 
474
481
  ---
475
482
 
@@ -478,11 +485,13 @@ WT_PATH d:\workspace\xxx\.worktrees\worktree-feature-login
478
485
  | 脚本 | 功能 | 参数 | 退出码 |
479
486
  |------|------|------|--------|
480
487
  | `check-env.js` | 环境探活 | 无 | 0/1/2 |
481
- | `parse-config.js` | 解析 workspace-config.json | 无 | 0/1/2 |
482
- | `sync-repos.js` | 同步 .codespace/ 仓库 | ws_root | 0/1/2 |
488
+ | `parse-config.js` | 解析 CBB-WORKSPACE.json | 无 | 0/1/2 |
489
+ | `sync-repos.js` | 同步 .codespace/ 仓库(兜底 clone 时补装提交防线 hook) | ws_root | 0/1/2 |
483
490
  | `check-repos.js` | 状态检查 | ws_root | 0/1/2 |
484
491
  | `update-gitignore.js` | 安全更新 .gitignore | ws_root, branch | 0/1/2 |
485
- | `create-branches.js` | 创建分支 | ws_root, branch | 0/1/2 |
486
- | `create-worktrees.js` | 创建 worktree(含自愈清理) | ws_root, branch | 0/1/2/3 |
487
- | `push-branches.js` | 推送并建立 upstream(已一致则 skipped;带错误归类 + 元信息采集) | ws_root, branch | 0/1/2 |
492
+ | `create-branches.js` | 创建分支(统一从 origin/<main> 建) | ws_root, branch, [--apps] | 0/1/2 |
493
+ | `create-worktrees.js` | 创建 worktree(仅 prune 元数据,不删物理目录) | ws_root, branch, [--apps] | 0/1/2/3 |
494
+ | `junction-ai-config.js` | AI 配置内容子目录 junction 进工作树(ADR 0002 防线 B) | ws_root, wt_path | 0/1/2 |
488
495
  | `check-env-deep.js` | 环境健康自检(Node 版本 / 权限) | 无 | 0/2 |
496
+
497
+ > `push-branches.js` 自 0.0.3-beta.22 起从本技能流程移除(lazy push,ADR 0002);文件保留作历史参考,不再被任何步骤调用。
@@ -48,7 +48,7 @@ console.log('✅ git OK:', checks.git.out);
48
48
  const insideRepo = tryExec('git rev-parse --is-inside-work-tree');
49
49
  if (!insideRepo.ok || insideRepo.out !== 'true') {
50
50
  console.error('❌ 当前目录不是 Git 仓库');
51
- console.error(' init-worktree 必须在工作空间根目录(包含 workspace-config.json)下执行');
51
+ console.error(' init-worktree 必须在工作空间根目录(包含 CBB-WORKSPACE.json)下执行');
52
52
  process.exit(2);
53
53
  }
54
54
  console.log('✅ 当前目录是 git 仓库');
@@ -36,7 +36,7 @@ if (!wsRoot) {
36
36
  }
37
37
 
38
38
  function loadAppsFromConfig() {
39
- const configPath = path.join(wsRoot, "workspace-config.json");
39
+ const configPath = path.join(wsRoot, "CBB-WORKSPACE.json");
40
40
  if (!fs.existsSync(configPath)) return null;
41
41
  try {
42
42
  const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
@@ -46,7 +46,7 @@ function loadAppsFromConfig() {
46
46
 
47
47
  const apps = loadAppsFromConfig();
48
48
  if (!apps) {
49
- console.error("workspace-config.json missing or apps empty");
49
+ console.error("CBB-WORKSPACE.json missing or apps empty");
50
50
  process.exit(1);
51
51
  }
52
52