cc-devflow 4.1.3 → 4.1.4

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/.claude/CLAUDE.md CHANGED
@@ -52,7 +52,9 @@ This directory contains Claude Code CLI extensions for the CC-DevFlow developmen
52
52
  │ └── types/
53
53
  │ └── team-types.d.ts # Team 状态类型定义 [NEW: v4.7]
54
54
  ├── scripts/ # 共享脚本
55
- └── common.sh # 通用函数 (含 worktree 辅助函数)
55
+ ├── CLAUDE.md # scripts 子目录地图(成员清单与职责边界)
56
+ │ ├── common.sh # 通用函数 (含 worktree 辅助函数)
57
+ │ └── flow-workspace-switch.sh # workspace REQ 切换与 worktree 快捷切换
56
58
  └── docs/templates/ # 共享模板
57
59
  └── _shared/ # 共享模板组件 [NEW: v4.1]
58
60
  ├── CONSTITUTION_CHECK.md
@@ -1217,4 +1219,3 @@ ralph_loop:
1217
1219
 
1218
1220
  **Last Updated**: 2026-02-07
1219
1221
  **v4.7.0 Module**: Claude Team Integration
1220
-
@@ -21,7 +21,7 @@ skill: workflow/flow-init
21
21
  | Stage | Purpose | Output |
22
22
  |-------|---------|--------|
23
23
  | 1 | Entry Gate | 参数验证 |
24
- | 1.2 | Git Branch | feature/REQ-xxx-title |
24
+ | 1.2 | Git Worktree (默认) / Branch (--branch-only) | `../{repo}-{REQ_ID}` + `feature|bugfix/{REQ_ID}-{slug}` |
25
25
  | 1.5 | Context Loading | ROADMAP/ARCHITECTURE |
26
26
  | 2 | Directory Init | 目录结构 |
27
27
  | 2.3 | Brainstorming | BRAINSTORM.md |
@@ -29,6 +29,21 @@ skill: workflow/flow-init
29
29
  | 3 | README | README.md |
30
30
  | 4 | Exit Gate | 5-Level 验证 |
31
31
 
32
+ ## Worktree Naming
33
+
34
+ - 默认模式会创建独立 worktree(不是只建分支)。
35
+ - 目录命名:`{repo-name}-{REQ_ID}`(示例:`cc-devflow-REQ-123`)。
36
+ - 分支命名:
37
+ - Requirement: `feature/{REQ_ID}-{slug(title)}`
38
+ - Bug: `bugfix/{REQ_ID}-{slug(title)}`
39
+ - `--branch-only` 才会退回传统单仓库分支模式。
40
+
41
+ ## Session Continuity
42
+
43
+ - 需求上下文由 `devflow/requirements/${REQ_ID}/` 下的文档和 `orchestration_status.json` 持久化。
44
+ - REQ 识别优先级:`DEVFLOW_REQ_ID` → worktree 目录名 → 当前分支名。
45
+ - 进入新会话时,应先进入目标 worktree 目录再继续命令;worktree 路径可按命名规则直接定位,或使用 `using-git-worktrees` 的切换脚本。
46
+
32
47
  ## Skill Location
33
48
 
34
49
  **Full Implementation**: `.claude/skills/workflow/flow-init/SKILL.md`
@@ -43,6 +43,13 @@ skills:
43
43
  - 是否需要 CI 验证 (生产代码 → PR)
44
44
  ```
45
45
 
46
+ ## 合并语义(关键)
47
+
48
+ - `A) Fast-forward merge`:会在本地直接合并到 `main`。
49
+ - `B) Create PR`:只创建/更新 PR,不会在当前步骤自动合并到 `main`。
50
+ - `C) Squash and merge`:会通过 PR squash 合并到 `main`(通常在评审/CI 通过后执行)。
51
+ - `D) Cleanup only`:不会合并,只清理分支/worktree。
52
+
46
53
  ## User Input
47
54
  ```text
48
55
  $ARGUMENTS = "REQ_ID?"
@@ -61,8 +68,12 @@ $ARGUMENTS = "REQ_ID?"
61
68
  4. 验证 Quality gate:
62
69
  → TEST_REPORT.md / SECURITY_REPORT.md 中的 Gate 均为 PASS
63
70
  5. Git 环境:
64
- 工作区干净、当前在 feature/bugfix 分支
71
+ 当前在 feature/bugfix 分支
65
72
  → 分支已推送,若无 upstream 提示 push
73
+ 6. Commit 规范门禁(工作区不干净时):
74
+ → 必须先执行 `/util/git-commit`(规则见 `.claude/commands/util/git-commit.md`)
75
+ → Commit message 必须遵循 Conventional Commits;多文件按同类变更拆分提交
76
+ → 提交完成后重新执行 Entry Gate,直到工作区干净
66
77
  ```
67
78
 
68
79
  ### 阶段 2: 发布上下文准备
@@ -92,17 +103,29 @@ Prompt 核心要求:
92
103
 
93
104
  ### 阶段 4: PR 创建与完结
94
105
  ```
95
- 1. 使用 gh CLI 创建或更新 PR
106
+ 1. PR 前提交检查:
107
+ → 若 `git status --porcelain` 非空,立即中止并回到 Entry Gate 第 6 步执行 `/util/git-commit`
108
+ 2. 使用 gh CLI 创建或更新 PR
96
109
  → 标题: "${REQ_ID}: ${TITLE}"
97
110
  → 正文采用 agent 输出
98
- 2. 检查 CLAUDE.md:
111
+ 3. 检查 CLAUDE.md:
99
112
  → 若 TECH_DESIGN 引入新基础设施/重大变更,更新 "## Technical Architecture"(≤15 行)
100
- 3. 状态更新:
113
+ 4. 状态更新:
101
114
  → orchestration_status.status = "release_complete"
102
115
  → completedSteps append "release"
103
116
  → prUrl 记录到状态文件
104
- 4. EXECUTION_LOG 记录 PR 链接与发布时间
105
- 5. 可选: {SCRIPT:generate_status} 生成状态报告
117
+ 5. EXECUTION_LOG 记录 PR 链接与发布时间
118
+ 6. 可选: {SCRIPT:generate_status} 生成状态报告
119
+ ```
120
+
121
+ ### 阶段 5: Worktree 清理策略
122
+ ```
123
+ 1. 若当前为 worktree 模式:
124
+ → 仅在分支已合并(或明确放弃该分支)后执行 `git worktree remove`
125
+ 2. 若仅创建 PR 且尚未合并:
126
+ → 默认保留 worktree,等待后续评审/CI
127
+ 3. 若已完成合并:
128
+ → 删除 worktree + 删除已合并分支
106
129
  ```
107
130
 
108
131
  ## 输出
@@ -118,6 +141,7 @@ Prompt 核心要求:
118
141
  - Quality Gate 失败或 Constitution ERROR → 立即终止,标记 status="release_failed"。
119
142
  - Git push/PR 创建失败 → 输出命令和日志,保持可重试状态。
120
143
  - CLAUDE.md 更新遗漏 → 阻断发布并提示补写。
144
+ - 工作区存在未提交改动且未按 `/util/git-commit` 规则处理 → 阻断发布。
121
145
 
122
146
  ## 下一步
123
147
  1. 等待代码评审与 CI 通过。
@@ -20,13 +20,16 @@ Enables context recovery across sessions and tracks development progress.
20
20
  /flow-workspace init [developer]
21
21
 
22
22
  # Start session (recover context)
23
- /flow-workspace start
23
+ /flow-workspace start [REQ-XXX|BUG-XXX]
24
+ /flow-workspace start REQ-XXX --switch
25
+ /flow-workspace start BUG-XXX --switch --cd # 需 source/eval 场景
24
26
 
25
27
  # Record progress to journal
26
28
  /flow-workspace record "message"
27
29
 
28
30
  # Switch to different requirement
29
31
  /flow-workspace switch REQ-XXX
32
+ /flow-workspace switch BUG-XXX --cd # 需 source/eval 场景
30
33
  ```
31
34
 
32
35
  ## Subcommands
@@ -53,13 +56,20 @@ Start a new session, recovering context from previous session.
53
56
 
54
57
  ```bash
55
58
  /flow-workspace start
59
+ /flow-workspace start REQ-008 --switch
60
+ /flow-workspace start BUG-008 --switch
56
61
  ```
57
62
 
58
63
  Process:
59
64
  1. Read `.current-req` to get current requirement
60
65
  2. Read latest journal entries
61
- 3. Display context summary
62
- 4. Ready to continue work
66
+ 3. 校验并显示期望 worktree 路径(提示是否在正确目录)
67
+ 4. Display context summary
68
+ 5. Ready to continue work
69
+
70
+ 可选行为:
71
+ - 传入 `REQ-XXX/BUG-XXX` 会先更新 `.current-req` 再恢复上下文
72
+ - `--switch` 输出切换建议;`--cd` 在脚本被 `source` 时可直接切换目录
63
73
 
64
74
  ### record
65
75
 
@@ -77,9 +87,21 @@ Switch to a different requirement.
77
87
 
78
88
  ```bash
79
89
  /flow-workspace switch REQ-008
90
+ /flow-workspace switch REQ-008 --cd
80
91
  ```
81
92
 
82
93
  Updates `.current-req` and creates a new journal entry.
94
+ 如果存在对应 worktree,建议立即切换到:
95
+ ```bash
96
+ cd "$(bash .claude/skills/domain/using-git-worktrees/scripts/worktree-switch.sh REQ-008)"
97
+ ```
98
+
99
+ 更便捷的一步切换:
100
+ ```bash
101
+ eval "$(bash .claude/scripts/flow-workspace-switch.sh REQ-008 --print-cd)"
102
+ # 或
103
+ source .claude/scripts/flow-workspace-switch.sh REQ-008 --cd
104
+ ```
83
105
 
84
106
  ## Workspace Structure
85
107
 
@@ -116,12 +138,15 @@ devflow/workspace/
116
138
 
117
139
  ### With flow-init
118
140
 
119
- When `/flow-init` creates a new requirement:
141
+ When `/flow-init` creates a new requirement (and workspace already initialized):
120
142
  ```bash
121
143
  # Auto-update workspace
122
144
  echo "REQ-XXX" > devflow/workspace/{developer}/.current-req
123
145
  ```
124
146
 
147
+ `/flow-workspace start` 会基于 REQ-ID 推导期望 worktree 路径:
148
+ `../{repo-name}-{REQ_ID}`,并提示是否已在正确 worktree。
149
+
125
150
  ### With flow-dev
126
151
 
127
152
  During development, progress is automatically recorded:
@@ -138,6 +163,7 @@ Journal is read at Protocol 3 (Ralph iteration start) to maintain context.
138
163
  - `.claude/scripts/flow-workspace-init.sh` - Initialize workspace
139
164
  - `.claude/scripts/flow-workspace-start.sh` - Start session
140
165
  - `.claude/scripts/flow-workspace-record.sh` - Record progress
166
+ - `.claude/scripts/flow-workspace-switch.sh` - Switch REQ pointer and worktree action
141
167
 
142
168
  ## Related
143
169
 
@@ -0,0 +1,79 @@
1
+ # scripts/
2
+ > L2 | 父级: .claude/CLAUDE.md
3
+ >
4
+ > [PROTOCOL]: 变更时更新此头部,然后检查 CLAUDE.md
5
+
6
+ ## 目录定位
7
+
8
+ `.claude/scripts/` 是命令层与 Skill 层共享的执行脚本库,负责状态检测、质量门禁、需求目录操作与会话恢复。
9
+
10
+ ## 成员清单
11
+
12
+ analyze-upgrade-impact.sh: 升级影响分析脚本。
13
+ archive-requirement.sh: 需求归档与清理脚本。
14
+ calculate-checklist-completion.sh: Checklist 完成度统计脚本。
15
+ calculate-quarter.sh: 时间季度计算脚本。
16
+ check-dependencies.sh: 依赖关系检查脚本。
17
+ check-prerequisites.sh: 流程前置条件统一校验脚本。
18
+ check-task-status.sh: TASKS 完成状态统计脚本。
19
+ checklist-errors.sh: Checklist 错误码与诊断脚本。
20
+ common.sh: 脚本公共函数库(REQ 识别、worktree 路径、日志工具等)。
21
+ consolidate-research.sh: research 结果汇总脚本。
22
+ create-requirement.sh: 创建需求目录与初始状态;同步 workspace 的 `.current-req`。
23
+ delta-parser.ts: Delta 解析器。
24
+ detect-file-conflicts.sh: 并行开发文件冲突检测脚本。
25
+ export-contracts.sh: 合同文档导出脚本。
26
+ extract-data-model.sh: 数据模型抽取脚本。
27
+ flow-context-add.sh: context JSONL 条目追加脚本。
28
+ flow-context-init.sh: context 目录初始化脚本。
29
+ flow-context-validate.sh: context 路径验证脚本。
30
+ flow-delta-apply.sh: Delta 应用脚本。
31
+ flow-delta-archive.sh: Delta 归档脚本。
32
+ flow-delta-create.sh: Delta 创建脚本。
33
+ flow-delta-list.sh: Delta 列表脚本。
34
+ flow-delta-status.sh: Delta 状态脚本。
35
+ flow-quality-full.sh: 全量质量检查脚本。
36
+ flow-quality-quick.sh: 快速质量检查脚本。
37
+ flow-workspace-init.sh: 开发者 workspace 初始化脚本。
38
+ flow-workspace-record.sh: workspace journal 追加记录脚本。
39
+ flow-workspace-start.sh: workspace 会话恢复脚本;支持 REQ 覆盖与 worktree 切换提示。
40
+ flow-workspace-switch.sh: workspace REQ 切换脚本;支持 `--print-cd` 与 `--cd`。
41
+ generate-clarification-questions.sh: Clarify 问题生成脚本。
42
+ generate-clarification-report.sh: Clarify 报告生成脚本。
43
+ generate-quickstart.sh: quickstart 文档生成脚本。
44
+ generate-research-tasks.sh: research 任务生成脚本。
45
+ generate-status-report.sh: 状态报告聚合脚本。
46
+ generate-tech-analysis.sh: 技术分析生成脚本。
47
+ get-workflow-status.sh: 工作流状态读取脚本。
48
+ locate-requirement-in-roadmap.sh: roadmap 需求定位脚本。
49
+ manage-constitution.sh: Constitution 管理脚本。
50
+ mark-task-complete.sh: 任务完成标记脚本。
51
+ parse-task-dependencies.js: 任务依赖解析器。
52
+ populate-research-tasks.sh: research 任务填充脚本。
53
+ record-quality-error.sh: 质量错误记录脚本。
54
+ recover-workflow.sh: 中断恢复脚本。
55
+ run-clarify-scan.sh: Clarify 扫描执行脚本。
56
+ run-high-review.sh: 高强度 review 执行脚本。
57
+ run-problem-analysis.sh: 问题分析执行脚本。
58
+ run-quality-gates.sh: 质量门禁执行脚本。
59
+ setup-epic.sh: Epic 初始化脚本。
60
+ setup-ralph-loop.sh: Ralph Loop 初始化脚本。
61
+ sync-roadmap-progress.sh: roadmap 进度同步脚本。
62
+ sync-task-marks.sh: TASKS 勾选同步脚本。
63
+ team-dev-init.sh: Team 开发并行初始化脚本。
64
+ team-state-recovery.sh: Team 状态恢复脚本。
65
+ test-clarify-scan.sh: Clarify 扫描测试脚本。
66
+ update-agent-context.sh: Agent 上下文更新脚本。
67
+ validate-constitution.sh: Constitution 校验脚本。
68
+ validate-hooks.sh: Hooks 校验脚本。
69
+ validate-research.sh: research 质量校验脚本。
70
+ validate-scope-boundary.sh: scope 边界校验脚本。
71
+ verify-gate.sh: Gate 校验脚本。
72
+ verify-setup.sh: 环境/安装验证脚本。
73
+ workflow-status.ts: 工作流状态类型化读取器。
74
+
75
+ ## 设计约束
76
+
77
+ - 需求识别统一复用 `common.sh`,避免多处正则分叉。
78
+ - worktree 与 workspace 职责分离:代码隔离由 worktree 提供,连续上下文由 workspace 提供。
79
+ - 新增脚本优先保持幂等与可重入,便于中断恢复。
@@ -402,6 +402,18 @@ if ! $SKIP_GIT && has_git; then
402
402
  export DEVFLOW_REQ_ID="$REQ_ID"
403
403
  fi
404
404
 
405
+ # Sync developer workspace pointer when workspace is initialized.
406
+ # This keeps follow-up sessions aligned to the same requirement.
407
+ DEVELOPER="${DEVFLOW_DEVELOPER:-$(whoami)}"
408
+ DEV_WORKSPACE_DIR="$REPO_ROOT/devflow/workspace/$DEVELOPER"
409
+ if [[ -d "$DEV_WORKSPACE_DIR" ]]; then
410
+ echo "$REQ_ID" > "$DEV_WORKSPACE_DIR/.current-req"
411
+ log_event "$REQ_ID" "Workspace pointer updated: $DEVELOPER -> $REQ_ID"
412
+ if ! $JSON_MODE; then
413
+ echo "Updated workspace current requirement: $DEVELOPER -> $REQ_ID" >&2
414
+ fi
415
+ fi
416
+
405
417
  # Output results
406
418
  if $JSON_MODE; then
407
419
  printf '{"req_id":"%s","req_type":"%s","req_dir":"%s","title":"%s","git_branch":"%s","created_at":"%s"}\n' \
@@ -13,12 +13,90 @@ set -e
13
13
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
14
  PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
15
15
  WORKSPACE_DIR="$PROJECT_ROOT/devflow/workspace"
16
+ COMMON_SH="$SCRIPT_DIR/common.sh"
17
+
18
+ if [[ -f "$COMMON_SH" ]]; then
19
+ source "$COMMON_SH"
20
+ fi
16
21
 
17
22
  # ============================================================================
18
- # Detect Developer
23
+ # Parse Arguments
19
24
  # ============================================================================
20
25
 
21
- DEVELOPER="${1:-$(whoami)}"
26
+ usage() {
27
+ cat << 'EOF'
28
+ Usage: flow-workspace-start.sh [REQ_ID|DEVELOPER] [OPTIONS]
29
+
30
+ Start a workspace session and recover context.
31
+
32
+ Arguments:
33
+ REQ_ID Optional requirement ID to activate (REQ-XXX / BUG-XXX)
34
+ DEVELOPER Optional developer name (legacy positional style)
35
+
36
+ Options:
37
+ --developer NAME Explicit developer name
38
+ --req REQ_ID Activate a specific requirement before recovery
39
+ --switch Show switch recommendation to the target worktree
40
+ --cd Try to execute cd (effective only when script is sourced)
41
+ --help, -h Show help
42
+
43
+ Examples:
44
+ flow-workspace-start.sh
45
+ flow-workspace-start.sh REQ-123 --switch
46
+ source flow-workspace-start.sh REQ-123 --switch --cd
47
+ EOF
48
+ }
49
+
50
+ DEVELOPER="${DEVFLOW_DEVELOPER:-$(whoami)}"
51
+ REQ_OVERRIDE=""
52
+ SHOW_SWITCH=false
53
+ DO_CD=false
54
+ POSITIONAL=()
55
+
56
+ while [[ $# -gt 0 ]]; do
57
+ case "$1" in
58
+ --developer)
59
+ DEVELOPER="$2"
60
+ shift 2
61
+ ;;
62
+ --req)
63
+ REQ_OVERRIDE="$2"
64
+ shift 2
65
+ ;;
66
+ --switch)
67
+ SHOW_SWITCH=true
68
+ shift
69
+ ;;
70
+ --cd)
71
+ DO_CD=true
72
+ shift
73
+ ;;
74
+ --help|-h)
75
+ usage
76
+ exit 0
77
+ ;;
78
+ -*)
79
+ echo "ERROR: Unknown option '$1'. Use --help for usage." >&2
80
+ exit 1
81
+ ;;
82
+ *)
83
+ POSITIONAL+=("$1")
84
+ shift
85
+ ;;
86
+ esac
87
+ done
88
+
89
+ # Backward compatible positional parsing:
90
+ # - if token looks like REQ/BUG -> requirement override
91
+ # - else treat as developer
92
+ for token in "${POSITIONAL[@]}"; do
93
+ if [[ "$token" =~ ^(REQ|BUG)-[0-9]+(-[0-9]+)?$ ]]; then
94
+ REQ_OVERRIDE=$(echo "$token" | tr '[:lower:]' '[:upper:]')
95
+ else
96
+ DEVELOPER="$token"
97
+ fi
98
+ done
99
+
22
100
  DEV_WORKSPACE="$WORKSPACE_DIR/$DEVELOPER"
23
101
 
24
102
  if [[ ! -d "$DEV_WORKSPACE" ]]; then
@@ -35,16 +113,31 @@ echo "🔄 Session Recovery for $DEVELOPER"
35
113
  echo "=================================="
36
114
  echo ""
37
115
 
116
+ if [[ -n "$REQ_OVERRIDE" ]]; then
117
+ if declare -f validate_req_id >/dev/null 2>&1; then
118
+ validate_req_id "$REQ_OVERRIDE" || exit 1
119
+ fi
120
+ echo "$REQ_OVERRIDE" > "$DEV_WORKSPACE/.current-req"
121
+ echo "📌 Requirement override: $REQ_OVERRIDE"
122
+ fi
123
+
38
124
  # Read current requirement
39
125
  if [[ -f "$DEV_WORKSPACE/.current-req" ]]; then
40
126
  CURRENT_REQ=$(cat "$DEV_WORKSPACE/.current-req")
41
127
  echo "📋 Current Requirement: $CURRENT_REQ"
42
128
 
43
- # Check if requirement directory exists
44
- REQ_DIR="$PROJECT_ROOT/devflow/requirements/$CURRENT_REQ"
129
+ # Resolve requirement/bug directory by ID prefix
130
+ if [[ "$CURRENT_REQ" =~ ^BUG- ]]; then
131
+ REQ_DIR="$PROJECT_ROOT/devflow/bugs/$CURRENT_REQ"
132
+ STATUS_BASENAME="status.json"
133
+ else
134
+ REQ_DIR="$PROJECT_ROOT/devflow/requirements/$CURRENT_REQ"
135
+ STATUS_BASENAME="orchestration_status.json"
136
+ fi
137
+
45
138
  if [[ -d "$REQ_DIR" ]]; then
46
139
  # Read orchestration status
47
- STATUS_FILE="$REQ_DIR/orchestration_status.json"
140
+ STATUS_FILE="$REQ_DIR/$STATUS_BASENAME"
48
141
  if [[ -f "$STATUS_FILE" ]]; then
49
142
  STATUS=$(jq -r '.status' "$STATUS_FILE" 2>/dev/null || echo "unknown")
50
143
  echo " Status: $STATUS"
@@ -57,6 +150,42 @@ if [[ -f "$DEV_WORKSPACE/.current-req" ]]; then
57
150
  DONE=$(grep -c '^\- \[x\]' "$TASKS_FILE" 2>/dev/null || echo "0")
58
151
  echo " Tasks: $DONE/$TOTAL completed"
59
152
  fi
153
+
154
+ # Show expected worktree path and whether current session matches.
155
+ if declare -f get_worktree_dir_for_req >/dev/null 2>&1; then
156
+ EXPECTED_WORKTREE=$(get_worktree_dir_for_req "$CURRENT_REQ" 2>/dev/null || echo "")
157
+ CURRENT_GIT_ROOT=$(git -C "$PROJECT_ROOT" rev-parse --show-toplevel 2>/dev/null || echo "")
158
+
159
+ if [[ -n "$EXPECTED_WORKTREE" ]]; then
160
+ echo " Expected Worktree: $EXPECTED_WORKTREE"
161
+ if [[ -d "$EXPECTED_WORKTREE" ]]; then
162
+ if [[ "$CURRENT_GIT_ROOT" == "$EXPECTED_WORKTREE" ]]; then
163
+ echo " Worktree Match: yes"
164
+ else
165
+ echo " Worktree Match: no"
166
+ echo " Action: cd $EXPECTED_WORKTREE"
167
+ fi
168
+ else
169
+ echo " Worktree Match: missing"
170
+ fi
171
+
172
+ if $SHOW_SWITCH; then
173
+ if [[ -d "$EXPECTED_WORKTREE" ]]; then
174
+ if $DO_CD; then
175
+ if [[ "${BASH_SOURCE[0]}" != "$0" ]]; then
176
+ cd "$EXPECTED_WORKTREE"
177
+ echo " Auto Switched: yes ($PWD)"
178
+ else
179
+ echo " Auto Switched: no (requires sourced execution)"
180
+ echo " Run: source .claude/scripts/flow-workspace-start.sh $CURRENT_REQ --switch --cd"
181
+ fi
182
+ else
183
+ echo " Switch Command: cd \"$EXPECTED_WORKTREE\""
184
+ fi
185
+ fi
186
+ fi
187
+ fi
188
+ fi
60
189
  else
61
190
  echo " ⚠️ Requirement directory not found"
62
191
  fi
@@ -85,4 +214,4 @@ fi
85
214
  echo ""
86
215
  echo "Ready to continue. Use:"
87
216
  echo " /flow-workspace record \"message\" - Record progress"
88
- echo " /flow-workspace switch REQ-XXX - Switch requirement"
217
+ echo " /flow-workspace switch REQ-XXX|BUG-XXX - Switch requirement"
@@ -0,0 +1,234 @@
1
+ #!/bin/bash
2
+ # [INPUT]: 依赖 common.sh、workspace/.current-req、journal-*.md
3
+ # [OUTPUT]: 更新当前开发者的 REQ 指针,并输出/执行 worktree 切换动作
4
+ # [POS]: scripts 的 workspace 切换脚本,被 /flow-workspace switch 与 start --switch 调用
5
+ # [PROTOCOL]: 变更时更新此头部,然后检查 CLAUDE.md
6
+
7
+ set -e
8
+
9
+ # ============================================================================
10
+ # Configuration
11
+ # ============================================================================
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
15
+ WORKSPACE_DIR="$PROJECT_ROOT/devflow/workspace"
16
+ COMMON_SH="$SCRIPT_DIR/common.sh"
17
+
18
+ if [[ -f "$COMMON_SH" ]]; then
19
+ source "$COMMON_SH"
20
+ fi
21
+
22
+ # ============================================================================
23
+ # Usage
24
+ # ============================================================================
25
+
26
+ usage() {
27
+ cat << 'EOF'
28
+ Usage: flow-workspace-switch.sh REQ_ID [OPTIONS]
29
+
30
+ Switch workspace context to a target requirement.
31
+
32
+ Arguments:
33
+ REQ_ID Requirement ID (REQ-XXX or BUG-XXX)
34
+
35
+ Options:
36
+ --developer NAME Developer name (default: DEVFLOW_DEVELOPER or current user)
37
+ --print-cd Print `cd "<worktree>"` for eval-style switching
38
+ --cd Try to execute cd (effective only when script is sourced)
39
+ --json Output in JSON format
40
+ --help, -h Show help
41
+
42
+ Examples:
43
+ flow-workspace-switch.sh REQ-123
44
+ flow-workspace-switch.sh REQ-123 --print-cd
45
+ eval "$(flow-workspace-switch.sh REQ-123 --print-cd)"
46
+ source flow-workspace-switch.sh REQ-123 --cd
47
+ EOF
48
+ }
49
+
50
+ # ============================================================================
51
+ # Parse Arguments
52
+ # ============================================================================
53
+
54
+ REQ_ID=""
55
+ DEVELOPER="${DEVFLOW_DEVELOPER:-$(whoami)}"
56
+ PRINT_CD=false
57
+ DO_CD=false
58
+ JSON_MODE=false
59
+
60
+ while [[ $# -gt 0 ]]; do
61
+ case "$1" in
62
+ --developer)
63
+ DEVELOPER="$2"
64
+ shift 2
65
+ ;;
66
+ --print-cd)
67
+ PRINT_CD=true
68
+ shift
69
+ ;;
70
+ --cd)
71
+ DO_CD=true
72
+ shift
73
+ ;;
74
+ --json)
75
+ JSON_MODE=true
76
+ shift
77
+ ;;
78
+ --help|-h)
79
+ usage
80
+ exit 0
81
+ ;;
82
+ -*)
83
+ echo "ERROR: Unknown option '$1'. Use --help for usage." >&2
84
+ exit 1
85
+ ;;
86
+ *)
87
+ if [[ -z "$REQ_ID" ]]; then
88
+ REQ_ID="$1"
89
+ else
90
+ echo "ERROR: Too many arguments. Use --help for usage." >&2
91
+ exit 1
92
+ fi
93
+ shift
94
+ ;;
95
+ esac
96
+ done
97
+
98
+ if [[ -z "$REQ_ID" ]]; then
99
+ echo "ERROR: REQ_ID is required. Use --help for usage." >&2
100
+ exit 1
101
+ fi
102
+
103
+ # Normalize and validate REQ_ID
104
+ REQ_ID=$(echo "$REQ_ID" | tr '[:lower:]' '[:upper:]')
105
+ if declare -f validate_req_id >/dev/null 2>&1; then
106
+ validate_req_id "$REQ_ID" || exit 1
107
+ fi
108
+
109
+ # ============================================================================
110
+ # Resolve Workspace
111
+ # ============================================================================
112
+
113
+ DEV_WORKSPACE="$WORKSPACE_DIR/$DEVELOPER"
114
+ if [[ ! -d "$DEV_WORKSPACE" ]]; then
115
+ echo "ERROR: Workspace not found for '$DEVELOPER': $DEV_WORKSPACE" >&2
116
+ echo "Run '/flow-workspace init $DEVELOPER' first." >&2
117
+ exit 1
118
+ fi
119
+
120
+ # Update current requirement pointer
121
+ echo "$REQ_ID" > "$DEV_WORKSPACE/.current-req"
122
+
123
+ # Append a lightweight journal entry
124
+ LATEST_JOURNAL=$(ls -1 "$DEV_WORKSPACE"/journal-*.md 2>/dev/null | sort -V | tail -1)
125
+ if [[ -z "$LATEST_JOURNAL" ]]; then
126
+ LATEST_JOURNAL="$DEV_WORKSPACE/journal-1.md"
127
+ cat > "$LATEST_JOURNAL" << EOF
128
+ ---
129
+ developer: "$DEVELOPER"
130
+ journal_number: 1
131
+ created_at: "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
132
+ ---
133
+
134
+ # Developer Journal: $DEVELOPER
135
+
136
+ > **[PROTOCOL]**: 变更时更新此头部,然后检查 CLAUDE.md
137
+
138
+ ---
139
+ EOF
140
+ fi
141
+
142
+ TIMESTAMP=$(date +"%Y-%m-%d %H:%M")
143
+ cat >> "$LATEST_JOURNAL" << EOF
144
+ ## [$TIMESTAMP] Requirement Switch
145
+
146
+ **REQ**: $REQ_ID
147
+
148
+ Switched workspace pointer to \`$REQ_ID\`.
149
+
150
+ ---
151
+ EOF
152
+
153
+ # Resolve worktree path
154
+ WORKTREE_DIR=""
155
+ WORKTREE_EXISTS=false
156
+ if declare -f get_worktree_dir_for_req >/dev/null 2>&1; then
157
+ WORKTREE_DIR=$(get_worktree_dir_for_req "$REQ_ID" 2>/dev/null || echo "")
158
+ fi
159
+ if [[ -n "$WORKTREE_DIR" && -d "$WORKTREE_DIR" ]]; then
160
+ WORKTREE_EXISTS=true
161
+ fi
162
+
163
+ # Source detection: cd can only affect caller shell when sourced
164
+ IS_SOURCED=false
165
+ if [[ "${BASH_SOURCE[0]}" != "$0" ]]; then
166
+ IS_SOURCED=true
167
+ fi
168
+
169
+ CD_EXECUTED=false
170
+ if $DO_CD; then
171
+ if ! $WORKTREE_EXISTS; then
172
+ echo "ERROR: Worktree not found for $REQ_ID: $WORKTREE_DIR" >&2
173
+ exit 1
174
+ fi
175
+
176
+ if $IS_SOURCED; then
177
+ cd "$WORKTREE_DIR"
178
+ CD_EXECUTED=true
179
+ fi
180
+ fi
181
+
182
+ # ============================================================================
183
+ # Output
184
+ # ============================================================================
185
+
186
+ if $JSON_MODE; then
187
+ printf '{"developer":"%s","req_id":"%s","workspace":"%s","worktree_dir":"%s","worktree_exists":%s,"cd_executed":%s}\n' \
188
+ "$DEVELOPER" \
189
+ "$REQ_ID" \
190
+ "$DEV_WORKSPACE" \
191
+ "$WORKTREE_DIR" \
192
+ "$WORKTREE_EXISTS" \
193
+ "$CD_EXECUTED"
194
+ return 0 2>/dev/null || exit 0
195
+ fi
196
+
197
+ if $PRINT_CD; then
198
+ if $WORKTREE_EXISTS; then
199
+ printf 'cd "%s"\n' "$WORKTREE_DIR"
200
+ return 0 2>/dev/null || exit 0
201
+ fi
202
+ echo "ERROR: Worktree not found for $REQ_ID: $WORKTREE_DIR" >&2
203
+ exit 1
204
+ fi
205
+
206
+ echo "✅ Workspace switched"
207
+ echo "Developer: $DEVELOPER"
208
+ echo "Current REQ: $REQ_ID"
209
+ echo "Workspace: $DEV_WORKSPACE"
210
+ if [[ -n "$WORKTREE_DIR" ]]; then
211
+ echo "Expected Worktree: $WORKTREE_DIR"
212
+ fi
213
+ echo "Worktree Exists: $WORKTREE_EXISTS"
214
+
215
+ if $DO_CD; then
216
+ if $CD_EXECUTED; then
217
+ echo "Directory switched to: $PWD"
218
+ else
219
+ echo ""
220
+ echo "⚠️ --cd 未生效(脚本以子进程运行,无法修改父 Shell 目录)"
221
+ echo "Use one of:"
222
+ echo " source .claude/scripts/flow-workspace-switch.sh $REQ_ID --cd"
223
+ echo " eval \"\$(.claude/scripts/flow-workspace-switch.sh $REQ_ID --print-cd)\""
224
+ fi
225
+ elif $WORKTREE_EXISTS; then
226
+ echo ""
227
+ echo "Next:"
228
+ echo " cd \"$WORKTREE_DIR\""
229
+ else
230
+ echo ""
231
+ echo "Worktree is missing. Create it with flow-init (default mode) or worktree-create script."
232
+ fi
233
+
234
+ return 0 2>/dev/null || exit 0
@@ -50,7 +50,14 @@ description: 'Initialize requirement structure with brainstorming and research.
50
50
  # 计算路径
51
51
  REPO_NAME=$(basename $(git rev-parse --show-toplevel))
52
52
  WORKTREE_DIR="../${REPO_NAME}-${REQ_ID}"
53
- BRANCH_NAME="feature/${REQ_ID}-${slug(BRANCH_TITLE_EN)}"
53
+
54
+ # 分支前缀按类型决定
55
+ if [[ "${REQ_ID}" =~ ^BUG- ]]; then
56
+ BRANCH_PREFIX="bugfix"
57
+ else
58
+ BRANCH_PREFIX="feature"
59
+ fi
60
+ BRANCH_NAME="${BRANCH_PREFIX}/${REQ_ID}-${slug(BRANCH_TITLE_EN)}"
54
61
 
55
62
  # 创建 worktree + 分支
56
63
  git worktree add -b "$BRANCH_NAME" "$WORKTREE_DIR"
@@ -29,12 +29,19 @@ description: 'Create PR and manage release. Usage: /flow-release "REQ-123" or /f
29
29
  | C) Squash merge | 多提交合并为一 | `gh pr merge --squash` |
30
30
  | D) Cleanup only | 工作被废弃 | `git branch -D` |
31
31
 
32
+ ## Merge Semantics
33
+
34
+ - A) Fast-forward: 直接合并到 `main`
35
+ - B) Create PR: 仅创建/更新 PR,不自动合并
36
+ - C) Squash merge: 通过 PR squash 合并到 `main`
37
+ - D) Cleanup only: 不合并,仅清理
38
+
32
39
  ## Entry Gate
33
40
 
34
41
  1. **PRD.md, TECH_DESIGN.md, EPIC.md, TASKS.md** 存在
35
42
  2. **TEST_REPORT.md, SECURITY_REPORT.md** Gate 均为 PASS
36
43
  3. **Status**: `quality_complete`(兼容 `qa_complete`)或 `release_failed`
37
- 4. **Git**: 工作区干净,在 feature/bugfix 分支
44
+ 4. **Git**: 当前在 feature/bugfix 分支;若工作区不干净,必须先按 `.claude/commands/util/git-commit.md` 完成提交(Conventional Commits + 按同类变更拆分)再继续
38
45
 
39
46
  ## Execution Flow
40
47
 
@@ -51,13 +58,19 @@ description: 'Create PR and manage release. Usage: /flow-release "REQ-123" or /f
51
58
  - 生成 RELEASE_PLAN.md
52
59
  - 生成 PR 描述草稿
53
60
 
54
- ### Stage 3: PR Creation
61
+ ### Stage 3: Commit Gate (MANDATORY)
62
+
63
+ - 检查 `git status --porcelain`
64
+ - 若存在未提交变更,必须先执行 `/util/git-commit`(规则文件 `.claude/commands/util/git-commit.md`)
65
+ - 提交完成后再次确认工作区干净,再进入 PR 创建
66
+
67
+ ### Stage 4: PR Creation
55
68
 
56
69
  使用 `gh` CLI:
57
70
  - 标题: `${REQ_ID}: ${TITLE}`
58
71
  - 正文: agent 输出
59
72
 
60
- ### Stage 4: Worktree/Branch Cleanup
73
+ ### Stage 5: Worktree/Branch Cleanup
61
74
 
62
75
  **Worktree 模式**:
63
76
  ```bash
@@ -91,7 +104,7 @@ git merge --ff-only "$BRANCH_NAME"
91
104
  git branch -d "$BRANCH_NAME"
92
105
  ```
93
106
 
94
- ### Stage 5: Exit Gate
107
+ ### Stage 6: Exit Gate
95
108
 
96
109
  1. RELEASE_PLAN.md 存在
97
110
  2. PR 创建成功
package/CHANGELOG.md CHANGED
@@ -7,6 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ---
9
9
 
10
+ ## [4.1.4] - 2026-02-08
11
+
12
+ ### 🧭 Workspace Worktree Session Recovery & Release Flow Clarity
13
+
14
+ v4.1.4 strengthens workspace-to-worktree continuity so developers can resume a requirement reliably across sessions, and clarifies flow init/release semantics in command and skill docs.
15
+
16
+ #### Added
17
+
18
+ - **Workspace switch script**
19
+ - Added `.claude/scripts/flow-workspace-switch.sh`
20
+ - Supports `REQ/BUG` pointer updates, journal logging, `--print-cd`, and sourced `--cd` switching
21
+
22
+ - **Scripts architecture map**
23
+ - Added `.claude/scripts/CLAUDE.md` as L2 directory map for script responsibilities
24
+
25
+ #### Changed
26
+
27
+ - **Workspace start behavior**
28
+ - `.claude/scripts/flow-workspace-start.sh` now accepts `REQ-XXX/BUG-XXX` override
29
+ - Added `--switch` and sourced `--cd` behavior for faster worktree handoff
30
+ - Added BUG status file compatibility (`devflow/bugs/*/status.json`)
31
+
32
+ - **Requirement initialization linkage**
33
+ - `.claude/scripts/create-requirement.sh` now syncs `devflow/workspace/{developer}/.current-req` when workspace exists
34
+
35
+ - **Flow docs and skills alignment**
36
+ - Updated flow init/release/workspace command docs and workflow skills to reflect:
37
+ - default worktree naming semantics
38
+ - merge semantics by release strategy
39
+ - workspace continuity expectations
40
+
41
+ #### Benefits
42
+
43
+ - ✅ New session recovery can target the intended REQ/BUG directly
44
+ - ✅ Worktree switching is faster and less error-prone via generated `cd` commands
45
+ - ✅ Flow release semantics are clearer when deciding between PR-only vs merge paths
46
+
10
47
  ## [4.1.3] - 2026-02-08
11
48
 
12
49
  ### 🔧 Flow Quality Default Path + AGENTS.md Safe Emit
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-devflow",
3
- "version": "4.1.3",
3
+ "version": "4.1.4",
4
4
  "description": "DevFlow CLI tool",
5
5
  "main": "bin/cc-devflow.js",
6
6
  "bin": {