cc-devflow 1.0.1

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 (277) hide show
  1. package/.claude/CLAUDE.md +83 -0
  2. package/.claude/agents/architecture-designer.md +443 -0
  3. package/.claude/agents/bug-analyzer.md +382 -0
  4. package/.claude/agents/checklist-agent.md +175 -0
  5. package/.claude/agents/clarify-analyst.md +50 -0
  6. package/.claude/agents/code-reviewer.md +71 -0
  7. package/.claude/agents/codex-analyzer.md +39 -0
  8. package/.claude/agents/compatibility-checker.md +580 -0
  9. package/.claude/agents/consistency-checker.md +532 -0
  10. package/.claude/agents/impact-analyzer.md +441 -0
  11. package/.claude/agents/planner.md +230 -0
  12. package/.claude/agents/prd-writer.md +320 -0
  13. package/.claude/agents/project-guidelines-generator.md +1329 -0
  14. package/.claude/agents/qa-tester.md +313 -0
  15. package/.claude/agents/release-manager.md +295 -0
  16. package/.claude/agents/security-reviewer.md +314 -0
  17. package/.claude/agents/style-guide-generator.md +458 -0
  18. package/.claude/agents/tech-architect.md +516 -0
  19. package/.claude/agents/ui-designer.md +485 -0
  20. package/.claude/commands/code-review-high.md +58 -0
  21. package/.claude/commands/core-architecture.md +429 -0
  22. package/.claude/commands/core-guidelines.md +486 -0
  23. package/.claude/commands/core-roadmap.md +439 -0
  24. package/.claude/commands/core-style.md +293 -0
  25. package/.claude/commands/flow-archive.md +245 -0
  26. package/.claude/commands/flow-checklist.md +260 -0
  27. package/.claude/commands/flow-clarify.md +136 -0
  28. package/.claude/commands/flow-constitution.md +82 -0
  29. package/.claude/commands/flow-dev.md +134 -0
  30. package/.claude/commands/flow-epic.md +150 -0
  31. package/.claude/commands/flow-fix.md +104 -0
  32. package/.claude/commands/flow-ideate.md +214 -0
  33. package/.claude/commands/flow-init.md +313 -0
  34. package/.claude/commands/flow-new.md +394 -0
  35. package/.claude/commands/flow-prd.md +131 -0
  36. package/.claude/commands/flow-qa.md +93 -0
  37. package/.claude/commands/flow-release.md +92 -0
  38. package/.claude/commands/flow-restart.md +98 -0
  39. package/.claude/commands/flow-status.md +64 -0
  40. package/.claude/commands/flow-tech.md +142 -0
  41. package/.claude/commands/flow-ui.md +189 -0
  42. package/.claude/commands/flow-update.md +111 -0
  43. package/.claude/commands/flow-upgrade.md +115 -0
  44. package/.claude/commands/flow-verify.md +96 -0
  45. package/.claude/commands/problem-analyzer.md +60 -0
  46. package/.claude/config/quality-rules.yml +161 -0
  47. package/.claude/docs/SPEC_KIT_CONSTITUTION_ANALYSIS.md +426 -0
  48. package/.claude/docs/design/consistency-conflict-detection-algorithms.md +658 -0
  49. package/.claude/docs/design/intent-driven-input-design.md +380 -0
  50. package/.claude/docs/design/prd-version-management-design.md +437 -0
  51. package/.claude/docs/guides/INIT_TROUBLESHOOTING.md +117 -0
  52. package/.claude/docs/guides/NEW_TROUBLESHOOTING.md +151 -0
  53. package/.claude/docs/guides/ROADMAP_TROUBLESHOOTING.md +188 -0
  54. package/.claude/docs/guides/TASK_COMPLETION_MARKING.md +338 -0
  55. package/.claude/docs/templates/ARCHITECTURE_TEMPLATE.md +633 -0
  56. package/.claude/docs/templates/BACKLOG_TEMPLATE.md +261 -0
  57. package/.claude/docs/templates/CHECKLIST_TEMPLATE.md +52 -0
  58. package/.claude/docs/templates/CLARIFICATION_REPORT_TEMPLATE.md +206 -0
  59. package/.claude/docs/templates/CODE_REVIEW_TEMPLATE.md +71 -0
  60. package/.claude/docs/templates/EPIC_TEMPLATE.md +805 -0
  61. package/.claude/docs/templates/INIT_FLOW_TEMPLATE.md +213 -0
  62. package/.claude/docs/templates/INTENT_CLARIFICATION_TEMPLATE.md +57 -0
  63. package/.claude/docs/templates/NEW_ORCHESTRATION_TEMPLATE.md +148 -0
  64. package/.claude/docs/templates/PRD_TEMPLATE.md +562 -0
  65. package/.claude/docs/templates/RESEARCH_TEMPLATE.md +276 -0
  66. package/.claude/docs/templates/REVIEW-HIGH.md +57 -0
  67. package/.claude/docs/templates/ROADMAP_DIALOGUE_TEMPLATE.md +198 -0
  68. package/.claude/docs/templates/ROADMAP_TEMPLATE.md +310 -0
  69. package/.claude/docs/templates/STYLE_TEMPLATE.md +1266 -0
  70. package/.claude/docs/templates/TASKS_TEMPLATE.md +523 -0
  71. package/.claude/docs/templates/TECH_DESIGN_TEMPLATE.md +1019 -0
  72. package/.claude/docs/templates/UI_PROTOTYPE_TEMPLATE.md +1436 -0
  73. package/.claude/guides/agent-guides/agent-coordination-guide.md +459 -0
  74. package/.claude/guides/project-guidelines-system.md +463 -0
  75. package/.claude/guides/technical-guides/datetime-handling-guide.md +563 -0
  76. package/.claude/guides/technical-guides/git-github-guide.md +642 -0
  77. package/.claude/guides/technical-guides/test-execution-guide.md +618 -0
  78. package/.claude/guides/workflow-guides/bug-fix-orchestrator.md +217 -0
  79. package/.claude/guides/workflow-guides/flow-orchestrator.md +282 -0
  80. package/.claude/hooks/checklist-gate.js +397 -0
  81. package/.claude/hooks/error-handling-reminder.sh +12 -0
  82. package/.claude/hooks/error-handling-reminder.ts +459 -0
  83. package/.claude/hooks/post-tool-use-tracker.sh +280 -0
  84. package/.claude/hooks/pre-tool-use-guardrail.sh +36 -0
  85. package/.claude/hooks/pre-tool-use-guardrail.ts +342 -0
  86. package/.claude/hooks/skill-activation-prompt.sh +36 -0
  87. package/.claude/hooks/skill-activation-prompt.ts +214 -0
  88. package/.claude/hooks/state/skills-used-test-guard.json +3 -0
  89. package/.claude/rules/devflow-conventions.md +305 -0
  90. package/.claude/rules/project-constitution.md +748 -0
  91. package/.claude/schemas/constitution.schema.json +43 -0
  92. package/.claude/scripts/analyze-upgrade-impact.sh +200 -0
  93. package/.claude/scripts/archive-requirement.sh +351 -0
  94. package/.claude/scripts/calculate-checklist-completion.sh +243 -0
  95. package/.claude/scripts/calculate-quarter.sh +206 -0
  96. package/.claude/scripts/check-dependencies.sh +409 -0
  97. package/.claude/scripts/check-prerequisites.sh +232 -0
  98. package/.claude/scripts/check-task-status.sh +264 -0
  99. package/.claude/scripts/checklist-errors.sh +131 -0
  100. package/.claude/scripts/common.sh +570 -0
  101. package/.claude/scripts/consolidate-research.sh +182 -0
  102. package/.claude/scripts/create-requirement.sh +426 -0
  103. package/.claude/scripts/export-contracts.sh +117 -0
  104. package/.claude/scripts/extract-data-model.sh +78 -0
  105. package/.claude/scripts/generate-clarification-questions.sh +377 -0
  106. package/.claude/scripts/generate-clarification-report.sh +463 -0
  107. package/.claude/scripts/generate-quickstart.sh +146 -0
  108. package/.claude/scripts/generate-research-tasks.sh +157 -0
  109. package/.claude/scripts/generate-status-report.sh +523 -0
  110. package/.claude/scripts/generate-tech-analysis.sh +46 -0
  111. package/.claude/scripts/locate-requirement-in-roadmap.sh +233 -0
  112. package/.claude/scripts/manage-constitution.sh +602 -0
  113. package/.claude/scripts/mark-task-complete.sh +198 -0
  114. package/.claude/scripts/populate-research-tasks.sh +259 -0
  115. package/.claude/scripts/recover-workflow.sh +460 -0
  116. package/.claude/scripts/run-clarify-scan.sh +601 -0
  117. package/.claude/scripts/run-high-review.sh +62 -0
  118. package/.claude/scripts/run-problem-analysis.sh +68 -0
  119. package/.claude/scripts/setup-epic.sh +173 -0
  120. package/.claude/scripts/sync-roadmap-progress.sh +300 -0
  121. package/.claude/scripts/sync-task-marks.sh +199 -0
  122. package/.claude/scripts/test-clarify-scan.sh +515 -0
  123. package/.claude/scripts/update-agent-context.sh +806 -0
  124. package/.claude/scripts/validate-constitution.sh +567 -0
  125. package/.claude/scripts/validate-hooks.sh +487 -0
  126. package/.claude/scripts/validate-research.sh +332 -0
  127. package/.claude/scripts/validate-scope-boundary.sh +493 -0
  128. package/.claude/scripts/verify-setup.sh +37 -0
  129. package/.claude/settings.json +76 -0
  130. package/.claude/skills/_reference-implementations/README.md +96 -0
  131. package/.claude/skills/_reference-implementations/backend-express-prisma/SKILL.md +302 -0
  132. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/architecture-overview.md +451 -0
  133. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/async-and-errors.md +307 -0
  134. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/complete-examples.md +638 -0
  135. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/configuration.md +275 -0
  136. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/database-patterns.md +224 -0
  137. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/middleware-guide.md +213 -0
  138. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/routing-and-controllers.md +756 -0
  139. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/sentry-and-monitoring.md +336 -0
  140. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/services-and-repositories.md +789 -0
  141. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/testing-guide.md +235 -0
  142. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/validation-patterns.md +754 -0
  143. package/.claude/skills/_reference-implementations/frontend-react-mui/SKILL.md +399 -0
  144. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/common-patterns.md +331 -0
  145. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/complete-examples.md +872 -0
  146. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/component-patterns.md +502 -0
  147. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/data-fetching.md +767 -0
  148. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/file-organization.md +502 -0
  149. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/loading-and-error-states.md +501 -0
  150. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/performance.md +406 -0
  151. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/routing-guide.md +364 -0
  152. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/styling-guide.md +428 -0
  153. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/typescript-standards.md +418 -0
  154. package/.claude/skills/cc-devflow-orchestrator/SKILL.md +229 -0
  155. package/.claude/skills/constitution-guardian/SKILL.md +306 -0
  156. package/.claude/skills/devflow-constitution-quick-ref/SKILL.md +374 -0
  157. package/.claude/skills/devflow-file-standards/SKILL.md +353 -0
  158. package/.claude/skills/devflow-tdd-enforcer/SKILL.md +192 -0
  159. package/.claude/skills/skill-developer/ADVANCED.md +197 -0
  160. package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
  161. package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
  162. package/.claude/skills/skill-developer/SKILL.md +426 -0
  163. package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
  164. package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
  165. package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
  166. package/.claude/skills/skill-rules.json +213 -0
  167. package/.claude/tests/README.md +300 -0
  168. package/.claude/tests/TODO.md +69 -0
  169. package/.claude/tests/__pycache__/test_analyze_upgrade_impact.cpython-311-pytest-7.2.2.pyc +0 -0
  170. package/.claude/tests/__pycache__/test_consolidate_research.cpython-311-pytest-7.2.2.pyc +0 -0
  171. package/.claude/tests/__pycache__/test_export_contracts.cpython-311-pytest-7.2.2.pyc +0 -0
  172. package/.claude/tests/__pycache__/test_extract_data_model.cpython-311-pytest-7.2.2.pyc +0 -0
  173. package/.claude/tests/__pycache__/test_generate_quickstart.cpython-311-pytest-7.2.2.pyc +0 -0
  174. package/.claude/tests/__pycache__/test_generate_research_tasks.cpython-311-pytest-7.2.2.pyc +0 -0
  175. package/.claude/tests/constitution/run_all_constitution_tests.sh +111 -0
  176. package/.claude/tests/constitution/test_agent_assignment.sh +207 -0
  177. package/.claude/tests/constitution/test_article_coverage.sh +201 -0
  178. package/.claude/tests/constitution/test_template_completeness.sh +150 -0
  179. package/.claude/tests/constitution/test_version_consistency.sh +120 -0
  180. package/.claude/tests/fixtures/spec_delta_full.md +16 -0
  181. package/.claude/tests/fixtures/tasks_progress_sample.md +5 -0
  182. package/.claude/tests/run-all-tests.sh +229 -0
  183. package/.claude/tests/scripts/run.sh +30 -0
  184. package/.claude/tests/scripts/test-framework.sh +128 -0
  185. package/.claude/tests/scripts/test_check_prerequisites.sh +511 -0
  186. package/.claude/tests/scripts/test_check_prerequisites.sh.bak +504 -0
  187. package/.claude/tests/scripts/test_check_prerequisites.sh.bak2 +505 -0
  188. package/.claude/tests/scripts/test_check_prerequisites.sh.bak3 +506 -0
  189. package/.claude/tests/scripts/test_check_prerequisites.sh.bak4 +507 -0
  190. package/.claude/tests/scripts/test_check_prerequisites.sh.bak5 +508 -0
  191. package/.claude/tests/scripts/test_check_task_status.sh +499 -0
  192. package/.claude/tests/scripts/test_common.sh +244 -0
  193. package/.claude/tests/scripts/test_generate_status_report.sh +71 -0
  194. package/.claude/tests/scripts/test_mark_task_complete.sh +441 -0
  195. package/.claude/tests/scripts/test_mark_task_complete.sh.backup +410 -0
  196. package/.claude/tests/scripts/test_recover_workflow.sh +304 -0
  197. package/.claude/tests/scripts/test_setup_epic.sh +437 -0
  198. package/.claude/tests/scripts/test_sync_task_marks.sh +196 -0
  199. package/.claude/tests/scripts/test_validate_constitution.sh +74 -0
  200. package/.claude/tests/scripts/test_validate_research.sh +462 -0
  201. package/.claude/tests/slugify.bats +82 -0
  202. package/.claude/tests/test-framework.sh +732 -0
  203. package/.claude/tests/test_analyze_upgrade_impact.py +34 -0
  204. package/.claude/tests/test_consolidate_research.py +48 -0
  205. package/.claude/tests/test_export_contracts.py +43 -0
  206. package/.claude/tests/test_extract_data_model.py +33 -0
  207. package/.claude/tests/test_generate_quickstart.py +50 -0
  208. package/.claude/tests/test_generate_research_tasks.py +52 -0
  209. package/.claude/tsc-cache/6e64f818-6398-49ca-8623-581a9af85c44/edited-files.log +1 -0
  210. package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/affected-repos.txt +1 -0
  211. package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/edited-files.log +1 -0
  212. package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/affected-repos.txt +1 -0
  213. package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/edited-files.log +1 -0
  214. package/CHANGELOG.md +507 -0
  215. package/LICENSE +21 -0
  216. package/README.md +534 -0
  217. package/README.zh-CN.md +530 -0
  218. package/bin/adapt.js +240 -0
  219. package/bin/cc-devflow-cli.js +185 -0
  220. package/bin/cc-devflow.js +78 -0
  221. package/config/adapters.yml +5 -0
  222. package/config/schema/adapters.schema.json +44 -0
  223. package/docs/CLAUDE.md +26 -0
  224. package/docs/commands/README.md +61 -0
  225. package/docs/commands/README.zh-CN.md +55 -0
  226. package/docs/commands/core-roadmap.md +106 -0
  227. package/docs/commands/core-roadmap.zh-CN.md +102 -0
  228. package/docs/commands/core-style.md +405 -0
  229. package/docs/commands/core-style.zh-CN.md +405 -0
  230. package/docs/commands/flow-init.md +134 -0
  231. package/docs/commands/flow-init.zh-CN.md +163 -0
  232. package/docs/commands/flow-new.md +274 -0
  233. package/docs/commands/flow-new.zh-CN.md +270 -0
  234. package/docs/guides/getting-started.md +204 -0
  235. package/docs/guides/getting-started.zh-CN.md +152 -0
  236. package/lib/adapters/adapter-interface.js +57 -0
  237. package/lib/adapters/claude-adapter.js +74 -0
  238. package/lib/adapters/codex-adapter.js +40 -0
  239. package/lib/adapters/config-validator.js +68 -0
  240. package/lib/adapters/logger.js +42 -0
  241. package/lib/adapters/registry.js +153 -0
  242. package/lib/compiler/CLAUDE.md +92 -0
  243. package/lib/compiler/__tests__/drift.test.js +215 -0
  244. package/lib/compiler/__tests__/errors.test.js +184 -0
  245. package/lib/compiler/__tests__/incremental.test.js +174 -0
  246. package/lib/compiler/__tests__/integration.test.js +174 -0
  247. package/lib/compiler/__tests__/manifest.test.js +233 -0
  248. package/lib/compiler/__tests__/parser.test.js +456 -0
  249. package/lib/compiler/__tests__/schemas.test.js +301 -0
  250. package/lib/compiler/__tests__/skills-registry.test.js +125 -0
  251. package/lib/compiler/__tests__/transformer.test.js +286 -0
  252. package/lib/compiler/emitters/antigravity-emitter.js +171 -0
  253. package/lib/compiler/emitters/base-emitter.js +73 -0
  254. package/lib/compiler/emitters/codex-emitter.js +52 -0
  255. package/lib/compiler/emitters/cursor-emitter.js +31 -0
  256. package/lib/compiler/emitters/index.js +50 -0
  257. package/lib/compiler/emitters/qwen-emitter.js +39 -0
  258. package/lib/compiler/errors.js +119 -0
  259. package/lib/compiler/index.js +256 -0
  260. package/lib/compiler/manifest.js +242 -0
  261. package/lib/compiler/parser.js +258 -0
  262. package/lib/compiler/platforms.js +113 -0
  263. package/lib/compiler/resource-copier.js +320 -0
  264. package/lib/compiler/rules-emitters/__tests__/antigravity-rules-emitter.test.js +191 -0
  265. package/lib/compiler/rules-emitters/__tests__/codex-rules-emitter.test.js +109 -0
  266. package/lib/compiler/rules-emitters/__tests__/cursor-rules-emitter.test.js +123 -0
  267. package/lib/compiler/rules-emitters/__tests__/qwen-rules-emitter.test.js +123 -0
  268. package/lib/compiler/rules-emitters/antigravity-rules-emitter.js +253 -0
  269. package/lib/compiler/rules-emitters/base-rules-emitter.js +83 -0
  270. package/lib/compiler/rules-emitters/codex-rules-emitter.js +116 -0
  271. package/lib/compiler/rules-emitters/cursor-rules-emitter.js +98 -0
  272. package/lib/compiler/rules-emitters/index.js +71 -0
  273. package/lib/compiler/rules-emitters/qwen-rules-emitter.js +70 -0
  274. package/lib/compiler/schemas.js +144 -0
  275. package/lib/compiler/skills-registry.js +225 -0
  276. package/lib/compiler/transformer.js +236 -0
  277. package/package.json +50 -0
@@ -0,0 +1,499 @@
1
+ #!/usr/bin/env bash
2
+ # test_check_task_status.sh - 测试 check-task-status.sh
3
+
4
+ # 加载测试框架
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ source "$SCRIPT_DIR/../test-framework.sh"
7
+
8
+ # 脚本路径
9
+ REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
10
+ CHECK_STATUS_SCRIPT="$REPO_ROOT/scripts/check-task-status.sh"
11
+
12
+ # ============================================================================
13
+ # 辅助函数
14
+ # ============================================================================
15
+
16
+ # 创建测试专用的 common.sh
17
+ create_test_common() {
18
+ local test_common="$TEST_TMP_DIR/scripts/common.sh"
19
+ mkdir -p "$(dirname "$test_common")"
20
+
21
+ # Use awk instead of sed for proper variable substitution
22
+ awk -v tmpdir="$TEST_TMP_DIR" '
23
+ /^get_repo_root\(\)/ {
24
+ print "get_repo_root() {"
25
+ print " echo \"" tmpdir "\""
26
+ print "}"
27
+ in_function = 1
28
+ next
29
+ }
30
+ in_function && /^}/ {
31
+ in_function = 0
32
+ next
33
+ }
34
+ !in_function {
35
+ print
36
+ }
37
+ ' "$REPO_ROOT/scripts/common.sh" > "$test_common.tmp"
38
+
39
+ mv "$test_common.tmp" "$test_common"
40
+ }
41
+
42
+ # 创建带有不同阶段任务的需求环境
43
+ setup_requirement_with_phased_tasks() {
44
+ local req_id="$1"
45
+ local req_dir="$TEST_TMP_DIR/devflow/requirements/$req_id"
46
+
47
+ mkdir -p "$req_dir"
48
+
49
+ # 创建带阶段的 TASKS.md
50
+ cat > "$req_dir/TASKS.md" << 'EOF'
51
+ # Tasks for REQ-001
52
+
53
+ ## Phase 1: Setup
54
+
55
+ - [x] **T001**: Initialize project structure
56
+ - [x] **T002**: Setup development environment
57
+
58
+ ## Phase 2: Tests First
59
+
60
+ - [ ] **T003**: Write unit tests for authentication
61
+ - [x] **T004**: Write integration tests
62
+
63
+ ## Phase 3: Implementation
64
+
65
+ - [ ] **T005**: Implement user authentication
66
+ - [ ] **T006**: Add password validation
67
+ - [x] **T007**: Setup database schema
68
+ EOF
69
+
70
+ echo "$req_dir"
71
+ }
72
+
73
+ # 创建简单任务列表
74
+ setup_requirement_with_simple_tasks() {
75
+ local req_id="$1"
76
+ local req_dir="$TEST_TMP_DIR/devflow/requirements/$req_id"
77
+
78
+ mkdir -p "$req_dir"
79
+
80
+ cat > "$req_dir/TASKS.md" << 'EOF'
81
+ # Tasks for REQ-002
82
+
83
+ - [ ] **T001**: Task 1
84
+ - [x] **T002**: Task 2
85
+ - [ ] **T003**: Task 3
86
+ - [x] **T004**: Task 4
87
+ EOF
88
+
89
+ echo "$req_dir"
90
+ }
91
+
92
+ # 运行 check-task-status.sh
93
+ run_check_status() {
94
+ local req_id="$1"
95
+ shift
96
+ local args=("$@")
97
+
98
+ # 设置环境
99
+ export DEVFLOW_REQ_ID="$req_id"
100
+
101
+ # 创建测试专用的脚本副本
102
+ local test_scripts_dir="$TEST_TMP_DIR/scripts"
103
+ mkdir -p "$test_scripts_dir"
104
+
105
+ # 创建测试专用的 common.sh
106
+ create_test_common
107
+
108
+ # 复制 check-task-status.sh 到测试目录
109
+ cp "$CHECK_STATUS_SCRIPT" "$test_scripts_dir/"
110
+
111
+ # 在测试目录中运行脚本
112
+ (
113
+ cd "$TEST_TMP_DIR"
114
+ bash "$test_scripts_dir/check-task-status.sh" "${args[@]}" 2>&1
115
+ )
116
+ }
117
+
118
+ # ============================================================================
119
+ # 测试帮助信息
120
+ # ============================================================================
121
+
122
+ test_help_flag() {
123
+ describe "Should show help with --help"
124
+
125
+ # Arrange
126
+ local test_scripts_dir="$TEST_TMP_DIR/scripts"
127
+ mkdir -p "$test_scripts_dir"
128
+ create_test_common
129
+ cp "$CHECK_STATUS_SCRIPT" "$test_scripts_dir/"
130
+
131
+ # Act
132
+ local output=$(
133
+ cd "$TEST_TMP_DIR"
134
+ bash "$test_scripts_dir/check-task-status.sh" --help 2>&1
135
+ )
136
+
137
+ # Assert
138
+ assert_contains "$output" "Usage:" "Should show usage"
139
+ assert_contains "$output" "check-task-status.sh" "Should mention script name"
140
+ }
141
+
142
+ # ============================================================================
143
+ # 测试总体进度
144
+ # ============================================================================
145
+
146
+ test_overall_progress() {
147
+ describe "Should show overall task progress"
148
+
149
+ # Arrange
150
+ setup_requirement_with_simple_tasks "REQ-002"
151
+
152
+ # Act
153
+ local output=$(run_check_status "REQ-002" 2>&1)
154
+ local exit_code=$?
155
+
156
+ # Assert
157
+ assert_equals "$exit_code" "0" "Should succeed"
158
+ assert_contains "$output" "Completed:" "Should show completed count"
159
+ assert_contains "$output" "Remaining:" "Should show remaining count"
160
+ assert_contains "$output" "Progress:" "Should show progress percentage"
161
+ }
162
+
163
+ test_calculate_percentage() {
164
+ describe "Should calculate progress percentage correctly"
165
+
166
+ # Arrange
167
+ setup_requirement_with_simple_tasks "REQ-002"
168
+
169
+ # Act
170
+ local output=$(run_check_status "REQ-002" 2>&1)
171
+
172
+ # Assert - 2 complete out of 4 = 50%
173
+ assert_contains "$output" "50%" "Should show 50% progress"
174
+ }
175
+
176
+ # ============================================================================
177
+ # 测试特定任务查询
178
+ # ============================================================================
179
+
180
+ test_check_complete_task() {
181
+ describe "Should identify complete task status"
182
+
183
+ # Arrange
184
+ setup_requirement_with_simple_tasks "REQ-002"
185
+
186
+ # Act
187
+ local output=$(run_check_status "REQ-002" "T002" 2>&1)
188
+ local exit_code=$?
189
+
190
+ # Assert
191
+ assert_equals "$exit_code" "0" "Should succeed"
192
+ assert_contains "$output" "✅" "Should show complete indicator"
193
+ assert_contains "$output" "T002" "Should mention task ID"
194
+ assert_contains "$output" "complete" "Should say complete"
195
+ }
196
+
197
+ test_check_pending_task() {
198
+ describe "Should identify pending task status"
199
+
200
+ # Arrange
201
+ setup_requirement_with_simple_tasks "REQ-002"
202
+
203
+ # Act
204
+ local output=$(run_check_status "REQ-002" "T001" 2>&1)
205
+ local exit_code=$?
206
+
207
+ # Assert
208
+ assert_equals "$exit_code" "0" "Should succeed"
209
+ assert_contains "$output" "⏳" "Should show pending indicator"
210
+ assert_contains "$output" "T001" "Should mention task ID"
211
+ assert_contains "$output" "pending" "Should say pending"
212
+ }
213
+
214
+ test_check_nonexistent_task() {
215
+ describe "Should fail for non-existent task"
216
+
217
+ # Arrange
218
+ setup_requirement_with_simple_tasks "REQ-002"
219
+
220
+ # Act - Use temp file pattern to capture exit code
221
+ local output_file="$TEST_TMP_DIR/output.txt"
222
+ local exit_code_file="$TEST_TMP_DIR/exitcode.txt"
223
+
224
+ (
225
+ run_check_status "REQ-002" "T999" > "$output_file" 2>&1
226
+ echo $? > "$exit_code_file"
227
+ )
228
+
229
+ local output=$(cat "$output_file")
230
+ local exit_code=$(cat "$exit_code_file")
231
+
232
+ # Assert
233
+ assert_not_equals "$exit_code" "0" "Should fail"
234
+ assert_contains "$output" "not found" "Should say not found"
235
+ }
236
+
237
+ test_normalize_task_id_case() {
238
+ describe "Should normalize task ID to uppercase"
239
+
240
+ # Arrange
241
+ setup_requirement_with_simple_tasks "REQ-002"
242
+
243
+ # Act - use lowercase
244
+ local output=$(run_check_status "REQ-002" "t001" 2>&1)
245
+ local exit_code=$?
246
+
247
+ # Assert
248
+ assert_equals "$exit_code" "0" "Should succeed"
249
+ assert_contains "$output" "T001" "Should normalize to T001"
250
+ }
251
+
252
+ # ============================================================================
253
+ # 测试 JSON 输出
254
+ # ============================================================================
255
+
256
+ test_json_output_overall() {
257
+ describe "Should output valid JSON for overall status"
258
+
259
+ # Arrange
260
+ setup_requirement_with_simple_tasks "REQ-002"
261
+
262
+ # Act
263
+ local output=$(run_check_status "REQ-002" --json 2>&1)
264
+
265
+ # Assert
266
+ assert_json_valid "$output" "Should be valid JSON"
267
+ }
268
+
269
+ test_json_output_fields() {
270
+ describe "JSON should include all required fields"
271
+
272
+ # Arrange
273
+ setup_requirement_with_simple_tasks "REQ-002"
274
+
275
+ # Act
276
+ local output=$(run_check_status "REQ-002" --json 2>&1)
277
+
278
+ # Assert
279
+ assert_contains "$output" "\"req_id\"" "Should have req_id"
280
+ assert_contains "$output" "\"total_tasks\"" "Should have total_tasks"
281
+ assert_contains "$output" "\"completed\"" "Should have completed"
282
+ assert_contains "$output" "\"remaining\"" "Should have remaining"
283
+ assert_contains "$output" "\"percentage\"" "Should have percentage"
284
+ assert_contains "$output" "\"next_task_id\"" "Should have next_task_id"
285
+ }
286
+
287
+ test_json_output_specific_task() {
288
+ describe "Should output valid JSON for specific task"
289
+
290
+ # Arrange
291
+ setup_requirement_with_simple_tasks "REQ-002"
292
+
293
+ # Act
294
+ local output=$(run_check_status "REQ-002" "T001" --json 2>&1)
295
+
296
+ # Assert
297
+ assert_json_valid "$output" "Should be valid JSON"
298
+ assert_contains "$output" "\"task_id\":\"T001\"" "Should have task_id"
299
+ assert_contains "$output" "\"status\"" "Should have status"
300
+ }
301
+
302
+ # ============================================================================
303
+ # 测试阶段分解
304
+ # ============================================================================
305
+
306
+ test_phase_breakdown() {
307
+ describe "Should show phase breakdown when available"
308
+
309
+ # Arrange
310
+ setup_requirement_with_phased_tasks "REQ-001"
311
+
312
+ # Act
313
+ local output=$(run_check_status "REQ-001" 2>&1)
314
+
315
+ # Assert
316
+ assert_contains "$output" "Phase Breakdown:" "Should show phase breakdown"
317
+ assert_contains "$output" "Phase 1" "Should show Phase 1"
318
+ assert_contains "$output" "Phase 2" "Should show Phase 2"
319
+ assert_contains "$output" "Phase 3" "Should show Phase 3"
320
+ }
321
+
322
+ test_phase_json_output() {
323
+ describe "JSON should include phase information"
324
+
325
+ # Arrange
326
+ setup_requirement_with_phased_tasks "REQ-001"
327
+
328
+ # Act
329
+ local output=$(run_check_status "REQ-001" --json 2>&1)
330
+
331
+ # Assert
332
+ assert_contains "$output" "\"phases\"" "Should have phases"
333
+ assert_contains "$output" "\"phase_1\"" "Should have phase_1"
334
+ assert_contains "$output" "\"phase_2\"" "Should have phase_2"
335
+ assert_contains "$output" "\"phase_3\"" "Should have phase_3"
336
+ }
337
+
338
+ # ============================================================================
339
+ # 测试下一个任务
340
+ # ============================================================================
341
+
342
+ test_next_task() {
343
+ describe "Should identify next pending task"
344
+
345
+ # Arrange
346
+ setup_requirement_with_simple_tasks "REQ-002"
347
+
348
+ # Act
349
+ local output=$(run_check_status "REQ-002" 2>&1)
350
+
351
+ # Assert
352
+ assert_contains "$output" "Next Task:" "Should show next task"
353
+ assert_contains "$output" "T001" "Should show T001 as next"
354
+ }
355
+
356
+ test_all_tasks_complete() {
357
+ describe "Should indicate when all tasks complete"
358
+
359
+ # Arrange - 创建全部完成的任务
360
+ local req_id="REQ-003"
361
+ local req_dir="$TEST_TMP_DIR/devflow/requirements/$req_id"
362
+ mkdir -p "$req_dir"
363
+
364
+ cat > "$req_dir/TASKS.md" << 'EOF'
365
+ # Tasks
366
+ - [x] **T001**: Done
367
+ - [x] **T002**: Done
368
+ EOF
369
+
370
+ # Act
371
+ local output=$(run_check_status "REQ-003" 2>&1)
372
+
373
+ # Assert
374
+ assert_contains "$output" "All tasks complete" "Should say all complete"
375
+ }
376
+
377
+ # ============================================================================
378
+ # 测试 Verbose 模式
379
+ # ============================================================================
380
+
381
+ test_verbose_mode() {
382
+ describe "Should show detailed task list in verbose mode"
383
+
384
+ # Arrange
385
+ setup_requirement_with_simple_tasks "REQ-002"
386
+
387
+ # Act
388
+ local output=$(run_check_status "REQ-002" --verbose 2>&1)
389
+
390
+ # Assert
391
+ assert_contains "$output" "All Tasks:" "Should show all tasks header"
392
+ assert_contains "$output" "T001" "Should list T001"
393
+ assert_contains "$output" "T002" "Should list T002"
394
+ assert_contains "$output" "T003" "Should list T003"
395
+ assert_contains "$output" "T004" "Should list T004"
396
+ }
397
+
398
+ # ============================================================================
399
+ # 测试错误处理
400
+ # ============================================================================
401
+
402
+ test_missing_tasks_file() {
403
+ describe "Should fail when TASKS.md doesn't exist"
404
+
405
+ # Arrange - 创建需求目录但不创建 TASKS.md
406
+ local req_id="REQ-004"
407
+ local req_dir="$TEST_TMP_DIR/devflow/requirements/$req_id"
408
+ mkdir -p "$req_dir"
409
+
410
+ # Act - Use temp file pattern to capture exit code
411
+ local output_file="$TEST_TMP_DIR/output.txt"
412
+ local exit_code_file="$TEST_TMP_DIR/exitcode.txt"
413
+
414
+ (
415
+ run_check_status "REQ-004" > "$output_file" 2>&1
416
+ echo $? > "$exit_code_file"
417
+ )
418
+
419
+ local output=$(cat "$output_file")
420
+ local exit_code=$(cat "$exit_code_file")
421
+
422
+ # Assert
423
+ assert_not_equals "$exit_code" "0" "Should fail"
424
+ assert_contains "$output" "TASKS.md not found" "Should mention missing TASKS.md"
425
+ }
426
+
427
+ test_invalid_task_id_format() {
428
+ describe "Should fail on invalid task ID format"
429
+
430
+ # Arrange
431
+ setup_requirement_with_simple_tasks "REQ-002"
432
+
433
+ # Act - Use temp file pattern to capture exit code
434
+ local output_file="$TEST_TMP_DIR/output.txt"
435
+ local exit_code_file="$TEST_TMP_DIR/exitcode.txt"
436
+
437
+ (
438
+ run_check_status "REQ-002" "INVALID" > "$output_file" 2>&1
439
+ echo $? > "$exit_code_file"
440
+ )
441
+
442
+ local output=$(cat "$output_file")
443
+ local exit_code=$(cat "$exit_code_file")
444
+
445
+ # Assert
446
+ assert_not_equals "$exit_code" "0" "Should fail"
447
+ assert_contains "$output" "Invalid task ID format" "Should mention format error"
448
+ }
449
+
450
+ test_invalid_option() {
451
+ describe "Should reject invalid options"
452
+
453
+ # Arrange
454
+ local test_scripts_dir="$TEST_TMP_DIR/scripts"
455
+ mkdir -p "$test_scripts_dir"
456
+ create_test_common
457
+ cp "$CHECK_STATUS_SCRIPT" "$test_scripts_dir/"
458
+
459
+ # Act - Use temp file pattern to capture exit code
460
+ local output_file="$TEST_TMP_DIR/output.txt"
461
+ local exit_code_file="$TEST_TMP_DIR/exitcode.txt"
462
+
463
+ (
464
+ cd "$TEST_TMP_DIR"
465
+ bash "$test_scripts_dir/check-task-status.sh" --invalid > "$output_file" 2>&1
466
+ echo $? > "$exit_code_file"
467
+ )
468
+
469
+ local output=$(cat "$output_file")
470
+ local exit_code=$(cat "$exit_code_file")
471
+
472
+ # Assert
473
+ assert_not_equals "$exit_code" "0" "Should fail"
474
+ assert_contains "$output" "Unknown option" "Should mention unknown option"
475
+ }
476
+
477
+ # ============================================================================
478
+ # 运行所有测试
479
+ # ============================================================================
480
+
481
+ run_tests \
482
+ test_help_flag \
483
+ test_overall_progress \
484
+ test_calculate_percentage \
485
+ test_check_complete_task \
486
+ test_check_pending_task \
487
+ test_check_nonexistent_task \
488
+ test_normalize_task_id_case \
489
+ test_json_output_overall \
490
+ test_json_output_fields \
491
+ test_json_output_specific_task \
492
+ test_phase_breakdown \
493
+ test_phase_json_output \
494
+ test_next_task \
495
+ test_all_tasks_complete \
496
+ test_verbose_mode \
497
+ test_missing_tasks_file \
498
+ test_invalid_task_id_format \
499
+ test_invalid_option