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,618 @@
1
+ # 测试执行规则
2
+
3
+ ## 概述
4
+
5
+ cc-devflow 系统中的所有测试操作都必须遵循统一的执行规则,确保测试结果的可靠性和一致性。
6
+
7
+ ## 核心原则
8
+
9
+ ### 1. 始终使用 qa-tester 子代理
10
+ **所有测试相关操作都必须通过 qa-tester 子代理执行**
11
+
12
+ ```bash
13
+ # ✅ 正确做法 - 使用 qa-tester 子代理
14
+ execute_tests_via_agent() {
15
+ local req_id="$1"
16
+ local test_target="$2"
17
+
18
+ echo "🧪 通过 qa-tester 子代理执行测试..."
19
+
20
+ # 调用 qa-tester 子代理
21
+ claude_task_call "qa-tester" "Execute tests for: $test_target
22
+
23
+ Requirements:
24
+ - Run with verbose output
25
+ - No mock services
26
+ - Capture full stack traces
27
+ - Analyze test structure if failures occur
28
+
29
+ Target: $test_target
30
+ Requirement ID: $req_id"
31
+ }
32
+
33
+ # ❌ 错误做法 - 直接执行测试
34
+ direct_test_execution() {
35
+ npm test # 绕过了子代理系统
36
+ }
37
+ ```
38
+
39
+ ### 2. 禁用模拟服务
40
+ **使用真实服务进行准确的测试结果**
41
+
42
+ ```bash
43
+ # 测试环境配置
44
+ configure_test_environment() {
45
+ echo "🔧 配置测试环境..."
46
+
47
+ # 禁用所有模拟服务
48
+ export DISABLE_MOCKS=true
49
+ export USE_REAL_SERVICES=true
50
+ export TEST_ENV=integration
51
+
52
+ # 确保测试数据库可用
53
+ if ! check_test_database_availability; then
54
+ echo "❌ 测试数据库不可用"
55
+ return 1
56
+ fi
57
+
58
+ # 确保外部服务可用
59
+ if ! check_external_services; then
60
+ echo "⚠️ 外部服务不可用,某些测试可能失败"
61
+ fi
62
+
63
+ echo "✅ 测试环境配置完成"
64
+ }
65
+
66
+ # 检查测试数据库
67
+ check_test_database_availability() {
68
+ local db_url="${TEST_DATABASE_URL:-postgresql://localhost:5432/test_db}"
69
+
70
+ if command -v psql >/dev/null 2>&1; then
71
+ if psql "$db_url" -c "SELECT 1" >/dev/null 2>&1; then
72
+ return 0
73
+ fi
74
+ fi
75
+
76
+ # 尝试启动测试数据库
77
+ start_test_database
78
+
79
+ return $?
80
+ }
81
+
82
+ # 检查外部服务
83
+ check_external_services() {
84
+ local services_ok=true
85
+
86
+ # 检查 Redis
87
+ if ! redis-cli ping >/dev/null 2>&1; then
88
+ echo "⚠️ Redis 服务不可用"
89
+ services_ok=false
90
+ fi
91
+
92
+ # 检查其他依赖服务
93
+ local required_services=("elasticsearch" "rabbitmq")
94
+ for service in "${required_services[@]}"; do
95
+ if ! check_service_health "$service"; then
96
+ echo "⚠️ 服务不可用: $service"
97
+ services_ok=false
98
+ fi
99
+ done
100
+
101
+ $services_ok
102
+ }
103
+ ```
104
+
105
+ ### 3. 详细输出捕获
106
+ **捕获完整的测试输出用于调试**
107
+
108
+ ```bash
109
+ # 执行测试并捕获详细输出
110
+ execute_tests_with_verbose_output() {
111
+ local test_target="$1"
112
+ local req_id="$2"
113
+ local output_file="devflow/requirements/${req_id}/test-output.log"
114
+
115
+ echo "🧪 执行测试: $test_target"
116
+
117
+ # 创建输出目录
118
+ mkdir -p "$(dirname "$output_file")"
119
+
120
+ # 执行测试并捕获输出
121
+ {
122
+ echo "=== 测试执行开始 ==="
123
+ echo "时间: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
124
+ echo "目标: $test_target"
125
+ echo "需求ID: $req_id"
126
+ echo ""
127
+
128
+ # 根据项目类型执行相应测试
129
+ case "$test_target" in
130
+ "unit")
131
+ execute_unit_tests
132
+ ;;
133
+ "integration")
134
+ execute_integration_tests
135
+ ;;
136
+ "e2e")
137
+ execute_e2e_tests
138
+ ;;
139
+ "all")
140
+ execute_unit_tests
141
+ execute_integration_tests
142
+ execute_e2e_tests
143
+ ;;
144
+ *)
145
+ echo "❌ 未知的测试目标: $test_target"
146
+ return 1
147
+ ;;
148
+ esac
149
+
150
+ echo ""
151
+ echo "=== 测试执行结束 ==="
152
+ echo "时间: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
153
+
154
+ } 2>&1 | tee "$output_file"
155
+
156
+ # 分析测试结果
157
+ analyze_test_results "$output_file"
158
+ }
159
+
160
+ # 执行单元测试
161
+ execute_unit_tests() {
162
+ echo "🔬 执行单元测试..."
163
+
164
+ if [ -f "package.json" ]; then
165
+ # Node.js 项目
166
+ if npm run test:unit >/dev/null 2>&1; then
167
+ npm run test:unit -- --verbose --coverage
168
+ elif npm run test >/dev/null 2>&1; then
169
+ npm run test -- --verbose --coverage
170
+ else
171
+ echo "❌ 未找到测试脚本"
172
+ return 1
173
+ fi
174
+ elif [ -f "requirements.txt" ] || [ -f "pyproject.toml" ]; then
175
+ # Python 项目
176
+ if command -v pytest >/dev/null 2>&1; then
177
+ pytest -v --tb=long --cov=. --cov-report=term-missing
178
+ else
179
+ echo "❌ pytest 未安装"
180
+ return 1
181
+ fi
182
+ else
183
+ echo "❌ 未识别的项目类型"
184
+ return 1
185
+ fi
186
+ }
187
+
188
+ # 执行集成测试
189
+ execute_integration_tests() {
190
+ echo "🔗 执行集成测试..."
191
+
192
+ # 确保测试环境准备就绪
193
+ if ! prepare_integration_environment; then
194
+ echo "❌ 集成测试环境准备失败"
195
+ return 1
196
+ fi
197
+
198
+ if [ -f "package.json" ]; then
199
+ if npm run test:integration >/dev/null 2>&1; then
200
+ npm run test:integration -- --verbose
201
+ else
202
+ echo "⚠️ 未找到集成测试脚本"
203
+ fi
204
+ elif command -v pytest >/dev/null 2>&1; then
205
+ pytest tests/integration/ -v --tb=long
206
+ fi
207
+ }
208
+
209
+ # 执行端到端测试
210
+ execute_e2e_tests() {
211
+ echo "🌐 执行端到端测试..."
212
+
213
+ # 启动应用服务器
214
+ if ! start_test_server; then
215
+ echo "❌ 测试服务器启动失败"
216
+ return 1
217
+ fi
218
+
219
+ if [ -f "package.json" ]; then
220
+ if npm run test:e2e >/dev/null 2>&1; then
221
+ npm run test:e2e -- --verbose
222
+ elif command -v cypress >/dev/null 2>&1; then
223
+ cypress run --spec "cypress/integration/**/*"
224
+ else
225
+ echo "⚠️ 未找到 E2E 测试配置"
226
+ fi
227
+ fi
228
+
229
+ # 清理测试服务器
230
+ cleanup_test_server
231
+ }
232
+ ```
233
+
234
+ ### 4. 测试结构检查优先
235
+ **在假设代码问题之前,先检查测试结构**
236
+
237
+ ```bash
238
+ # 分析测试失败
239
+ analyze_test_failures() {
240
+ local test_output_file="$1"
241
+
242
+ echo "🔍 分析测试失败原因..."
243
+
244
+ # 检查测试结构问题
245
+ if check_test_structure_issues "$test_output_file"; then
246
+ echo "⚠️ 发现测试结构问题,建议先修复测试"
247
+ return 0
248
+ fi
249
+
250
+ # 检查环境问题
251
+ if check_environment_issues "$test_output_file"; then
252
+ echo "⚠️ 发现环境配置问题"
253
+ return 0
254
+ fi
255
+
256
+ # 检查依赖问题
257
+ if check_dependency_issues "$test_output_file"; then
258
+ echo "⚠️ 发现依赖问题"
259
+ return 0
260
+ fi
261
+
262
+ # 最后才考虑代码问题
263
+ echo "🐛 可能存在代码问题,需要进一步调试"
264
+ extract_code_issues "$test_output_file"
265
+ }
266
+
267
+ # 检查测试结构问题
268
+ check_test_structure_issues() {
269
+ local output_file="$1"
270
+ local issues_found=false
271
+
272
+ # 检查常见测试结构问题
273
+ if grep -q "Cannot find module" "$output_file"; then
274
+ echo "❌ 测试结构问题: 模块导入错误"
275
+ grep "Cannot find module" "$output_file" | head -5
276
+ issues_found=true
277
+ fi
278
+
279
+ if grep -q "ReferenceError" "$output_file"; then
280
+ echo "❌ 测试结构问题: 变量或函数未定义"
281
+ grep "ReferenceError" "$output_file" | head -5
282
+ issues_found=true
283
+ fi
284
+
285
+ if grep -q "Test suite failed to run" "$output_file"; then
286
+ echo "❌ 测试结构问题: 测试套件配置错误"
287
+ issues_found=true
288
+ fi
289
+
290
+ if grep -q "SyntaxError" "$output_file"; then
291
+ echo "❌ 测试结构问题: 语法错误"
292
+ grep "SyntaxError" "$output_file" | head -3
293
+ issues_found=true
294
+ fi
295
+
296
+ $issues_found
297
+ }
298
+
299
+ # 检查环境问题
300
+ check_environment_issues() {
301
+ local output_file="$1"
302
+ local issues_found=false
303
+
304
+ if grep -q "ECONNREFUSED" "$output_file"; then
305
+ echo "❌ 环境问题: 服务连接被拒绝"
306
+ issues_found=true
307
+ fi
308
+
309
+ if grep -q "ENOTFOUND" "$output_file"; then
310
+ echo "❌ 环境问题: 域名解析失败"
311
+ issues_found=true
312
+ fi
313
+
314
+ if grep -q "timeout" "$output_file"; then
315
+ echo "❌ 环境问题: 操作超时"
316
+ issues_found=true
317
+ fi
318
+
319
+ if grep -q "Permission denied" "$output_file"; then
320
+ echo "❌ 环境问题: 权限不足"
321
+ issues_found=true
322
+ fi
323
+
324
+ $issues_found
325
+ }
326
+ ```
327
+
328
+ ## 执行模式
329
+
330
+ ### 标准执行流程
331
+ ```bash
332
+ # 标准测试执行流程
333
+ standard_test_execution() {
334
+ local req_id="$1"
335
+ local test_target="${2:-all}"
336
+
337
+ echo "🚀 开始标准测试执行流程"
338
+
339
+ # 1. 环境准备
340
+ if ! configure_test_environment; then
341
+ echo "❌ 环境配置失败"
342
+ return 1
343
+ fi
344
+
345
+ # 2. 清理之前的测试进程
346
+ cleanup_previous_tests
347
+
348
+ # 3. 执行测试
349
+ local start_time=$(date +%s)
350
+ execute_tests_with_verbose_output "$test_target" "$req_id"
351
+ local test_exit_code=$?
352
+ local end_time=$(date +%s)
353
+ local duration=$((end_time - start_time))
354
+
355
+ # 4. 生成测试报告
356
+ generate_test_report "$req_id" "$test_target" "$test_exit_code" "$duration"
357
+
358
+ # 5. 清理测试环境
359
+ cleanup_test_environment
360
+
361
+ return $test_exit_code
362
+ }
363
+
364
+ # 清理之前的测试进程
365
+ cleanup_previous_tests() {
366
+ echo "🧹 清理之前的测试进程..."
367
+
368
+ # 杀死可能残留的测试进程
369
+ pkill -f "jest\|mocha\|pytest\|cypress" 2>/dev/null || true
370
+
371
+ # 清理测试端口
372
+ local test_ports=(3001 3002 3003 8080 8081)
373
+ for port in "${test_ports[@]}"; do
374
+ local pid=$(lsof -ti:$port 2>/dev/null)
375
+ if [ -n "$pid" ]; then
376
+ echo "🔌 终止占用端口 $port 的进程: $pid"
377
+ kill -TERM "$pid" 2>/dev/null || true
378
+ fi
379
+ done
380
+
381
+ sleep 2 # 等待进程完全终止
382
+ }
383
+
384
+ # 生成测试报告
385
+ generate_test_report() {
386
+ local req_id="$1"
387
+ local test_target="$2"
388
+ local exit_code="$3"
389
+ local duration="$4"
390
+
391
+ local report_file="devflow/requirements/${req_id}/TEST_REPORT.md"
392
+
393
+ cat > "$report_file" << EOF
394
+ # 测试报告
395
+
396
+ ## 基本信息
397
+ - 需求ID: $req_id
398
+ - 测试目标: $test_target
399
+ - 执行时间: $(date -u +%Y-%m-%dT%H:%M:%SZ)
400
+ - 执行时长: ${duration}s
401
+ - 退出码: $exit_code
402
+
403
+ ## 测试结果
404
+ $(format_test_results "$exit_code")
405
+
406
+ ## 覆盖率报告
407
+ $(extract_coverage_info)
408
+
409
+ ## 失败测试分析
410
+ $(analyze_failed_tests)
411
+
412
+ ## 建议操作
413
+ $(generate_test_recommendations "$exit_code")
414
+ EOF
415
+
416
+ echo "📋 测试报告已生成: $report_file"
417
+ }
418
+ ```
419
+
420
+ ### 输出焦点
421
+
422
+ #### 成功输出
423
+ ```bash
424
+ # 简洁的成功输出
425
+ report_test_success() {
426
+ local test_count="$1"
427
+ local duration="$2"
428
+ local coverage="$3"
429
+
430
+ echo "✅ 所有测试通过 ($test_count 个测试,用时 ${duration}s)"
431
+
432
+ if [ -n "$coverage" ]; then
433
+ echo "📊 测试覆盖率: $coverage"
434
+ fi
435
+ }
436
+ ```
437
+
438
+ #### 失败输出
439
+ ```bash
440
+ # 聚焦失败信息的输出
441
+ report_test_failures() {
442
+ local failures_file="$1"
443
+
444
+ echo "❌ 测试失败:"
445
+ echo ""
446
+
447
+ # 解析失败信息
448
+ while IFS= read -r failure_line; do
449
+ if echo "$failure_line" | grep -q "FAIL\|ERROR"; then
450
+ local test_name=$(echo "$failure_line" | sed -E 's/.*FAIL.*//; s/.*ERROR.*//')
451
+ local file_location=$(echo "$failure_line" | grep -oE "[^/]*\.spec\.[jt]s:[0-9]+")
452
+ local error_message=$(extract_error_message "$failure_line")
453
+
454
+ echo "$test_name - $file_location"
455
+ echo " 错误: $error_message"
456
+ echo " 修复建议: $(suggest_fix "$error_message")"
457
+ echo ""
458
+ fi
459
+ done < "$failures_file"
460
+ }
461
+
462
+ # 建议修复方案
463
+ suggest_fix() {
464
+ local error_message="$1"
465
+
466
+ case "$error_message" in
467
+ *"Cannot find module"*)
468
+ echo "检查模块导入路径和依赖安装"
469
+ ;;
470
+ *"ReferenceError"*)
471
+ echo "检查变量定义和作用域"
472
+ ;;
473
+ *"TypeError"*)
474
+ echo "检查数据类型和函数调用"
475
+ ;;
476
+ *"timeout"*)
477
+ echo "增加超时时间或优化异步操作"
478
+ ;;
479
+ *)
480
+ echo "查看完整错误信息和堆栈跟踪"
481
+ ;;
482
+ esac
483
+ }
484
+ ```
485
+
486
+ ## 常见问题处理
487
+
488
+ ### 问题诊断
489
+ ```bash
490
+ # 常见测试问题诊断
491
+ diagnose_common_issues() {
492
+ local output_file="$1"
493
+
494
+ echo "🔍 诊断常见测试问题..."
495
+
496
+ # 测试未找到
497
+ if grep -q "No tests found" "$output_file"; then
498
+ echo "❌ 问题: 未找到测试文件"
499
+ echo "💡 解决方案: 检查测试文件路径和命名规范"
500
+ return 1
501
+ fi
502
+
503
+ # 超时问题
504
+ if grep -q "Timeout" "$output_file"; then
505
+ echo "❌ 问题: 测试超时"
506
+ echo "💡 解决方案: 增加超时设置或优化测试逻辑"
507
+ cleanup_test_processes
508
+ return 1
509
+ fi
510
+
511
+ # 框架缺失
512
+ if grep -q "command not found" "$output_file"; then
513
+ echo "❌ 问题: 测试框架未安装"
514
+ echo "💡 解决方案: 安装依赖 - npm install 或 pip install -r requirements.txt"
515
+ return 1
516
+ fi
517
+
518
+ return 0
519
+ }
520
+
521
+ # 清理测试进程
522
+ cleanup_test_processes() {
523
+ echo "🧹 清理测试进程..."
524
+
525
+ # 强制终止可能卡住的测试进程
526
+ pkill -f "jest\|mocha\|pytest" 2>/dev/null || true
527
+
528
+ # 清理可能的文件锁
529
+ find . -name "*.lock" -delete 2>/dev/null || true
530
+
531
+ echo "✅ 测试进程清理完成"
532
+ }
533
+ ```
534
+
535
+ ### 恢复策略
536
+ ```bash
537
+ # 测试失败恢复策略
538
+ recover_from_test_failure() {
539
+ local req_id="$1"
540
+ local failure_type="$2"
541
+
542
+ echo "🔧 执行测试失败恢复..."
543
+
544
+ case "$failure_type" in
545
+ "environment")
546
+ echo "重新配置测试环境..."
547
+ cleanup_test_environment
548
+ configure_test_environment
549
+ ;;
550
+ "dependency")
551
+ echo "重新安装依赖..."
552
+ reinstall_dependencies
553
+ ;;
554
+ "process")
555
+ echo "清理进程和重启..."
556
+ cleanup_test_processes
557
+ sleep 5
558
+ ;;
559
+ "structure")
560
+ echo "需要手动修复测试结构"
561
+ generate_structure_fix_guide "$req_id"
562
+ return 1
563
+ ;;
564
+ esac
565
+
566
+ echo "✅ 恢复完成,建议重新运行测试"
567
+ }
568
+ ```
569
+
570
+ ## 重要注意事项
571
+
572
+ ### ✅ 必须遵循
573
+ - 所有测试都通过 qa-tester 子代理执行
574
+ - 不使用模拟服务,使用真实环境
575
+ - 每个测试必须完全执行完毕
576
+ - 失败时优先检查测试结构
577
+ - 捕获详细输出用于调试
578
+
579
+ ### ❌ 禁止行为
580
+ - 不要并行化测试(避免冲突)
581
+ - 不要跳过失败的测试
582
+ - 不要忽略环境问题
583
+ - 不要使用过时的测试框架
584
+
585
+ ### 🧹 清理要求
586
+ 测试执行后必须清理:
587
+ ```bash
588
+ # 标准清理流程
589
+ cleanup_after_tests() {
590
+ echo "🧹 执行测试后清理..."
591
+
592
+ # 终止测试相关进程
593
+ pkill -f "jest|mocha|pytest" 2>/dev/null || true
594
+
595
+ # 清理临时文件
596
+ rm -rf /tmp/test-* 2>/dev/null || true
597
+
598
+ # 重置测试数据库
599
+ if [ -n "$TEST_DATABASE_URL" ]; then
600
+ reset_test_database
601
+ fi
602
+
603
+ # 清理测试服务器
604
+ cleanup_test_server
605
+
606
+ echo "✅ 清理完成"
607
+ }
608
+ ```
609
+
610
+ ### 📊 报告要求
611
+ - 专注于失败信息,不要过度报告成功
612
+ - 提供可操作的修复建议
613
+ - 包含性能和覆盖率数据
614
+ - 记录环境和配置信息
615
+
616
+ ---
617
+
618
+ **核心理念**: 每个测试都应该完全执行并产生可靠的结果,失败时提供清晰的指导。