cc-devflow 2.4.6 → 4.1.0

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 (191) hide show
  1. package/.claude/CLAUDE.md +1065 -48
  2. package/.claude/agents/dev-implementer.md +195 -0
  3. package/.claude/commands/{flow-archive.md → flow/archive.md} +46 -11
  4. package/.claude/commands/flow/context.md +150 -0
  5. package/.claude/commands/flow/delta.md +245 -0
  6. package/.claude/commands/{flow-dev.md → flow/dev.md} +112 -11
  7. package/.claude/commands/flow/init.md +45 -0
  8. package/.claude/commands/flow/quality.md +159 -0
  9. package/.claude/commands/flow/spec.md +186 -0
  10. package/.claude/commands/flow/workspace.md +146 -0
  11. package/.claude/commands/{cancel-ralph.md → util/cancel-ralph.md} +1 -0
  12. package/.claude/config/quality-gates.yml +305 -0
  13. package/.claude/docs/guides/TEAM_MODE_GUIDE.md +313 -0
  14. package/.claude/docs/templates/DELTA_SPEC_TEMPLATE.md +91 -0
  15. package/.claude/docs/templates/DESIGN_DECISIONS_TEMPLATE.md +151 -0
  16. package/.claude/docs/templates/JOURNAL_TEMPLATE.md +75 -0
  17. package/.claude/docs/templates/_shared/CLAUDE.md +36 -0
  18. package/.claude/docs/templates/_shared/CONSTITUTION_CHECK.md +125 -0
  19. package/.claude/docs/templates/_shared/VALIDATION_CHECKLIST.md +187 -0
  20. package/.claude/docs/templates/_shared/YAML_FRONTMATTER.md +164 -0
  21. package/.claude/docs/templates/context/dev.jsonl.template +6 -0
  22. package/.claude/docs/templates/context/epic.jsonl.template +5 -0
  23. package/.claude/docs/templates/context/prd.jsonl.template +4 -0
  24. package/.claude/docs/templates/context/research.jsonl.template +4 -0
  25. package/.claude/docs/templates/context/review.jsonl.template +5 -0
  26. package/.claude/docs/templates/context/tech.jsonl.template +5 -0
  27. package/.claude/hooks/CLAUDE.md +342 -0
  28. package/.claude/hooks/inject-agent-context.ts +480 -0
  29. package/.claude/hooks/inject-skill-context.ts +359 -0
  30. package/.claude/hooks/ralph-loop.ts +931 -0
  31. package/.claude/hooks/task-completed-hook.ts +593 -0
  32. package/.claude/hooks/teammate-idle-hook.ts +690 -0
  33. package/.claude/hooks/types/team-types.d.ts +238 -0
  34. package/.claude/rules/devflow-conventions.md +82 -9
  35. package/.claude/scripts/archive-requirement.sh +44 -1
  36. package/.claude/scripts/common.sh +670 -3
  37. package/.claude/scripts/delta-parser.ts +527 -0
  38. package/.claude/scripts/detect-file-conflicts.sh +151 -0
  39. package/.claude/scripts/flow-context-add.sh +134 -0
  40. package/.claude/scripts/flow-context-init.sh +133 -0
  41. package/.claude/scripts/flow-context-validate.sh +144 -0
  42. package/.claude/scripts/flow-delta-apply.sh +297 -0
  43. package/.claude/scripts/flow-delta-archive.sh +71 -0
  44. package/.claude/scripts/flow-delta-create.sh +202 -0
  45. package/.claude/scripts/flow-delta-list.sh +142 -0
  46. package/.claude/scripts/flow-delta-status.sh +235 -0
  47. package/.claude/scripts/flow-quality-full.sh +184 -0
  48. package/.claude/scripts/flow-quality-quick.sh +64 -0
  49. package/.claude/scripts/flow-workspace-init.sh +117 -0
  50. package/.claude/scripts/flow-workspace-record.sh +164 -0
  51. package/.claude/scripts/flow-workspace-start.sh +88 -0
  52. package/.claude/scripts/get-workflow-status.sh +415 -0
  53. package/.claude/scripts/parse-task-dependencies.js +334 -0
  54. package/.claude/scripts/record-quality-error.sh +165 -0
  55. package/.claude/scripts/run-quality-gates.sh +242 -0
  56. package/.claude/scripts/team-dev-init.sh +319 -0
  57. package/.claude/scripts/team-state-recovery.sh +229 -0
  58. package/.claude/scripts/workflow-status.ts +433 -0
  59. package/.claude/settings.json +19 -0
  60. package/.claude/skills/cc-devflow-orchestrator/SKILL.md +85 -200
  61. package/.claude/skills/domain/using-git-worktrees/SKILL.md +252 -0
  62. package/.claude/skills/domain/using-git-worktrees/assets/SHELL_ALIASES.md +133 -0
  63. package/.claude/skills/domain/using-git-worktrees/context.jsonl +4 -0
  64. package/.claude/skills/domain/using-git-worktrees/scripts/worktree-cleanup.sh +218 -0
  65. package/.claude/skills/domain/using-git-worktrees/scripts/worktree-create.sh +232 -0
  66. package/.claude/skills/domain/using-git-worktrees/scripts/worktree-list.sh +130 -0
  67. package/.claude/skills/domain/using-git-worktrees/scripts/worktree-status.sh +140 -0
  68. package/.claude/skills/domain/using-git-worktrees/scripts/worktree-switch.sh +70 -0
  69. package/.claude/skills/skill-rules.json +72 -1
  70. package/.claude/skills/utility/journey-checker/SKILL.md +199 -0
  71. package/.claude/skills/utility/journey-checker/pressure-scenarios.md +164 -0
  72. package/.claude/skills/utility/skill-creator/LICENSE.txt +202 -0
  73. package/.claude/skills/utility/skill-creator/SKILL.md +356 -0
  74. package/.claude/skills/utility/skill-creator/references/output-patterns.md +82 -0
  75. package/.claude/skills/utility/skill-creator/references/workflows.md +28 -0
  76. package/.claude/skills/utility/skill-creator/scripts/init_skill.py +303 -0
  77. package/.claude/skills/utility/skill-creator/scripts/package_skill.py +110 -0
  78. package/.claude/skills/utility/skill-creator/scripts/quick_validate.py +95 -0
  79. package/.claude/skills/workflow/flow-dev/CLAUDE.md +78 -0
  80. package/.claude/skills/workflow/flow-dev/SKILL.md +96 -0
  81. package/.claude/skills/workflow/flow-dev/assets/IMPLEMENTATION_PLAN_TEMPLATE.md +71 -0
  82. package/.claude/skills/workflow/flow-dev/context.jsonl +8 -0
  83. package/.claude/skills/workflow/flow-dev/dev-implementer.jsonl +8 -0
  84. package/.claude/skills/workflow/flow-dev/scripts/entry-gate.sh +116 -0
  85. package/.claude/skills/workflow/flow-dev/scripts/exit-gate.sh +101 -0
  86. package/.claude/skills/workflow/flow-dev/scripts/task-orchestrator.sh +106 -0
  87. package/.claude/skills/workflow/flow-fix/SKILL.md +105 -0
  88. package/.claude/skills/workflow/flow-fix/context.jsonl +6 -0
  89. package/.claude/skills/workflow/flow-fix/references/bug-analyzer.md +381 -0
  90. package/.claude/skills/workflow/flow-init/SKILL.md +211 -0
  91. package/.claude/skills/workflow/flow-init/assets/BRAINSTORM_TEMPLATE.md +148 -0
  92. package/.claude/skills/workflow/flow-init/assets/INIT_FLOW_TEMPLATE.md +198 -0
  93. package/.claude/skills/workflow/flow-init/assets/RESEARCH_TEMPLATE.md +276 -0
  94. package/.claude/skills/workflow/flow-init/context.jsonl +5 -0
  95. package/.claude/skills/workflow/flow-init/references/flow-researcher.md +132 -0
  96. package/.claude/skills/workflow/flow-init/scripts/check-prerequisites.sh +232 -0
  97. package/.claude/skills/workflow/flow-init/scripts/consolidate-research.sh +182 -0
  98. package/.claude/skills/workflow/flow-init/scripts/create-requirement.sh +515 -0
  99. package/.claude/skills/workflow/flow-init/scripts/generate-research-tasks.sh +157 -0
  100. package/.claude/skills/workflow/flow-init/scripts/populate-research-tasks.sh +284 -0
  101. package/.claude/skills/workflow/flow-init/scripts/validate-research.sh +332 -0
  102. package/.claude/skills/workflow/flow-quality/SKILL.md +94 -0
  103. package/.claude/skills/workflow/flow-quality/context.jsonl +6 -0
  104. package/.claude/skills/workflow/flow-quality/references/code-quality-reviewer.md +205 -0
  105. package/.claude/skills/workflow/flow-quality/references/qa-tester.md +313 -0
  106. package/.claude/skills/workflow/flow-quality/references/security-reviewer.md +314 -0
  107. package/.claude/skills/workflow/flow-quality/references/spec-reviewer.md +221 -0
  108. package/.claude/skills/workflow/flow-release/SKILL.md +126 -0
  109. package/.claude/skills/workflow/flow-release/context.jsonl +7 -0
  110. package/.claude/skills/workflow/flow-release/references/release-manager.md +295 -0
  111. package/.claude/skills/workflow/flow-spec/CLAUDE.md +103 -0
  112. package/.claude/skills/workflow/flow-spec/SKILL.md +545 -0
  113. package/.claude/skills/workflow/flow-spec/context.jsonl +7 -0
  114. package/.claude/skills/workflow/flow-spec/scripts/entry-gate.sh +194 -0
  115. package/.claude/skills/workflow/flow-spec/scripts/exit-gate.sh +244 -0
  116. package/.claude/skills/workflow/flow-spec/scripts/parallel-orchestrator.sh +205 -0
  117. package/.claude/skills/workflow/flow-spec/scripts/team-communication.sh +353 -0
  118. package/.claude/skills/workflow/flow-spec/scripts/team-init.sh +195 -0
  119. package/.claude/skills/workflow/flow-spec/scripts/test-team-mode.sh +496 -0
  120. package/.claude/skills/workflow/flow-spec/team-config.json +165 -0
  121. package/.claude/skills/workflow.yaml +417 -0
  122. package/CHANGELOG.md +254 -0
  123. package/README.md +193 -33
  124. package/README.zh-CN.md +206 -46
  125. package/lib/compiler/CLAUDE.md +77 -46
  126. package/lib/compiler/__tests__/multi-module-emitters.test.js +508 -0
  127. package/lib/compiler/context-expander.js +179 -0
  128. package/lib/compiler/emitters/antigravity-emitter.js +195 -5
  129. package/lib/compiler/emitters/base-emitter.js +217 -2
  130. package/lib/compiler/emitters/codex-emitter.js +200 -4
  131. package/lib/compiler/emitters/cursor-emitter.js +307 -3
  132. package/lib/compiler/emitters/qwen-emitter.js +196 -4
  133. package/lib/compiler/index.js +197 -2
  134. package/lib/compiler/platforms.js +270 -21
  135. package/package.json +1 -1
  136. package/.claude/commands/flow-epic.md +0 -183
  137. package/.claude/commands/flow-init.md +0 -370
  138. package/.claude/commands/flow-prd.md +0 -144
  139. package/.claude/commands/flow-qa.md +0 -93
  140. package/.claude/commands/flow-review.md +0 -257
  141. package/.claude/commands/flow-tech.md +0 -142
  142. package/.claude/commands/flow-ui.md +0 -189
  143. package/.claude/skills/file-header-guardian/SKILL.md +0 -56
  144. package/.claude/skills/skill-developer/ADVANCED.md +0 -197
  145. package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +0 -306
  146. package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +0 -152
  147. package/.claude/skills/skill-developer/SKILL.md +0 -426
  148. package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +0 -315
  149. package/.claude/skills/skill-developer/TRIGGER_TYPES.md +0 -305
  150. package/.claude/skills/skill-developer/TROUBLESHOOTING.md +0 -514
  151. package/.claude/skills/writing-skills/SKILL.md +0 -655
  152. package/.claude/skills/writing-skills/anthropic-best-practices.md +0 -1150
  153. package/.claude/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
  154. package/.claude/skills/writing-skills/graphviz-conventions.dot +0 -172
  155. package/.claude/skills/writing-skills/persuasion-principles.md +0 -187
  156. package/.claude/skills/writing-skills/render-graphs.js +0 -168
  157. package/.claude/skills/writing-skills/testing-skills-with-subagents.md +0 -384
  158. package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/affected-repos.txt +0 -1
  159. package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/affected-repos.txt +0 -1
  160. /package/.claude/commands/{core-architecture.md → core/architecture.md} +0 -0
  161. /package/.claude/commands/{core-guidelines.md → core/guidelines.md} +0 -0
  162. /package/.claude/commands/{core-roadmap.md → core/roadmap.md} +0 -0
  163. /package/.claude/commands/{core-style.md → core/style.md} +0 -0
  164. /package/.claude/commands/{flow-checklist.md → flow/checklist.md} +0 -0
  165. /package/.claude/commands/{flow-clarify.md → flow/clarify.md} +0 -0
  166. /package/.claude/commands/{flow-constitution.md → flow/constitution.md} +0 -0
  167. /package/.claude/commands/{flow-fix.md → flow/fix.md} +0 -0
  168. /package/.claude/commands/{flow-ideate.md → flow/ideate.md} +0 -0
  169. /package/.claude/commands/{flow-new.md → flow/new.md} +0 -0
  170. /package/.claude/commands/{flow-release.md → flow/release.md} +0 -0
  171. /package/.claude/commands/{flow-restart.md → flow/restart.md} +0 -0
  172. /package/.claude/commands/{flow-status.md → flow/status.md} +0 -0
  173. /package/.claude/commands/{flow-update.md → flow/update.md} +0 -0
  174. /package/.claude/commands/{flow-upgrade.md → flow/upgrade.md} +0 -0
  175. /package/.claude/commands/{flow-verify.md → flow/verify.md} +0 -0
  176. /package/.claude/commands/{code-review-high.md → util/code-review.md} +0 -0
  177. /package/.claude/commands/{git-commit.md → util/git-commit.md} +0 -0
  178. /package/.claude/commands/{problem-analyzer.md → util/problem-analyzer.md} +0 -0
  179. /package/.claude/skills/{flow-attention-refresh → domain/attention-refresh}/SKILL.md +0 -0
  180. /package/.claude/skills/{flow-brainstorming → domain/brainstorming}/SKILL.md +0 -0
  181. /package/.claude/skills/{flow-debugging → domain/debugging}/SKILL.md +0 -0
  182. /package/.claude/skills/{flow-finishing-branch → domain/finishing-branch}/SKILL.md +0 -0
  183. /package/.claude/skills/{flow-receiving-review → domain/receiving-review}/SKILL.md +0 -0
  184. /package/.claude/skills/{flow-tdd → domain/tdd}/SKILL.md +0 -0
  185. /package/.claude/skills/{verification-before-completion → domain/verification}/SKILL.md +0 -0
  186. /package/.claude/skills/{constitution-guardian → guardrail/constitution-guardian}/SKILL.md +0 -0
  187. /package/.claude/skills/{devflow-tdd-enforcer → guardrail/tdd-enforcer}/SKILL.md +0 -0
  188. /package/.claude/skills/{devflow-constitution-quick-ref → utility/constitution-quick-ref}/SKILL.md +0 -0
  189. /package/.claude/skills/{devflow-file-standards → utility/file-standards}/SKILL.md +0 -0
  190. /package/.claude/skills/{fractal-docs-generator → utility/fractal-docs}/SKILL.md +0 -0
  191. /package/.claude/skills/{npm-release → utility/npm-release}/SKILL.md +0 -0
@@ -0,0 +1,71 @@
1
+ #!/bin/bash
2
+ # [INPUT]: 依赖 delta-specs/ 目录
3
+ # [OUTPUT]: 归档到 devflow/archive/
4
+ # [POS]: scripts 的 delta spec 归档脚本,被 /flow-delta archive 调用
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
+ ARCHIVE_DIR="$PROJECT_ROOT/devflow/archive"
16
+
17
+ # ============================================================================
18
+ # Parse Arguments
19
+ # ============================================================================
20
+
21
+ REQ_ID="${1:-}"
22
+
23
+ # Auto-detect REQ-ID
24
+ if [[ -z "$REQ_ID" ]]; then
25
+ REQ_ID="${DEVFLOW_REQ_ID:-}"
26
+ fi
27
+
28
+ if [[ -z "$REQ_ID" ]]; then
29
+ BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
30
+ REQ_ID=$(echo "$BRANCH" | grep -oE 'REQ-[0-9]+' | head -1 || echo "")
31
+ fi
32
+
33
+ if [[ -z "$REQ_ID" ]]; then
34
+ echo "Error: Could not detect REQ-ID"
35
+ echo "Usage: flow-delta-archive.sh [REQ-ID]"
36
+ exit 1
37
+ fi
38
+
39
+ # ============================================================================
40
+ # Main Logic
41
+ # ============================================================================
42
+
43
+ REQ_DIR="$PROJECT_ROOT/devflow/requirements/$REQ_ID"
44
+ DELTA_DIR="$REQ_DIR/delta-specs"
45
+
46
+ if [[ ! -d "$DELTA_DIR" ]]; then
47
+ echo "No delta-specs found for $REQ_ID"
48
+ exit 0
49
+ fi
50
+
51
+ # Create archive directory with date prefix
52
+ DATE_PREFIX=$(date +"%Y-%m")
53
+ ARCHIVE_TARGET="$ARCHIVE_DIR/$DATE_PREFIX/$REQ_ID/delta-specs"
54
+
55
+ echo "Archiving delta-specs for $REQ_ID..."
56
+ echo " From: $DELTA_DIR"
57
+ echo " To: $ARCHIVE_TARGET"
58
+
59
+ # Create archive directory
60
+ mkdir -p "$ARCHIVE_TARGET"
61
+
62
+ # Copy delta-specs to archive
63
+ cp -r "$DELTA_DIR"/* "$ARCHIVE_TARGET/"
64
+
65
+ # Remove original delta-specs
66
+ rm -rf "$DELTA_DIR"
67
+
68
+ echo ""
69
+ echo "✅ Delta specs archived successfully"
70
+ echo ""
71
+ echo "Archive location: $ARCHIVE_TARGET"
@@ -0,0 +1,202 @@
1
+ #!/bin/bash
2
+ # [INPUT]: 依赖 DELTA_SPEC_TEMPLATE.md
3
+ # [OUTPUT]: 创建 deltas/{date}-{slug}/delta.md
4
+ # [POS]: scripts 的 delta spec 创建脚本,被 /flow:delta create 调用
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
+ TEMPLATE_FILE="$PROJECT_ROOT/.claude/docs/templates/DELTA_SPEC_TEMPLATE.md"
16
+
17
+ # ============================================================================
18
+ # Usage
19
+ # ============================================================================
20
+
21
+ usage() {
22
+ cat << EOF
23
+ Usage: flow-delta-create.sh <REQ-ID> <slug> [title]
24
+
25
+ Create a new delta spec for a requirement.
26
+
27
+ Arguments:
28
+ REQ-ID Requirement ID (e.g., REQ-123)
29
+ slug Short identifier for the delta (e.g., add-2fa)
30
+ title Optional title (defaults to slug with spaces)
31
+
32
+ Examples:
33
+ flow-delta-create.sh REQ-123 add-2fa
34
+ flow-delta-create.sh REQ-123 add-2fa "Add Two-Factor Authentication"
35
+ EOF
36
+ exit 1
37
+ }
38
+
39
+ # ============================================================================
40
+ # Parse Arguments
41
+ # ============================================================================
42
+
43
+ REQ_ID="$1"
44
+ SLUG="$2"
45
+ TITLE="${3:-}"
46
+
47
+ if [[ -z "$REQ_ID" || -z "$SLUG" ]]; then
48
+ echo "Error: REQ-ID and slug are required"
49
+ usage
50
+ fi
51
+
52
+ # Validate REQ-ID format
53
+ if [[ ! "$REQ_ID" =~ ^REQ-[0-9]+$ ]]; then
54
+ echo "Error: Invalid REQ-ID format. Expected: REQ-XXX"
55
+ exit 1
56
+ fi
57
+
58
+ # Generate title from slug if not provided
59
+ if [[ -z "$TITLE" ]]; then
60
+ TITLE=$(echo "$SLUG" | sed 's/-/ /g' | sed 's/\b\(.\)/\u\1/g')
61
+ fi
62
+
63
+ # ============================================================================
64
+ # Main Logic
65
+ # ============================================================================
66
+
67
+ REQ_DIR="$PROJECT_ROOT/devflow/requirements/$REQ_ID"
68
+
69
+ if [[ ! -d "$REQ_DIR" ]]; then
70
+ echo "Error: Requirement directory not found: $REQ_DIR"
71
+ exit 1
72
+ fi
73
+
74
+ # Generate delta_id with date prefix
75
+ DATE_PREFIX=$(date +"%Y-%m-%d")
76
+ DELTA_ID="${DATE_PREFIX}-${SLUG}"
77
+ DELTA_DIR="$REQ_DIR/deltas/$DELTA_ID"
78
+ DELTA_FILE="$DELTA_DIR/delta.md"
79
+ TASKS_FILE="$DELTA_DIR/tasks.md"
80
+
81
+ # Check if delta already exists
82
+ if [[ -d "$DELTA_DIR" ]]; then
83
+ echo "Error: Delta already exists: $DELTA_DIR"
84
+ exit 1
85
+ fi
86
+
87
+ # Create delta directory
88
+ mkdir -p "$DELTA_DIR"
89
+
90
+ # Generate timestamp
91
+ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
92
+
93
+ # Create delta.md from template
94
+ if [[ -f "$TEMPLATE_FILE" ]]; then
95
+ sed -e "s/{DELTA_ID}/$DELTA_ID/g" \
96
+ -e "s/{REQ_ID}/$REQ_ID/g" \
97
+ -e "s/{TITLE}/$TITLE/g" \
98
+ -e "s/{TIMESTAMP}/$TIMESTAMP/g" \
99
+ -e "s/{AUTHOR}/Claude/g" \
100
+ "$TEMPLATE_FILE" > "$DELTA_FILE"
101
+ else
102
+ # Create minimal delta spec
103
+ cat > "$DELTA_FILE" << EOF
104
+ ---
105
+ delta_id: "$DELTA_ID"
106
+ req_id: "$REQ_ID"
107
+ title: "$TITLE"
108
+ created_at: "$TIMESTAMP"
109
+ status: "draft"
110
+ ---
111
+
112
+ # Delta: $TITLE
113
+
114
+ > **[PROTOCOL]**: 变更时更新此头部,然后检查 CLAUDE.md
115
+
116
+ ## Summary
117
+
118
+ {简要描述变更内容}
119
+
120
+ ---
121
+
122
+ ## ADDED Requirements
123
+
124
+ ### Requirement: {Name}
125
+
126
+ {Description}
127
+
128
+ #### Scenario: {Scenario Name}
129
+
130
+ - GIVEN {precondition}
131
+ - WHEN {action}
132
+ - THEN {expected result}
133
+
134
+ ---
135
+
136
+ ## MODIFIED Requirements
137
+
138
+ ### Requirement: {Name}
139
+
140
+ {New description}
141
+
142
+ (Previously: {old description})
143
+
144
+ ---
145
+
146
+ ## REMOVED Requirements
147
+
148
+ ### Requirement: {Name}
149
+
150
+ **Reason**: {why removed}
151
+
152
+ **Migration**: {how to migrate}
153
+
154
+ ---
155
+
156
+ ## RENAMED Requirements
157
+
158
+ - FROM: {Old Name}
159
+ - TO: {New Name}
160
+
161
+ ---
162
+
163
+ **Author**: Claude
164
+ **Reviewed By**: Pending
165
+ EOF
166
+ fi
167
+
168
+ # Create tasks.md for delta-specific tasks
169
+ cat > "$TASKS_FILE" << EOF
170
+ ---
171
+ delta_id: "$DELTA_ID"
172
+ req_id: "$REQ_ID"
173
+ created_at: "$TIMESTAMP"
174
+ ---
175
+
176
+ # Tasks for Delta: $TITLE
177
+
178
+ > **[PROTOCOL]**: 变更时更新此头部,然后检查 CLAUDE.md
179
+
180
+ ## Tasks
181
+
182
+ - [ ] T001: Review delta specification
183
+ - [ ] T002: Implement changes
184
+ - [ ] T003: Update tests
185
+ - [ ] T004: Update documentation
186
+
187
+ ## Notes
188
+
189
+ Add implementation notes here.
190
+ EOF
191
+
192
+ echo "✅ Created delta: $DELTA_ID"
193
+ echo ""
194
+ echo "Files created:"
195
+ echo " - $DELTA_FILE"
196
+ echo " - $TASKS_FILE"
197
+ echo ""
198
+ echo "Next steps:"
199
+ echo " 1. Edit delta.md to add ADDED/MODIFIED/REMOVED/RENAMED sections"
200
+ echo " 2. Run '/flow:delta status $REQ_ID $SLUG' to validate"
201
+ echo " 3. Change status to 'approved' when ready"
202
+ echo " 4. Run '/flow:delta apply $REQ_ID $SLUG' to apply changes"
@@ -0,0 +1,142 @@
1
+ #!/bin/bash
2
+ # [INPUT]: 依赖 deltas/ 目录
3
+ # [OUTPUT]: 列出所有 delta specs
4
+ # [POS]: scripts 的 delta spec 列表脚本,被 /flow:delta list 调用
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
+
16
+ # ============================================================================
17
+ # Usage
18
+ # ============================================================================
19
+
20
+ usage() {
21
+ cat << EOF
22
+ Usage: flow-delta-list.sh <REQ-ID>
23
+
24
+ List all delta specs for a requirement.
25
+
26
+ Arguments:
27
+ REQ-ID Requirement ID (e.g., REQ-123)
28
+
29
+ Examples:
30
+ flow-delta-list.sh REQ-123
31
+ EOF
32
+ exit 1
33
+ }
34
+
35
+ # ============================================================================
36
+ # Parse Arguments
37
+ # ============================================================================
38
+
39
+ REQ_ID="$1"
40
+
41
+ if [[ -z "$REQ_ID" ]]; then
42
+ # Try to auto-detect from environment or branch
43
+ REQ_ID="${DEVFLOW_REQ_ID:-}"
44
+ if [[ -z "$REQ_ID" ]]; then
45
+ BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
46
+ REQ_ID=$(echo "$BRANCH" | grep -oE 'REQ-[0-9]+' | head -1 || echo "")
47
+ fi
48
+ fi
49
+
50
+ if [[ -z "$REQ_ID" ]]; then
51
+ echo "Error: REQ-ID is required"
52
+ usage
53
+ fi
54
+
55
+ # Validate REQ-ID format
56
+ if [[ ! "$REQ_ID" =~ ^REQ-[0-9]+$ ]]; then
57
+ echo "Error: Invalid REQ-ID format. Expected: REQ-XXX"
58
+ exit 1
59
+ fi
60
+
61
+ # ============================================================================
62
+ # Main Logic
63
+ # ============================================================================
64
+
65
+ REQ_DIR="$PROJECT_ROOT/devflow/requirements/$REQ_ID"
66
+ DELTAS_DIR="$REQ_DIR/deltas"
67
+
68
+ if [[ ! -d "$REQ_DIR" ]]; then
69
+ echo "Error: Requirement directory not found: $REQ_DIR"
70
+ exit 1
71
+ fi
72
+
73
+ if [[ ! -d "$DELTAS_DIR" ]]; then
74
+ echo "No deltas found for $REQ_ID"
75
+ exit 0
76
+ fi
77
+
78
+ echo "Deltas for $REQ_ID:"
79
+ echo ""
80
+
81
+ COUNT=0
82
+ DRAFT_COUNT=0
83
+ REVIEW_COUNT=0
84
+ APPROVED_COUNT=0
85
+ APPLIED_COUNT=0
86
+
87
+ # List all delta directories
88
+ for delta_dir in "$DELTAS_DIR"/*/; do
89
+ if [[ ! -d "$delta_dir" ]]; then
90
+ continue
91
+ fi
92
+
93
+ DELTA_ID=$(basename "$delta_dir")
94
+ DELTA_FILE="$delta_dir/delta.md"
95
+
96
+ if [[ ! -f "$DELTA_FILE" ]]; then
97
+ continue
98
+ fi
99
+
100
+ ((COUNT++))
101
+
102
+ # Extract status and title from frontmatter
103
+ STATUS="unknown"
104
+ TITLE=""
105
+
106
+ while IFS= read -r line; do
107
+ if [[ "$line" =~ ^status:[[:space:]]*\"?([^\"]+)\"? ]]; then
108
+ STATUS="${BASH_REMATCH[1]}"
109
+ elif [[ "$line" =~ ^title:[[:space:]]*\"?([^\"]+)\"? ]]; then
110
+ TITLE="${BASH_REMATCH[1]}"
111
+ fi
112
+ done < <(head -20 "$DELTA_FILE")
113
+
114
+ # Count by status
115
+ case "$STATUS" in
116
+ draft) ((DRAFT_COUNT++)) ;;
117
+ review) ((REVIEW_COUNT++)) ;;
118
+ approved) ((APPROVED_COUNT++)) ;;
119
+ applied) ((APPLIED_COUNT++)) ;;
120
+ esac
121
+
122
+ # Format status with padding
123
+ STATUS_PADDED=$(printf "%-10s" "[$STATUS]")
124
+
125
+ printf " %2d. %-25s %s %s\n" "$COUNT" "$DELTA_ID" "$STATUS_PADDED" "$TITLE"
126
+ done
127
+
128
+ echo ""
129
+ echo "Total: $COUNT deltas"
130
+
131
+ # Show breakdown if there are deltas
132
+ if [[ $COUNT -gt 0 ]]; then
133
+ BREAKDOWN=""
134
+ [[ $DRAFT_COUNT -gt 0 ]] && BREAKDOWN="$DRAFT_COUNT draft"
135
+ [[ $REVIEW_COUNT -gt 0 ]] && BREAKDOWN="${BREAKDOWN:+$BREAKDOWN, }$REVIEW_COUNT review"
136
+ [[ $APPROVED_COUNT -gt 0 ]] && BREAKDOWN="${BREAKDOWN:+$BREAKDOWN, }$APPROVED_COUNT approved"
137
+ [[ $APPLIED_COUNT -gt 0 ]] && BREAKDOWN="${BREAKDOWN:+$BREAKDOWN, }$APPLIED_COUNT applied"
138
+
139
+ if [[ -n "$BREAKDOWN" ]]; then
140
+ echo " ($BREAKDOWN)"
141
+ fi
142
+ fi
@@ -0,0 +1,235 @@
1
+ #!/bin/bash
2
+ # [INPUT]: 依赖 deltas/{delta-id}/delta.md, delta-parser.ts
3
+ # [OUTPUT]: 显示 delta 状态和验证结果
4
+ # [POS]: scripts 的 delta spec 状态脚本,被 /flow:delta status 调用
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
+ PARSER_SCRIPT="$SCRIPT_DIR/delta-parser.ts"
16
+
17
+ # ============================================================================
18
+ # Usage
19
+ # ============================================================================
20
+
21
+ usage() {
22
+ cat << EOF
23
+ Usage: flow-delta-status.sh <REQ-ID> <delta-slug>
24
+
25
+ Check the status of a specific delta spec.
26
+
27
+ Arguments:
28
+ REQ-ID Requirement ID (e.g., REQ-123)
29
+ delta-slug Delta identifier (e.g., add-2fa or 2026-02-01-add-2fa)
30
+
31
+ Examples:
32
+ flow-delta-status.sh REQ-123 add-2fa
33
+ EOF
34
+ exit 1
35
+ }
36
+
37
+ # ============================================================================
38
+ # Parse Arguments
39
+ # ============================================================================
40
+
41
+ REQ_ID="$1"
42
+ DELTA_SLUG="$2"
43
+
44
+ if [[ -z "$REQ_ID" || -z "$DELTA_SLUG" ]]; then
45
+ echo "Error: REQ-ID and delta-slug are required"
46
+ usage
47
+ fi
48
+
49
+ # Validate REQ-ID format
50
+ if [[ ! "$REQ_ID" =~ ^REQ-[0-9]+$ ]]; then
51
+ echo "Error: Invalid REQ-ID format. Expected: REQ-XXX"
52
+ exit 1
53
+ fi
54
+
55
+ # ============================================================================
56
+ # Helper Functions
57
+ # ============================================================================
58
+
59
+ find_delta_dir() {
60
+ local req_dir="$1"
61
+ local slug="$2"
62
+ local deltas_dir="$req_dir/deltas"
63
+
64
+ # Try exact match first
65
+ if [[ -d "$deltas_dir/$slug" ]]; then
66
+ echo "$deltas_dir/$slug"
67
+ return 0
68
+ fi
69
+
70
+ # Try to find by suffix (slug without date prefix)
71
+ for dir in "$deltas_dir"/*-"$slug"; do
72
+ if [[ -d "$dir" ]]; then
73
+ echo "$dir"
74
+ return 0
75
+ fi
76
+ done
77
+
78
+ return 1
79
+ }
80
+
81
+ extract_frontmatter_value() {
82
+ local file="$1"
83
+ local key="$2"
84
+ grep -E "^$key:" "$file" | head -1 | sed "s/$key:[[:space:]]*\"\?\([^\"]*\)\"\?/\1/"
85
+ }
86
+
87
+ count_section_items() {
88
+ local file="$1"
89
+ local section="$2"
90
+
91
+ # Count ### Requirement: headers in the section
92
+ awk -v section="$section" '
93
+ /^## / { in_section = ($0 ~ section) }
94
+ in_section && /^### Requirement:/ { count++ }
95
+ END { print count+0 }
96
+ ' "$file"
97
+ }
98
+
99
+ count_renamed_pairs() {
100
+ local file="$1"
101
+
102
+ # Count FROM:/TO: pairs in RENAMED section
103
+ awk '
104
+ /^## RENAMED/ { in_section = 1 }
105
+ /^## / && !/^## RENAMED/ { in_section = 0 }
106
+ in_section && /^- FROM:/ { count++ }
107
+ END { print count+0 }
108
+ ' "$file"
109
+ }
110
+
111
+ # ============================================================================
112
+ # Main Logic
113
+ # ============================================================================
114
+
115
+ REQ_DIR="$PROJECT_ROOT/devflow/requirements/$REQ_ID"
116
+ DELTAS_DIR="$REQ_DIR/deltas"
117
+
118
+ if [[ ! -d "$REQ_DIR" ]]; then
119
+ echo "Error: Requirement directory not found: $REQ_DIR"
120
+ exit 1
121
+ fi
122
+
123
+ # Find the delta directory
124
+ DELTA_DIR=$(find_delta_dir "$REQ_DIR" "$DELTA_SLUG")
125
+
126
+ if [[ -z "$DELTA_DIR" || ! -d "$DELTA_DIR" ]]; then
127
+ echo "Error: Delta not found: $DELTA_SLUG"
128
+ echo "Available deltas:"
129
+ ls -1 "$DELTAS_DIR" 2>/dev/null || echo " (none)"
130
+ exit 1
131
+ fi
132
+
133
+ DELTA_ID=$(basename "$DELTA_DIR")
134
+ DELTA_FILE="$DELTA_DIR/delta.md"
135
+ PRD_FILE="$REQ_DIR/PRD.md"
136
+
137
+ if [[ ! -f "$DELTA_FILE" ]]; then
138
+ echo "Error: Delta file not found: $DELTA_FILE"
139
+ exit 1
140
+ fi
141
+
142
+ # Extract metadata
143
+ STATUS=$(extract_frontmatter_value "$DELTA_FILE" "status")
144
+ TITLE=$(extract_frontmatter_value "$DELTA_FILE" "title")
145
+ CREATED_AT=$(extract_frontmatter_value "$DELTA_FILE" "created_at")
146
+
147
+ echo "Delta: $DELTA_ID"
148
+ echo "Title: $TITLE"
149
+ echo "Status: $STATUS"
150
+ echo "Created: $CREATED_AT"
151
+ echo ""
152
+
153
+ # Count changes
154
+ ADDED_COUNT=$(count_section_items "$DELTA_FILE" "ADDED Requirements")
155
+ MODIFIED_COUNT=$(count_section_items "$DELTA_FILE" "MODIFIED Requirements")
156
+ REMOVED_COUNT=$(count_section_items "$DELTA_FILE" "REMOVED Requirements")
157
+ RENAMED_COUNT=$(count_renamed_pairs "$DELTA_FILE")
158
+
159
+ echo "Changes:"
160
+ printf " ADDED: %d requirement(s)\n" "$ADDED_COUNT"
161
+ printf " MODIFIED: %d requirement(s)\n" "$MODIFIED_COUNT"
162
+ printf " REMOVED: %d requirement(s)\n" "$REMOVED_COUNT"
163
+ printf " RENAMED: %d requirement(s)\n" "$RENAMED_COUNT"
164
+ echo ""
165
+
166
+ # Validation
167
+ echo "Validation:"
168
+
169
+ VALIDATION_PASSED=true
170
+
171
+ # Check if PRD.md exists
172
+ if [[ ! -f "$PRD_FILE" ]]; then
173
+ echo " ✗ PRD.md not found"
174
+ VALIDATION_PASSED=false
175
+ else
176
+ echo " ✓ PRD.md exists"
177
+ fi
178
+
179
+ # Check for empty delta
180
+ TOTAL_CHANGES=$((ADDED_COUNT + MODIFIED_COUNT + REMOVED_COUNT + RENAMED_COUNT))
181
+ if [[ $TOTAL_CHANGES -eq 0 ]]; then
182
+ echo " ✗ No changes defined in delta"
183
+ VALIDATION_PASSED=false
184
+ else
185
+ echo " ✓ Delta contains $TOTAL_CHANGES change(s)"
186
+ fi
187
+
188
+ # Try to use TypeScript parser for detailed validation
189
+ if [[ -f "$PARSER_SCRIPT" ]]; then
190
+ # Parse delta and check for errors
191
+ PARSE_OUTPUT=$(npx ts-node "$PARSER_SCRIPT" parse "$DELTA_FILE" 2>&1) || {
192
+ echo " ✗ Delta parsing failed"
193
+ VALIDATION_PASSED=false
194
+ }
195
+
196
+ if [[ -n "$PARSE_OUTPUT" && "$PARSE_OUTPUT" != *"Error"* ]]; then
197
+ echo " ✓ Delta syntax is valid"
198
+ fi
199
+ fi
200
+
201
+ # Check status for apply readiness
202
+ case "$STATUS" in
203
+ draft)
204
+ echo " ⚠ Status is 'draft' - needs review before apply"
205
+ ;;
206
+ review)
207
+ echo " ⚠ Status is 'review' - needs approval before apply"
208
+ ;;
209
+ approved)
210
+ echo " ✓ Status is 'approved' - ready to apply"
211
+ ;;
212
+ applied)
213
+ echo " ✓ Status is 'applied' - already applied"
214
+ ;;
215
+ *)
216
+ echo " ✗ Unknown status: $STATUS"
217
+ VALIDATION_PASSED=false
218
+ ;;
219
+ esac
220
+
221
+ echo ""
222
+
223
+ if $VALIDATION_PASSED; then
224
+ if [[ "$STATUS" == "approved" ]]; then
225
+ echo "✓ Ready to apply"
226
+ echo ""
227
+ echo "Run: /flow:delta apply $REQ_ID $DELTA_SLUG"
228
+ elif [[ "$STATUS" == "applied" ]]; then
229
+ echo "✓ Already applied"
230
+ else
231
+ echo "⚠ Validation passed, but status needs to be 'approved' before apply"
232
+ fi
233
+ else
234
+ echo "✗ Validation failed - please fix issues before applying"
235
+ fi