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 +3 -2
- package/.claude/commands/flow/init.md +16 -1
- package/.claude/commands/flow/release.md +30 -6
- package/.claude/commands/flow/workspace.md +30 -4
- package/.claude/scripts/CLAUDE.md +79 -0
- package/.claude/scripts/create-requirement.sh +12 -0
- package/.claude/scripts/flow-workspace-start.sh +135 -6
- package/.claude/scripts/flow-workspace-switch.sh +234 -0
- package/.claude/skills/workflow/flow-init/SKILL.md +8 -1
- package/.claude/skills/workflow/flow-release/SKILL.md +17 -4
- package/CHANGELOG.md +37 -0
- package/package.json +1 -1
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
|
-
│
|
|
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/
|
|
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
|
-
→
|
|
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.
|
|
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
|
-
|
|
111
|
+
3. 检查 CLAUDE.md:
|
|
99
112
|
→ 若 TECH_DESIGN 引入新基础设施/重大变更,更新 "## Technical Architecture"(≤15 行)
|
|
100
|
-
|
|
113
|
+
4. 状态更新:
|
|
101
114
|
→ orchestration_status.status = "release_complete"
|
|
102
115
|
→ completedSteps append "release"
|
|
103
116
|
→ prUrl 记录到状态文件
|
|
104
|
-
|
|
105
|
-
|
|
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.
|
|
62
|
-
4.
|
|
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
|
-
#
|
|
23
|
+
# Parse Arguments
|
|
19
24
|
# ============================================================================
|
|
20
25
|
|
|
21
|
-
|
|
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
|
-
#
|
|
44
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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**:
|
|
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:
|
|
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
|
|
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
|
|
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
|