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,244 @@
1
+ #!/usr/bin/env bash
2
+ # test_common.sh - 测试 common.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
+ source "$REPO_ROOT/scripts/common.sh"
11
+
12
+ # ============================================================================
13
+ # 测试钩子 - 在每个测试前清理git mock
14
+ # ============================================================================
15
+
16
+ setup_test() {
17
+ clear_git_mocks
18
+ unset DEVFLOW_REQ_ID # 清理环境变量以避免干扰
19
+ }
20
+
21
+ # ============================================================================
22
+ # 测试 get_repo_root 函数
23
+ # ============================================================================
24
+
25
+ test_get_repo_root_in_git_repo() {
26
+ describe "get_repo_root should return git root in git repository"
27
+
28
+ # Mock git command
29
+ mock_git "rev-parse --show-toplevel" "/fake/repo/path"
30
+
31
+ # Act
32
+ local result=$(get_repo_root)
33
+
34
+ # Assert
35
+ assert_equals "$result" "/fake/repo/path" "Should return git repo root"
36
+ }
37
+
38
+ test_get_repo_root_not_git_repo() {
39
+ describe "get_repo_root should fall back to script location when not in git repo"
40
+
41
+ # Mock git to fail
42
+ mock_git "rev-parse --show-toplevel" "" "1"
43
+
44
+ # Act
45
+ local result=$(get_repo_root)
46
+
47
+ # Assert - 验证返回的路径存在且包含 .claude 目录
48
+ assert_dir_exists "$result" "Should return existing directory"
49
+ assert_dir_exists "$result/.claude" "Should return path with .claude subdirectory"
50
+ }
51
+
52
+ # ============================================================================
53
+ # 测试 get_current_req_id 函数
54
+ # ============================================================================
55
+
56
+ test_get_current_req_id_from_env() {
57
+ describe "get_current_req_id should use DEVFLOW_REQ_ID if set"
58
+
59
+ # Arrange
60
+ export DEVFLOW_REQ_ID="REQ-999"
61
+
62
+ # Act
63
+ local result=$(get_current_req_id)
64
+
65
+ # Assert
66
+ assert_equals "$result" "REQ-999" "Should return env var value"
67
+
68
+ # Cleanup
69
+ unset DEVFLOW_REQ_ID
70
+ }
71
+
72
+ test_get_current_req_id_from_git_branch() {
73
+ describe "get_current_req_id should extract from git branch name"
74
+
75
+ # Mock git branch command
76
+ mock_git "rev-parse --abbrev-ref HEAD" "feature/REQ-123-test-feature"
77
+
78
+ # Act
79
+ local result=$(get_current_req_id)
80
+
81
+ # Assert
82
+ assert_equals "$result" "REQ-123" "Should extract REQ-123 from branch"
83
+ }
84
+
85
+ test_get_current_req_id_bug_format() {
86
+ describe "get_current_req_id should extract BUG-XXX format"
87
+
88
+ # Mock git branch command
89
+ mock_git "rev-parse --abbrev-ref HEAD" "bugfix/BUG-456-fix-login"
90
+
91
+ # Act
92
+ local result=$(get_current_req_id)
93
+
94
+ # Assert
95
+ assert_equals "$result" "BUG-456" "Should extract BUG-456 from branch"
96
+ }
97
+
98
+ test_get_current_req_id_no_match() {
99
+ describe "get_current_req_id should return empty when no match found"
100
+
101
+ # Mock git branch without REQ/BUG pattern
102
+ mock_git "rev-parse --abbrev-ref HEAD" "main"
103
+
104
+ # Act
105
+ local result=$(get_current_req_id)
106
+
107
+ # Assert
108
+ assert_equals "$result" "" "Should return empty string when no match"
109
+ }
110
+
111
+ # ============================================================================
112
+ # 测试 validate_req_id 函数
113
+ # ============================================================================
114
+
115
+ test_validate_req_id_valid_req() {
116
+ describe "validate_req_id should accept valid REQ format"
117
+
118
+ # Act & Assert
119
+ assert_success validate_req_id "REQ-123"
120
+ }
121
+
122
+ test_validate_req_id_valid_bug() {
123
+ describe "validate_req_id should accept valid BUG format"
124
+
125
+ # Act & Assert
126
+ assert_success validate_req_id "BUG-456"
127
+ }
128
+
129
+ test_validate_req_id_empty() {
130
+ describe "validate_req_id should reject empty string"
131
+
132
+ # Act & Assert
133
+ assert_failure validate_req_id ""
134
+ }
135
+
136
+ test_validate_req_id_invalid_format() {
137
+ describe "validate_req_id should reject invalid format"
138
+
139
+ # Act & Assert
140
+ assert_failure validate_req_id "REQ123" # Missing dash
141
+ assert_failure validate_req_id "REQ-" # Missing number
142
+ assert_failure validate_req_id "TASK-123" # Wrong prefix
143
+ }
144
+
145
+ # ============================================================================
146
+ # 测试 get_req_type 函数
147
+ # ============================================================================
148
+
149
+ test_get_req_type_requirement() {
150
+ describe "get_req_type should return 'requirement' for REQ-XXX"
151
+
152
+ # Act
153
+ local result=$(get_req_type "REQ-123")
154
+
155
+ # Assert
156
+ assert_equals "$result" "requirement" "Should return 'requirement'"
157
+ }
158
+
159
+ test_get_req_type_bug() {
160
+ describe "get_req_type should return 'bug' for BUG-XXX"
161
+
162
+ # Act
163
+ local result=$(get_req_type "BUG-456")
164
+
165
+ # Assert
166
+ assert_equals "$result" "bug" "Should return 'bug'"
167
+ }
168
+
169
+ # ============================================================================
170
+ # 测试 has_git 函数
171
+ # ============================================================================
172
+
173
+ test_has_git_available() {
174
+ describe "has_git should return success when git is available"
175
+
176
+ # Mock git command
177
+ mock_git "rev-parse --show-toplevel" "/some/path"
178
+
179
+ # Act & Assert
180
+ assert_success has_git
181
+ }
182
+
183
+ test_has_git_not_available() {
184
+ describe "has_git should return failure when git is not available"
185
+
186
+ # Mock git to fail
187
+ mock_git "rev-parse --show-toplevel" "" "1"
188
+
189
+ # Act & Assert
190
+ assert_failure has_git
191
+ }
192
+
193
+ # ============================================================================
194
+ # 测试 log_event 函数 (如果存在)
195
+ # ============================================================================
196
+
197
+ test_log_event_creates_entry() {
198
+ describe "log_event should create log entry in EXECUTION_LOG.md"
199
+
200
+ # Arrange
201
+ local req_id="REQ-123"
202
+ local log_dir="$TEST_TMP_DIR/devflow/requirements/$req_id"
203
+ mkdir -p "$log_dir"
204
+ local log_file="$log_dir/EXECUTION_LOG.md"
205
+ touch "$log_file"
206
+
207
+ # Mock get_repo_root to return test directory
208
+ mock_function "get_repo_root" "echo '$TEST_TMP_DIR'"
209
+
210
+ # Act
211
+ if type log_event &>/dev/null; then
212
+ log_event "$req_id" "Test event"
213
+
214
+ # Assert
215
+ assert_file_exists "$log_file" "Log file should exist"
216
+ local content=$(cat "$log_file")
217
+ assert_contains "$content" "Test event" "Should contain event message"
218
+ else
219
+ # 如果函数不存在,跳过此测试
220
+ describe " (log_event function not found - skipping)"
221
+ return 0
222
+ fi
223
+ }
224
+
225
+ # ============================================================================
226
+ # 运行所有测试
227
+ # ============================================================================
228
+
229
+ run_tests \
230
+ test_get_repo_root_in_git_repo \
231
+ test_get_repo_root_not_git_repo \
232
+ test_get_current_req_id_from_env \
233
+ test_get_current_req_id_from_git_branch \
234
+ test_get_current_req_id_bug_format \
235
+ test_get_current_req_id_no_match \
236
+ test_validate_req_id_valid_req \
237
+ test_validate_req_id_valid_bug \
238
+ test_validate_req_id_empty \
239
+ test_validate_req_id_invalid_format \
240
+ test_get_req_type_requirement \
241
+ test_get_req_type_bug \
242
+ test_has_git_available \
243
+ test_has_git_not_available \
244
+ test_log_event_creates_entry
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env bash
2
+ # test_generate_status_report.sh - 测试 generate-status-report.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
+ REPORT_SCRIPT="$REPO_ROOT/scripts/generate-status-report.sh"
11
+
12
+ # ============================================================================
13
+ # 测试帮助信息
14
+ # ============================================================================
15
+
16
+ test_help_flag() {
17
+ describe "Should show help with --help"
18
+
19
+ # Act
20
+ local output=$(bash "$REPORT_SCRIPT" --help 2>&1)
21
+
22
+ # Assert
23
+ assert_contains "$output" "用法:" "Should show usage"
24
+ assert_contains "$output" "generate-status-report.sh" "Should mention script name"
25
+ }
26
+
27
+ test_help_short_flag() {
28
+ describe "Should show help with -h"
29
+
30
+ # Act
31
+ local output=$(bash "$REPORT_SCRIPT" -h 2>&1)
32
+
33
+ # Assert
34
+ assert_contains "$output" "用法:" "Should show usage with -h"
35
+ }
36
+
37
+ # ============================================================================
38
+ # 测试基本功能
39
+ # ============================================================================
40
+
41
+ test_script_executes() {
42
+ describe "Should execute without critical errors"
43
+
44
+ # Act
45
+ local exit_code=0
46
+ bash "$REPORT_SCRIPT" --help >/dev/null 2>&1 || exit_code=$?
47
+
48
+ # Assert
49
+ assert_equals "$exit_code" "0" "Script should be executable"
50
+ }
51
+
52
+ test_has_required_options() {
53
+ describe "Help should document required options"
54
+
55
+ # Act
56
+ local output=$(bash "$REPORT_SCRIPT" --help 2>&1)
57
+
58
+ # Assert
59
+ assert_contains "$output" "--format" "Should have --format option"
60
+ assert_contains "$output" "--output" "Should have --output option"
61
+ }
62
+
63
+ # ============================================================================
64
+ # 运行所有测试
65
+ # ============================================================================
66
+
67
+ run_tests \
68
+ test_help_flag \
69
+ test_help_short_flag \
70
+ test_script_executes \
71
+ test_has_required_options