@huicai/cli 2026.714.0 → 2026.721.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/README.md +2 -1
  2. package/bin/huicai.js +83 -0
  3. package/package.json +2 -2
  4. package/skills/ab-testing/SKILL.md +58 -0
  5. package/skills/ab-testing/scripts/__pycache__/ab_test.cpython-312.pyc +0 -0
  6. package/skills/ab-testing/scripts/ab_test.py +71 -0
  7. package/skills/academic-writing/SKILL.md +54 -0
  8. package/skills/accounting-ops/SKILL.md +68 -0
  9. package/skills/accounting-ops/scripts/__pycache__/acct_tools.cpython-312.pyc +0 -0
  10. package/skills/accounting-ops/scripts/acct_tools.py +89 -0
  11. package/skills/ai-agent/SKILL.md +85 -0
  12. package/skills/ai-agent/references/tool-design-checklist.md +51 -0
  13. package/skills/ai-aiops/SKILL.md +73 -0
  14. package/skills/ai-aiops/references/aiops-rollout-checklist.md +36 -0
  15. package/skills/ai-coding/SKILL.md +89 -0
  16. package/skills/ai-coding/references/task-brief-template.md +48 -0
  17. package/skills/ai-compliance/SKILL.md +74 -0
  18. package/skills/ai-compliance/references/genai-compliance-checklist.md +40 -0
  19. package/skills/ai-eval/SKILL.md +80 -0
  20. package/skills/ai-eval/scripts/eval-runner.py +150 -0
  21. package/skills/ai-llm-app/SKILL.md +90 -0
  22. package/skills/ai-llm-app/references/llm-integration-checklist.md +39 -0
  23. package/skills/ai-mlops/SKILL.md +72 -0
  24. package/skills/ai-mlops/scripts/token-cost-calc.py +108 -0
  25. package/skills/ai-multimodal/SKILL.md +86 -0
  26. package/skills/ai-multimodal/scripts/field-validate.py +182 -0
  27. package/skills/ai-prompt/SKILL.md +75 -0
  28. package/skills/ai-prompt/references/prompt-template.md +46 -0
  29. package/skills/ai-rag/SKILL.md +76 -0
  30. package/skills/ai-rag/scripts/chunk-inspect.py +129 -0
  31. package/skills/anomaly-detection/SKILL.md +54 -0
  32. package/skills/anomaly-detection/scripts/__pycache__/anomaly.cpython-312.pyc +0 -0
  33. package/skills/anomaly-detection/scripts/anomaly.py +99 -0
  34. package/skills/api-integration/SKILL.md +74 -0
  35. package/skills/api-integration/references/signing-recipes.md +141 -0
  36. package/skills/arch-design/SKILL.md +57 -0
  37. package/skills/arch-distributed/SKILL.md +81 -0
  38. package/skills/arch-distributed/references/idempotency-review.md +43 -0
  39. package/skills/arch-multitenant/SKILL.md +73 -0
  40. package/skills/arch-multitenant/references/tenant-isolation-checklist.md +34 -0
  41. package/skills/audit-assist/SKILL.md +63 -0
  42. package/skills/audit-assist/scripts/__pycache__/audit_sampling.cpython-312.pyc +0 -0
  43. package/skills/audit-assist/scripts/audit_sampling.py +93 -0
  44. package/skills/audit-chain/SKILL.md +60 -0
  45. package/skills/banking-credit/SKILL.md +59 -0
  46. package/skills/banking-credit/scripts/__pycache__/credit_metrics.cpython-312.pyc +0 -0
  47. package/skills/banking-credit/scripts/credit_metrics.py +53 -0
  48. package/skills/brand-design/SKILL.md +56 -0
  49. package/skills/business-plan/SKILL.md +56 -0
  50. package/skills/capital-ops/SKILL.md +52 -0
  51. package/skills/cicd-pipeline/SKILL.md +85 -0
  52. package/skills/cicd-pipeline/references/pipeline-review-checklist.md +39 -0
  53. package/skills/content-creation/SKILL.md +56 -0
  54. package/skills/corporate-governance/SKILL.md +56 -0
  55. package/skills/crawl-chain/SKILL.md +61 -0
  56. package/skills/customer-service/SKILL.md +51 -0
  57. package/skills/data-analysis/SKILL.md +46 -0
  58. package/skills/data-analysis/scripts/cjk_font.py +56 -0
  59. package/skills/data-chain/SKILL.md +54 -0
  60. package/skills/data-governance/SKILL.md +54 -0
  61. package/skills/data-report-pro/SKILL.md +65 -0
  62. package/skills/data-report-pro/scripts/__pycache__/bigdata.cpython-312.pyc +0 -0
  63. package/skills/data-report-pro/scripts/bigdata.py +79 -0
  64. package/skills/data-streaming/SKILL.md +87 -0
  65. package/skills/data-streaming/references/job-checklist.md +36 -0
  66. package/skills/data-wrangling/SKILL.md +52 -0
  67. package/skills/data-wrangling/scripts/__pycache__/join_tools.cpython-312.pyc +0 -0
  68. package/skills/data-wrangling/scripts/join_tools.py +99 -0
  69. package/skills/db-es/SKILL.md +68 -0
  70. package/skills/db-es/scripts/es-health.sh +72 -0
  71. package/skills/db-migration/SKILL.md +72 -0
  72. package/skills/db-migration/scripts/checksum-mysql.sql +46 -0
  73. package/skills/db-migration/scripts/checksum-postgres.sql +39 -0
  74. package/skills/db-migration/scripts/compare-reports.py +98 -0
  75. package/skills/db-mysql/SKILL.md +78 -0
  76. package/skills/db-mysql/scripts/mysql-health.sql +80 -0
  77. package/skills/db-postgres/SKILL.md +86 -0
  78. package/skills/db-postgres/scripts/pg-health.sql +67 -0
  79. package/skills/db-redis/SKILL.md +83 -0
  80. package/skills/db-redis/scripts/redis-health.sh +92 -0
  81. package/skills/dev-cpp/SKILL.md +94 -0
  82. package/skills/dev-cpp/references/cmake-sanitizer-snippets.md +56 -0
  83. package/skills/dev-cross-platform/SKILL.md +73 -0
  84. package/skills/dev-cross-platform/references/capability-matrix-template.md +39 -0
  85. package/skills/dev-csharp/SKILL.md +96 -0
  86. package/skills/dev-csharp/references/review-checklist.md +37 -0
  87. package/skills/dev-frontend/SKILL.md +91 -0
  88. package/skills/dev-frontend/scripts/bundle-budget.py +106 -0
  89. package/skills/dev-go/SKILL.md +88 -0
  90. package/skills/dev-go/scripts/go-triage.sh +54 -0
  91. package/skills/dev-harmony/SKILL.md +64 -0
  92. package/skills/dev-harmony/references/harmony-checklist.md +40 -0
  93. package/skills/dev-java/SKILL.md +77 -0
  94. package/skills/dev-java/scripts/jvm-triage.sh +84 -0
  95. package/skills/dev-mobile/SKILL.md +82 -0
  96. package/skills/dev-mobile/references/store-compliance-checklist.md +33 -0
  97. package/skills/dev-node/SKILL.md +82 -0
  98. package/skills/dev-node/scripts/node-triage.sh +78 -0
  99. package/skills/dev-php/SKILL.md +86 -0
  100. package/skills/dev-php/scripts/fpm-calc.py +48 -0
  101. package/skills/dev-python/SKILL.md +81 -0
  102. package/skills/dev-python/scripts/venv-doctor.sh +75 -0
  103. package/skills/dev-rust/SKILL.md +84 -0
  104. package/skills/dev-rust/references/cargo-ci-snippets.md +50 -0
  105. package/skills/dev-toolchain/SKILL.md +78 -0
  106. package/skills/dev-toolchain/scripts/secret-scan.sh +83 -0
  107. package/skills/doc-chain/SKILL.md +58 -0
  108. package/skills/doc-compare/SKILL.md +44 -0
  109. package/skills/doc-compare/scripts/compare.py +93 -0
  110. package/skills/docx-author/SKILL.md +39 -0
  111. package/skills/docx-author/scripts/docx_doc.py +161 -0
  112. package/skills/ecommerce-ops/SKILL.md +54 -0
  113. package/skills/ecommerce-ops/scripts/__pycache__/gmv_decompose.cpython-312.pyc +0 -0
  114. package/skills/ecommerce-ops/scripts/gmv_decompose.py +61 -0
  115. package/skills/education-training/SKILL.md +53 -0
  116. package/skills/ehs-safety/SKILL.md +63 -0
  117. package/skills/email-writing/SKILL.md +52 -0
  118. package/skills/eng-ai/SKILL.md +74 -0
  119. package/skills/eng-ai/references/ai-feature-checklist.md +36 -0
  120. package/skills/eng-architecture/SKILL.md +85 -0
  121. package/skills/eng-architecture/scripts/capacity-calc.py +100 -0
  122. package/skills/eng-automation/SKILL.md +84 -0
  123. package/skills/eng-automation/references/automation-inventory.md +38 -0
  124. package/skills/eng-automation/references/routine-presets.md +73 -0
  125. package/skills/eng-collaboration/SKILL.md +76 -0
  126. package/skills/eng-collaboration/references/collab-templates.md +43 -0
  127. package/skills/eng-complex-env/SKILL.md +84 -0
  128. package/skills/eng-complex-env/references/env-dossier-template.md +52 -0
  129. package/skills/eng-complex-env/scripts/env-recon.sh +152 -0
  130. package/skills/eng-data-platform/SKILL.md +81 -0
  131. package/skills/eng-data-platform/references/table-spec-template.md +39 -0
  132. package/skills/eng-database/SKILL.md +79 -0
  133. package/skills/eng-database/references/schema-review-checklist.md +37 -0
  134. package/skills/eng-develop/SKILL.md +76 -0
  135. package/skills/eng-develop/references/dod-checklist.md +43 -0
  136. package/skills/eng-docs/SKILL.md +71 -0
  137. package/skills/eng-docs/references/runbook-template.md +57 -0
  138. package/skills/eng-efficiency/SKILL.md +75 -0
  139. package/skills/eng-efficiency/scripts/dora-calc.py +104 -0
  140. package/skills/eng-infra/SKILL.md +81 -0
  141. package/skills/eng-infra/references/production-readiness.md +46 -0
  142. package/skills/eng-integration/SKILL.md +82 -0
  143. package/skills/eng-integration/references/integration-dossier-template.md +38 -0
  144. package/skills/eng-legacy/SKILL.md +81 -0
  145. package/skills/eng-legacy/references/modernization-workbook.md +46 -0
  146. package/skills/eng-observability/SKILL.md +78 -0
  147. package/skills/eng-observability/scripts/slo-calc.py +82 -0
  148. package/skills/eng-ops/SKILL.md +74 -0
  149. package/skills/eng-ops/references/postmortem-template.md +67 -0
  150. package/skills/eng-performance/SKILL.md +73 -0
  151. package/skills/eng-performance/scripts/perf-baseline.py +110 -0
  152. package/skills/eng-planning/SKILL.md +79 -0
  153. package/skills/eng-planning/scripts/schedule-calc.py +101 -0
  154. package/skills/eng-quality/SKILL.md +74 -0
  155. package/skills/eng-quality/references/test-plan-templates.md +46 -0
  156. package/skills/eng-release/SKILL.md +78 -0
  157. package/skills/eng-release/references/release-plan-template.md +36 -0
  158. package/skills/eng-reliability/SKILL.md +72 -0
  159. package/skills/eng-reliability/references/resilience-review.md +43 -0
  160. package/skills/eng-requirements/SKILL.md +86 -0
  161. package/skills/eng-requirements/references/story-templates.md +47 -0
  162. package/skills/eng-research/SKILL.md +73 -0
  163. package/skills/eng-research/references/research-templates.md +42 -0
  164. package/skills/eng-security/SKILL.md +73 -0
  165. package/skills/eng-security/references/security-review-checklist.md +33 -0
  166. package/skills/eng-ux/SKILL.md +85 -0
  167. package/skills/eng-ux/references/ux-review-checklist.md +36 -0
  168. package/skills/engineering-chain/SKILL.md +101 -0
  169. package/skills/engineering-chain/references/eng-health-review.md +37 -0
  170. package/skills/env-offline/SKILL.md +81 -0
  171. package/skills/env-offline/scripts/bundle-manifest.sh +94 -0
  172. package/skills/env-private-deploy/SKILL.md +72 -0
  173. package/skills/env-private-deploy/references/delivery-templates.md +35 -0
  174. package/skills/env-xinchuang/SKILL.md +73 -0
  175. package/skills/env-xinchuang/references/adaptation-matrix-template.md +41 -0
  176. package/skills/equipment-tpm/SKILL.md +56 -0
  177. package/skills/equipment-tpm/scripts/oee.py +58 -0
  178. package/skills/esg-report/SKILL.md +58 -0
  179. package/skills/esg-report/scripts/carbon_calc.py +61 -0
  180. package/skills/event-management/SKILL.md +51 -0
  181. package/skills/excel-analysis-chain/SKILL.md +73 -0
  182. package/skills/file-ingest/SKILL.md +51 -0
  183. package/skills/file-ingest/scripts/__pycache__/file_toolkit.cpython-312.pyc +0 -0
  184. package/skills/file-ingest/scripts/file_toolkit.py +404 -0
  185. package/skills/finance-analysis/SKILL.md +60 -0
  186. package/skills/finance-analysis/references/ratios.md +54 -0
  187. package/skills/finance-analysis/scripts/fin_ratios.py +132 -0
  188. package/skills/finance-chain/SKILL.md +59 -0
  189. package/skills/financial-modeling/SKILL.md +58 -0
  190. package/skills/financial-modeling/scripts/fin_model.py +123 -0
  191. package/skills/foreign-trade/SKILL.md +54 -0
  192. package/skills/funnel-cohort/SKILL.md +53 -0
  193. package/skills/funnel-cohort/scripts/__pycache__/funnel.cpython-312.pyc +0 -0
  194. package/skills/funnel-cohort/scripts/funnel.py +105 -0
  195. package/skills/gov-document/SKILL.md +57 -0
  196. package/skills/hr-chain/SKILL.md +51 -0
  197. package/skills/hr-operations/SKILL.md +53 -0
  198. package/skills/info-disclosure/SKILL.md +56 -0
  199. package/skills/infra-gateway/SKILL.md +85 -0
  200. package/skills/infra-gateway/references/golive-checklist.md +36 -0
  201. package/skills/infra-k8s/SKILL.md +78 -0
  202. package/skills/infra-k8s/scripts/k8s-triage.sh +84 -0
  203. package/skills/infra-mq/SKILL.md +87 -0
  204. package/skills/infra-mq/references/mq-review-checklist.md +36 -0
  205. package/skills/insurance-advisory/SKILL.md +57 -0
  206. package/skills/internal-audit/SKILL.md +66 -0
  207. package/skills/ip-management/SKILL.md +54 -0
  208. package/skills/ipo-listing/SKILL.md +60 -0
  209. package/skills/it-audit/SKILL.md +56 -0
  210. package/skills/itsm-ops/SKILL.md +55 -0
  211. package/skills/knowledge-sop/SKILL.md +51 -0
  212. package/skills/legal-chain/SKILL.md +55 -0
  213. package/skills/legal-contract/SKILL.md +58 -0
  214. package/skills/legal-contract/references/contract-checklists.md +59 -0
  215. package/skills/litigation-support/SKILL.md +53 -0
  216. package/skills/logistics-warehouse/SKILL.md +53 -0
  217. package/skills/logistics-warehouse/scripts/freight_check.py +71 -0
  218. package/skills/long-doc-analysis/SKILL.md +52 -0
  219. package/skills/management-accounting/SKILL.md +57 -0
  220. package/skills/management-accounting/scripts/__pycache__/costing.cpython-312.pyc +0 -0
  221. package/skills/management-accounting/scripts/costing.py +90 -0
  222. package/skills/manufacturing-chain/SKILL.md +57 -0
  223. package/skills/manufacturing-quality/SKILL.md +57 -0
  224. package/skills/manufacturing-quality/scripts/__pycache__/spc.cpython-312.pyc +0 -0
  225. package/skills/manufacturing-quality/scripts/spc.py +86 -0
  226. package/skills/marketing-analytics/SKILL.md +59 -0
  227. package/skills/marketing-analytics/scripts/__pycache__/rfm.cpython-312.pyc +0 -0
  228. package/skills/marketing-analytics/scripts/rfm.py +60 -0
  229. package/skills/marketing-chain/SKILL.md +57 -0
  230. package/skills/meeting-minutes/SKILL.md +55 -0
  231. package/skills/metrics-system/SKILL.md +55 -0
  232. package/skills/negotiation-prep/SKILL.md +56 -0
  233. package/skills/obs-prometheus/SKILL.md +74 -0
  234. package/skills/obs-prometheus/references/promql-cheatsheet.md +78 -0
  235. package/skills/office-automation/SKILL.md +54 -0
  236. package/skills/okr-review/SKILL.md +44 -0
  237. package/skills/ops-fleet/SKILL.md +69 -0
  238. package/skills/ops-fleet/scripts/batch-exec-guard.sh +119 -0
  239. package/skills/ops-linux/SKILL.md +69 -0
  240. package/skills/ops-linux/scripts/quick-triage.sh +138 -0
  241. package/skills/optimization-solver/SKILL.md +53 -0
  242. package/skills/optimization-solver/scripts/__pycache__/solver.cpython-312.pyc +0 -0
  243. package/skills/optimization-solver/scripts/solver.py +107 -0
  244. package/skills/pdf-toolkit/SKILL.md +43 -0
  245. package/skills/pdf-toolkit/scripts/pdf_ops.py +137 -0
  246. package/skills/pivot-crosstab/SKILL.md +44 -0
  247. package/skills/pivot-crosstab/scripts/__pycache__/pivot_tools.cpython-312.pyc +0 -0
  248. package/skills/pivot-crosstab/scripts/pivot_tools.py +90 -0
  249. package/skills/policy-analysis/SKILL.md +47 -0
  250. package/skills/portfolio-analysis/SKILL.md +56 -0
  251. package/skills/portfolio-analysis/scripts/__pycache__/portfolio.cpython-312.pyc +0 -0
  252. package/skills/portfolio-analysis/scripts/portfolio.py +78 -0
  253. package/skills/ppt-chain/SKILL.md +61 -0
  254. package/skills/pptx-author/SKILL.md +48 -0
  255. package/skills/pptx-author/scripts/pptx_deck.py +193 -0
  256. package/skills/pr-comms/SKILL.md +58 -0
  257. package/skills/pr-comms/references/pr-templates.md +54 -0
  258. package/skills/procurement-supply/SKILL.md +47 -0
  259. package/skills/procurement-supply/scripts/__pycache__/supply.cpython-312.pyc +0 -0
  260. package/skills/procurement-supply/scripts/supply.py +71 -0
  261. package/skills/product-design/SKILL.md +66 -0
  262. package/skills/product-design/references/prd-framework.md +60 -0
  263. package/skills/production-planning/SKILL.md +56 -0
  264. package/skills/production-planning/scripts/__pycache__/mrp_capacity.cpython-312.pyc +0 -0
  265. package/skills/production-planning/scripts/mrp_capacity.py +70 -0
  266. package/skills/project-management/SKILL.md +53 -0
  267. package/skills/project-management/scripts/__pycache__/cpm.cpython-312.pyc +0 -0
  268. package/skills/project-management/scripts/cpm.py +84 -0
  269. package/skills/project-proposal/SKILL.md +54 -0
  270. package/skills/project-proposal/scripts/budget_sheet.py +90 -0
  271. package/skills/qa-api-automation/SKILL.md +67 -0
  272. package/skills/qa-api-automation/references/three-layer-skeleton.md +61 -0
  273. package/skills/qa-mobile-automation/SKILL.md +70 -0
  274. package/skills/qa-mobile-automation/references/device-matrix-template.md +34 -0
  275. package/skills/qa-ui-automation/SKILL.md +80 -0
  276. package/skills/qa-ui-automation/references/stability-conventions.md +41 -0
  277. package/skills/quant-analysis/SKILL.md +60 -0
  278. package/skills/quant-analysis/scripts/__pycache__/quant.cpython-312.pyc +0 -0
  279. package/skills/quant-analysis/scripts/quant.py +102 -0
  280. package/skills/real-estate-property/SKILL.md +51 -0
  281. package/skills/real-estate-property/scripts/__pycache__/property_calc.cpython-312.pyc +0 -0
  282. package/skills/real-estate-property/scripts/property_calc.py +106 -0
  283. package/skills/regression-forecast/SKILL.md +52 -0
  284. package/skills/regression-forecast/scripts/__pycache__/regress.cpython-312.pyc +0 -0
  285. package/skills/regression-forecast/scripts/regress.py +106 -0
  286. package/skills/retail-store-ops/SKILL.md +57 -0
  287. package/skills/retail-store-ops/scripts/store_ops.py +57 -0
  288. package/skills/risk-compliance/SKILL.md +51 -0
  289. package/skills/sec-auth/SKILL.md +89 -0
  290. package/skills/sec-auth/references/auth-review-checklist.md +38 -0
  291. package/skills/sec-compliance/SKILL.md +74 -0
  292. package/skills/sec-compliance/references/dengbao-checklist.md +43 -0
  293. package/skills/securities-chain/SKILL.md +69 -0
  294. package/skills/securities-research/SKILL.md +58 -0
  295. package/skills/securities-research/scripts/__pycache__/valuation.cpython-312.pyc +0 -0
  296. package/skills/securities-research/scripts/valuation.py +93 -0
  297. package/skills/slides-html/SKILL.md +50 -0
  298. package/skills/slides-html/scripts/template.html +117 -0
  299. package/skills/statistical-testing/SKILL.md +51 -0
  300. package/skills/statistical-testing/scripts/__pycache__/stat_tests.cpython-312.pyc +0 -0
  301. package/skills/statistical-testing/scripts/stat_tests.py +131 -0
  302. package/skills/strategy-planning/SKILL.md +53 -0
  303. package/skills/supply-chain/SKILL.md +53 -0
  304. package/skills/tax-compliance/SKILL.md +57 -0
  305. package/skills/tax-compliance/scripts/tax_calc.py +90 -0
  306. package/skills/tech-research/SKILL.md +55 -0
  307. package/skills/tech-research/references/research-framework.md +50 -0
  308. package/skills/tender-bidding/SKILL.md +65 -0
  309. package/skills/tender-bidding/references/bid-checklist.md +44 -0
  310. package/skills/translation-pro/SKILL.md +44 -0
  311. package/skills/treasury-mgmt/SKILL.md +56 -0
  312. package/skills/treasury-mgmt/scripts/__pycache__/cashflow_forecast.cpython-312.pyc +0 -0
  313. package/skills/treasury-mgmt/scripts/cashflow_forecast.py +51 -0
  314. package/skills/web-scraping/SKILL.md +81 -0
  315. package/skills/web-search/SKILL.md +67 -0
  316. package/skills/xlsx-analysis/SKILL.md +96 -0
  317. package/skills/xlsx-analysis/scripts/__pycache__/xlsx_toolkit.cpython-312.pyc +0 -0
  318. package/skills/xlsx-analysis/scripts/xlsx_style.py +71 -0
  319. package/skills/xlsx-analysis/scripts/xlsx_toolkit.py +335 -0
  320. package/src/agent.js +1 -1
  321. package/src/api.js +1 -1
  322. package/src/codeindex.js +1 -1
  323. package/src/commands.js +1 -1
  324. package/src/config.js +1 -1
  325. package/src/context.js +1 -1
  326. package/src/doccache.js +1 -0
  327. package/src/doctor.js +1 -1
  328. package/src/executors.js +1 -1
  329. package/src/input.js +1 -1
  330. package/src/permissions.js +1 -1
  331. package/src/pyruntime.js +1 -0
  332. package/src/repl.js +1 -1
  333. package/src/scan.js +1 -1
  334. package/src/tools.js +1 -1
  335. package/src/tui/app.js +1 -1
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: qa-api-automation
3
+ description: 接口自动化测试链(接口层 ROI 定位→单接口用例设计(边界/鉴权/幂等)与场景链串联→断言四层(状态码/schema/关键值/副作用)→三层封装组织(client/业务/用例)→造数 API 与数据自清理→CI 集成与失败三分类→脆弱率治理→契约 diff 联动)。eng-quality 的接口自动化孙链:搭接口自动化框架、回归全靠手点、用例老误报、接口改了测试不知道时载入。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 接口自动化测试链
8
+
9
+ eng-quality 的接口自动化孙链。定位:接口层是自动化 **ROI 最高**的一层——比单测覆盖广、比 UI 快十倍稳十倍;
10
+ 金字塔里它是腰(eng-quality 配比),腰有力,UI 层才能瘦。
11
+
12
+ ## 用例设计两级
13
+
14
+ - **单接口级**(每个接口标配):正向主路径/参数边界(必填缺失/类型错/超长/特殊字符,eng-quality 六法取材)/
15
+ **鉴权四问**(无 token?过期 token?别人的 token 访问我的资源——水平越权?低角色访问高接口——垂直越权?eng-security 越权双查的自动化落点)/
16
+ 幂等验证(同请求重放,该幂等的结果不变,该拦的拦重复)/异常路径(下游挂时的错误码与错误结构);
17
+ - **场景链级**(业务流串联):下单→支付→查订单→退款,上一步产出(id/状态)=下一步输入——
18
+ 单接口全绿但流程断的 bug 全靠这层;场景链选取=核心业务旅程(与 E2E 分工:接口链验数据与状态流转,UI E2E 验界面交互,qa-ui-automation)。
19
+
20
+ ## 断言四层(只断状态码=假绿之王)
21
+
22
+ 1. 状态码与响应时间上限(顺手的性能哨兵,eng-performance 基线的接口层);
23
+ 2. **schema 校验**:响应结构对契约验(字段/类型/必填,api-design 契约同源——契约即断言,自动生成校验器);
24
+ 3. 关键业务值:金额/状态/数量精确断言(全字段快照对比脆,关键字段点断稳——**断言"变化的部分"**);
25
+ 4. **副作用验证**:写接口查落库结果(直查 DB 或查询接口回读)/该发的消息发了没(测试消费者)——
26
+ 响应 200 但没落库的 bug,只有这层抓得住。
27
+
28
+ ## 分层封装组织(禁 case 里裸写 HTTP)
29
+
30
+ client 层(封 HTTP:环境地址/鉴权注入/公共头/重试)→ 业务层(语义方法:createOrder(参数)→返回业务对象,内嵌基础断言)→
31
+ 用例层(只写业务语言:造单→支付→断言状态);
32
+ 接口变更只改 client/业务层一处(用例层稳如老狗)——**用例里出现 URL 字符串=组织烂了的信号**;
33
+ 公共断言函数库(分页结构/错误结构/时间格式)统一维护。
34
+
35
+ ## 测试数据管理(环境无关是目标)
36
+
37
+ **造数 API 优先**:测试专用造数接口(或复用业务接口组合)按需造,禁依赖环境预置数据("那个环境里有条订单"=换环境全崩,eng-quality 数据独立);
38
+ 自清理:用例造的数据用例负责清(teardown 或标记回收例程);清不掉的用随机唯一值隔离(手机号/单号加测试段前缀);
39
+ 敏感环境纪律:自动化账号独立+权限最小;**生产环境只跑只读冒烟**(写操作的自动化禁碰生产,eng-ops 红线);
40
+ 时间型数据(过期/账期)用造数 API 指定时间,不真等(eng-quality 固定时钟)。
41
+
42
+ ## CI 集成与失败三分类
43
+
44
+ 分层进流水线(cicd-pipeline 承接编排):P0 冒烟(分钟级,合入门禁)/全量回归(每日+发版前,eng-quality 分级);
45
+ **失败三分类统计**(治理的抓手):产品缺陷(提单,自动化的价值时刻)/用例脆弱(数据依赖/时序假设/断言过严)/环境问题(服务没起/数据库挂)——
46
+ 三类分开出周报:缺陷率是产出,**脆弱率>10% 停下修用例**(不修=狼来了,全员免疫红灯),环境问题高发=治环境不治用例;
47
+ 失败自动留证:请求响应全文+关联 traceId(eng-observability 贯穿,一键从失败用例跳后端日志)。
48
+
49
+ ## 契约联动(接口改了,测试要先知道)
50
+
51
+ 契约 diff 例程(eng-automation):api-design 契约变更→自动列出受影响用例清单→提醒同步(新增字段补断言/删字段改用例);
52
+ 消费者驱动契约测试与接口自动化分工:契约测保"格式约定不破"(合入时拦),接口自动化保"业务行为正确"(每日回归)——两层都要,互不替代(eng-quality 契约节);
53
+ Mock 边界:第三方依赖 mock(eng-integration 的沙箱不稳定,录制回放兜底),**自有服务尽量真调**(mock 自己=测了个寂寞,eng-quality mock 纪律)。
54
+
55
+ ## 度量与治理
56
+
57
+ 有效率(发现真缺陷数/千次运行)、脆弱率、覆盖率口径用**接口清单覆盖**(多少接口有自动化)不用代码行覆盖;
58
+ 运行时长预算(全量>30min 治理:并行分片/裁冗余用例);
59
+ 用例也要还债:连续半年没拦过任何东西的用例季度评审(裁撤或加强——**用例数量不是 KPI,拦截力才是**,eng-quality 反唯覆盖率同理)。
60
+
61
+ **作业包**:`references/three-layer-skeleton.md`(client/业务/用例三层封装代码骨架+越权用例示例+纪律对照,任何栈同构照搬)。
62
+
63
+ ## 使用纪律
64
+
65
+ 新接口上线带自动化(DoD 项,eng-develop);接口变更同步用例(契约 diff 兜底);
66
+ 失败三分类周清;越权用例是安全底线必备(每个资源类接口至少一条水平越权用例);
67
+ **接口自动化的目标不是"跑起来很壮观",是发版前那句"回归全绿,放心发"**。
@@ -0,0 +1,61 @@
1
+ # 接口自动化三层封装骨架(qa-api-automation 落笔件:pytest 风格示意,任何栈同构照搬)
2
+
3
+ ## 目录结构
4
+
5
+ ```
6
+ api-tests/
7
+ ├── client/base.py # L1: HTTP 封装(环境/鉴权/公共断言)——URL 只许出现在这层
8
+ ├── services/order.py # L2: 业务语义方法(内嵌基础断言)
9
+ ├── cases/test_order.py # L3: 用例只写业务语言
10
+ ├── data/factory.py # 造数 API 封装(环境无关)
11
+ └── conftest.py # 账号/环境 fixture
12
+ ```
13
+
14
+ ## L1 client/base.py(要点示意)
15
+
16
+ ```python
17
+ class ApiClient:
18
+ def __init__(self, env): # 环境地址与账号从配置来,禁硬编码
19
+ self.base, self.token = ENV[env]["base"], login(env)
20
+ def post(self, path, json, expect=200):
21
+ r = requests.post(self.base + path, json=json,
22
+ headers={"Authorization": self.token}, timeout=10)
23
+ assert r.status_code == expect, f"{path} {r.status_code}: {r.text[:200]}"
24
+ assert r.elapsed.total_seconds() < 3 # 顺手的性能哨兵
25
+ return r.json()
26
+ ```
27
+
28
+ ## L2 services/order.py
29
+
30
+ ```python
31
+ class OrderService:
32
+ def create(self, sku, qty=1):
33
+ body = self.c.post("/orders", {"sku": sku, "qty": qty})
34
+ validate_schema(body, "order") # 契约即断言(api-design 同源生成)
35
+ return body["data"] # 返回业务对象供链式使用
36
+ def assert_persisted(self, order_id): # 副作用验证:200≠落库
37
+ row = db.fetch("select status from orders where id=%s", order_id)
38
+ assert row, f"订单 {order_id} 未落库"
39
+ ```
40
+
41
+ ## L3 cases/test_order.py(用例读起来像业务)
42
+
43
+ ```python
44
+ def test_下单_支付_状态流转(order_svc, pay_svc):
45
+ order = order_svc.create(sku=造数.商品()) # 造数 API,不依赖环境预置
46
+ pay_svc.pay(order["id"])
47
+ assert order_svc.get(order["id"])["status"] == "PAID"
48
+ order_svc.assert_persisted(order["id"])
49
+
50
+ def test_越权_他人订单不可见(order_svc, 他人token): # 每资源类接口至少一条(安全底线)
51
+ order = order_svc.create(sku=造数.商品())
52
+ resp = client_as(他人token).get(f"/orders/{order['id']}", expect=403)
53
+ ```
54
+
55
+ ## 纪律对照
56
+
57
+ - [ ] 用例层零 URL/零裸 http;接口变更只改 L1/L2 一处
58
+ - [ ] 断言四层齐:状态码+schema+关键值+副作用
59
+ - [ ] 数据自造自清(teardown/标记回收);随机唯一值隔离
60
+ - [ ] 失败留证:请求响应全文+traceId 进报告
61
+ - [ ] 失败三分类周报:产品缺陷/用例脆弱(>10% 停下修)/环境问题
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: qa-mobile-automation
3
+ description: 移动端测试自动化链(ROI 更克制≤10 条旅程→框架判据(双端原生 Espresso/XCUITest vs Appium 跨端)→设备策略(云真机矩阵按用户分布/模拟器 vs 真机判据)→稳定性专项(系统弹窗 watcher/厂商 ROM 差异/弱网注入)→accessibility id 定位→崩溃回归与性能基线自动化→兼容性云测三步曲→与 qa-ui-automation 共通纪律)。eng-quality 与 dev-mobile 的移动测试孙链:搭移动自动化、云真机选型、用例老被弹窗打断、机型兼容回归时载入。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 移动端测试自动化链
8
+
9
+ eng-quality 与 dev-mobile 共同的孙链。移动 UI 自动化=UI 自动化(qa-ui-automation)的困难模式:
10
+ 设备碎片×厂商 ROM×系统弹窗×网络波动——**复杂环境是常态而非异常**,纪律要再收紧一档。
11
+
12
+ ## ROI 判据(比 Web 更克制)
13
+
14
+ 关键旅程 **≤10 条**(登录/核心任务/支付,比 Web 的 15 条更狠——每条用例的维护成本是 Web 的 2–3 倍);
15
+ 下沉优先级:能接口层测的绝不上 UI(qa-api-automation),能 ViewModel 单测的绝不上设备(dev-mobile 分层红利)——**设备上只测"必须在设备上才能发现的"**:UI 组装/系统交互/真机行为;
16
+ 新功能先手工+录屏,冒烟稳定两个版本再自动化(qa-ui-automation 同则加严)。
17
+
18
+ ## 框架判据
19
+
20
+ | 方案 | 强项 | 判据 |
21
+ |---|---|---|
22
+ | 双端原生(Espresso/XCUITest) | 快、稳、与构建集成好 | **默认推荐**:团队双端各自维护,速度与稳定优先 |
23
+ | Appium 系 | 跨端一套用例/语言自由 | 跨端复用诉求强+接受慢与脆;混合应用/H5 页面多 |
24
+ | 混合 | 原生框架跑主力+Appium 跑跨端冒烟 | 大团队常态 |
25
+
26
+ 判据主轴:**稳定性>复用性**(跨端复用省的编写时间,会加倍还在 flaky 治理上);
27
+ uni-app/Flutter 等跨端应用(dev-cross-platform):优先框架自带测试能力,真机层留冒烟。
28
+
29
+ ## 设备策略
30
+
31
+ - **云真机矩阵按用户分布定**(dev-mobile 数据化决策同源):TOP 机型覆盖 80% 用户+最低支持版本+**问题机型黑名单转灰名单**(投诉高发机型必进矩阵);季度按分布数据刷新;
32
+ - 模拟器 vs 真机判据:模拟器跑 PR 级快反馈(便宜快);**真机必测清单**:传感器/相机/推送/性能数据/厂商 ROM 行为(权限弹窗与后台限制各家不同)/弱网表现——模拟器全绿≠真机能用;
33
+ - 自有设备架 vs 云真机:量小用云(免维护),高频回归自有小机架+云补矩阵(成本对照,eng-automation ROI);
34
+ - 设备状态治理:用例前置重置(清数据/回主屏/关弹窗),**脏设备是 flaky 第一来源**(账号池与设备池配对管理,qa-ui-automation 账号池同构)。
35
+
36
+ ## 稳定性专项(移动特供的脆弱源)
37
+
38
+ - **系统弹窗 watcher**:权限请求/系统升级/来电/低电量弹窗随时打断——全局 watcher 机制(检测到已知弹窗自动处置并记录),弹窗清单持续回写(新 ROM 新弹窗);
39
+ - 厂商 ROM 差异:权限页路径各家不同(自动化脚本按厂商分支)/后台查杀策略差异(保活相关用例分厂商断言,dev-mobile 后台限制表);
40
+ - 弱网与网络切换注入:限速/断网/WiFi-蜂窝切换场景进关键旅程(dev-mobile 弱网设计的验证面——**复杂环境用例,eng-complex-env 精神**);
41
+ - 时序纪律承 qa-ui-automation:显式等待禁 sleep(移动端加一条:等 idle/等动画结束的框架原语用起来);
42
+ - 首启与升级路径:冷装首启(引导页/权限序列)与覆盖安装(数据迁移)各留用例——**覆盖安装崩溃是差评重灾区**(dev-mobile 状态保存)。
43
+
44
+ ## 定位策略
45
+
46
+ accessibility id 优先(双端通用+顺手无障碍,eng-ux 底线联动;开发配合埋 id 进 DoD,qa-ui-automation testid 同则)→
47
+ resource-id/原生属性→ 文本(多语言环境用 key 不用文案)→ **图像识别兜底判据**:仅原生控件拿不到的第三方渲染区(地图/游戏/自绘图表),分辨率适配成本先认;
48
+ xpath 绝对路径与坐标点击=禁(换个屏幕尺寸全崩)。
49
+
50
+ ## 专项自动化(关键旅程之外的高 ROI 项)
51
+
52
+ - **崩溃回归**:monkey/随机遍历夜跑+崩溃聚类上报(dev-mobile 崩溃分级联动)——发现"点不出来的崩溃";
53
+ - **性能基线自动化**:启动耗时/帧率/内存/包体积每构建采集进基线对比(dev-mobile 三基线的自动化执行面,劣化即报,eng-performance 回归防线);
54
+ - **兼容性云测三步曲**:安装-启动-冒烟脚本跑全矩阵(每版本,便宜且拦住"某机型装不上/一开就崩"级事故);
55
+ - 专项与关键旅程分池:专项夜跑不占 PR 门禁时长(cicd-pipeline 快慢分离)。
56
+
57
+ ## 流水线集成
58
+
59
+ 分层执行:PR 级(模拟器冒烟,分钟级)→合入级(自有真机核心旅程)→每日/发版级(云真机全矩阵+专项);
60
+ 失败三分类与 flaky 治理承 qa-ui-automation(隔离/限期修/十连绿入池);
61
+ **留证四件**(比 Web 多一件):截图+页面层级 dump+**设备日志(logcat/系统日志)**+录屏——移动端不留设备日志=盲人摸象;
62
+ 真机资源排队监控(设备池饱和=反馈变慢,cicd-pipeline runner 容量同构)。
63
+
64
+ **作业包**:`references/device-matrix-template.md`(云真机矩阵登记(按用户分布)/弹窗 watcher 清单/分层执行配置/性能基线记录)。
65
+
66
+ ## 使用纪律
67
+
68
+ 旅程数红线 ≤10;真机必测清单不用模拟器充数;弹窗清单与厂商差异持续回写;
69
+ 性能基线与兼容云测每版本跑;失败留证四件齐;
70
+ 每次线上"某机型才有"的事故回写:机型进矩阵+用例进专项——**移动自动化的成熟度=矩阵拦住的机型事故数,不是用例数**。
@@ -0,0 +1,34 @@
1
+ # 移动端设备矩阵与弹窗清单(qa-mobile-automation 落笔件)
2
+
3
+ ## 1. 云真机矩阵登记(按用户分布数据定,季度刷新)
4
+
5
+ | 档位 | 机型 | OS 版本 | 用户占比 | 用途(门禁/每日/发版) | 备注(ROM 特性) |
6
+ |---|---|---|---|---|---|
7
+ | TOP | __ | | __% | 门禁核心旅程 | |
8
+ | TOP | __ | | __% | | |
9
+ | 最低支持 | __ | 最低 OS __ | __% | 发版必测 | 留存数据依据:__ |
10
+ | 灰名单 | __(投诉高发机型) | | | 发版必测 | 事故:__ |
11
+
12
+ 覆盖目标:TOP 档合计 ≥80% 用户;**真机必测清单**:传感器/相机/推送/性能采集/厂商权限页/弱网(模拟器全绿≠真机能用)。
13
+
14
+ ## 2. 系统弹窗 watcher 清单(持续回写,新 ROM 新弹窗)
15
+
16
+ | 弹窗 | 触发时机 | 识别特征(testid/文本) | 处置动作 | 登记日期 |
17
+ |---|---|---|---|---|
18
+ | 权限请求(定位/通知/相册) | 首次使用 | | 允许/拒绝分支各测 | |
19
+ | 系统升级提示 | 随机 | | 关闭 | |
20
+ | 来电/低电量 | 随机 | | 关闭+用例重试标记 | |
21
+ | 厂商弹窗(__ 系) | | | | |
22
+
23
+ ## 3. 分层执行配置
24
+
25
+ - PR 级:模拟器冒烟 __ 条(分钟级)
26
+ - 合入级:自有真机核心旅程 __ 条(≤10)
27
+ - 每日/发版:云真机全矩阵 + 专项(monkey 夜跑/兼容云测三步曲:安装-启动-冒烟/性能基线采集)
28
+
29
+ ## 4. 发布性能基线记录(dev-mobile 三基线的采集面)
30
+
31
+ | 版本 | 冷启动 P50(TOP 机型) | 冷启动(最低档) | 包体积 | 崩溃率(灰度) | 结论 |
32
+ |---|---|---|---|---|---|
33
+
34
+ > 劣化当 bug 修;失败留证四件:截图+层级 dump+**设备日志**+录屏(不留设备日志=盲人摸象)。
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: qa-ui-automation
3
+ description: UI 自动化测试链(ROI 判据只自动化稳定关键旅程→选择器策略(testid>角色文本>CSS,禁 XPath 绝对路径)→显式等待禁 sleep→POM 页面对象→用例独立与登录态复用→重试纪律与脆弱治理→失败自动留证三件→并行分片提速→视觉回归与移动端判据)。eng-quality 的 UI 自动化孙链:搭 Web UI 自动化、E2E 老是挂、跑一轮要两小时、"又是环境问题"时载入。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # UI 自动化测试链
8
+
9
+ eng-quality 的 UI 自动化孙链(Playwright 一代工具为基线)。
10
+ UI 层是金字塔塔尖:**最贵、最脆、最慢**——纪律的核心是克制规模、死磕稳定;
11
+ "UI 自动化多"不是成熟,是负债(eng-quality 倒金字塔警告的执行面)。
12
+
13
+ ## ROI 判据(先想清楚测多少)
14
+
15
+ 只自动化**稳定的关键用户旅程**(登录/核心任务闭环/支付,≤15 条,eng-quality 上限);
16
+ 判据三问:流程稳定了吗(天天改的页面别自动化,改完再上)/失败真会拦发布吗(不拦=装饰)/接口层能测吗(**能下沉接口层的绝不留 UI 层**,qa-api-automation 十倍便宜)——
17
+ UI 层只测"接口测不到的":页面组装/交互流转/前后端联通;
18
+ 新功能与探索用手工+录屏,冒烟稳定后再自动化。
19
+
20
+ ## 选择器策略(脆弱的第一来源)
21
+
22
+ 优先级:**data-testid 语义属性** > 角色+可见文本(getByRole,顺手验了无障碍,eng-ux) > 稳定 CSS 类 > 禁:绝对 XPath/自动生成类名(css-1x2y3z)/nth-child 位置流(改个顺序全崩);
23
+ **测试性是开发验收项**:关键元素带 testid 进 DoD(dev-frontend 配合,前端改样式不背锅);
24
+ testid 命名规范(页面-组件-动作),与组件库约定生成;
25
+ 文案断言用 key 或正则(文案微调不该红)。
26
+
27
+ ## 等待策略(禁 sleep 是铁律)
28
+
29
+ **显式等待条件**:等元素可交互/等请求完成/等加载态消失——现代框架自动等待为主,补显式条件为辅;
30
+ `sleep(3000)` 双输:慢时不够(照样挂)、快时白等(拖时长)——评审见一个拦一个;
31
+ 动画与过渡:等终态不等动画(或测试环境关动画);
32
+ 轮询型页面:等数据条件(列表出现目标行)不是等时间;
33
+ 超时分层:单元素等待(秒级)<用例超时(分钟级)<全局超时,超时值有依据(P99 加载实测)。
34
+
35
+ ## 组织模式(POM 页面对象)
36
+
37
+ 页面对象收口:每页一个类(选择器+页面动作方法),**页面结构变化只改一处**(qa-api-automation 分层同理);
38
+ 组件对象复用(通用弹窗/表格/表单控件抽公共对象);
39
+ 用例层只写业务语言:`登录页.登录(账号)→工作台.新建报销(数据)→断言(状态)`;
40
+ 断言就近业务含义(assertOrderCreated 优于三行元素断言拼凑)。
41
+
42
+ ## 用例独立与状态管理
43
+
44
+ 用例间零依赖(A 建的单 B 用=A 挂 B 陪葬,禁;各自造数,qa-api-automation 造数 API 复用——**UI 测试的数据从接口造,别用 UI 点出来**,又慢又脆);
45
+ 登录态复用:会话状态(storageState)一次登录全局复用,**别每条用例走一遍登录 UI**(登录本身单独一条用例测);
46
+ 浏览器上下文隔离(每用例新 context,缓存 cookie 零污染);
47
+ 账号池:并行时账号隔离(同账号并行=数据窜)。
48
+
49
+ ## 重试与脆弱治理(重试是止痛药不是治疗)
50
+
51
+ 重试纪律:整案重试 ≤1 次且**计数上报**——重试后通过的用例标记"flaky",周报列名;
52
+ **flaky 治理流程**:隔离(挪出门禁池,不拦人)→限期修(两周)→修不好裁撤——带病用例留在门禁=全员学会无视红灯(比没有更毒);
53
+ 脆弱根因 TOP:时序假设(等待策略修)/数据残留(独立性修)/环境不稳(测试环境治理,eng-infra)/选择器脆(策略修)——分类统计对症下药(qa-api-automation 三分类同构);
54
+ 稳定性验收:新用例连跑 10 遍全绿才入门禁池。
55
+
56
+ ## 失败诊断(自动留证三件)
57
+
58
+ 失败自动保存:**截图+trace 录制(操作与网络时间线回放)+页面快照**——回放一看即知,不用本地复跑猜;
59
+ 关联后端:traceId 从前端请求带出,失败用例一键跳后端日志(eng-observability 贯穿);
60
+ 失败信息可行动:断言消息说清期望与实际+业务语境("订单状态应为已支付,实际待支付"),不是"element not found"裸奔。
61
+
62
+ ## 速度工程
63
+
64
+ 并行分片:用例天然独立(前提是独立性纪律)→按 worker 并行+CI 分片(cicd-pipeline 矩阵);
65
+ **全量>30 分钟必治理**(裁用例/加并行/下沉接口层);
66
+ 无头模式跑常规,有头留调试;测试环境专用与稳定(共享联调环境跑 E2E=天天误报,eng-infra 环境矩阵)。
67
+
68
+ ## 扩展判据
69
+
70
+ 视觉回归:组件库/设计系统才上(像素对比误报率高,阈值与忽略区要精调,eng-ux 走查的自动化补充);
71
+ 移动端 UI 自动化:云真机跑关键旅程(dev-mobile 测试节),原生控件定位另有体系,量更克制(≤10 条);
72
+ 跨浏览器矩阵:主力浏览器每次跑,长尾浏览器每日跑(browserslist 对齐,dev-frontend)。
73
+
74
+ **作业包**:`references/stability-conventions.md`(团队约定卡(选择器/等待/十连绿)/POM 骨架/flaky 登记表/失败三件确认)。
75
+
76
+ ## 使用纪律
77
+
78
+ E2E 数量红线守住(增一条先问"能不能下沉");sleep 与绝对 XPath 评审必拦;
79
+ flaky 周清、门禁池只留十连绿;失败三件必留;
80
+ **UI 自动化的成熟度=红灯的可信度:红了就是真有问题,团队看到红灯的第一反应是查代码而不是点重跑**。
@@ -0,0 +1,41 @@
1
+ # UI 自动化稳定性约定与 flaky 登记(qa-ui-automation 落笔件)
2
+
3
+ ## 1. 团队约定卡(贴仓库首页,评审对照)
4
+
5
+ - 选择器优先级:data-testid > 角色+文本(getByRole) > 稳定 CSS;**禁**:绝对 XPath/自动生成类名/nth-child
6
+ - 等待:显式条件(可交互/请求完成/加载态消失);**禁 sleep**(见一个拦一个)
7
+ - 用例独立:数据接口造(不用 UI 点出来);登录态 storageState 复用(登录本身单独一条用例)
8
+ - 断言:业务含义就近封装;文案断言用 key/正则不用全文
9
+ - 新用例准入:**十连绿**才进门禁池;E2E 总数红线 ≤15(增一条先问能不能下沉接口层)
10
+
11
+ ## 2. POM 骨架示意
12
+
13
+ ```ts
14
+ class 报销页 {
15
+ constructor(private page: Page) {}
16
+ 金额输入 = () => this.page.getByTestId('expense-amount')
17
+ async 提交报销(数据: 报销单) {
18
+ await this.金额输入().fill(数据.金额)
19
+ await this.page.getByRole('button', { name: '提交' }).click()
20
+ await expect(this.page.getByTestId('result-toast')).toBeVisible()
21
+ }
22
+ }
23
+ // 页面结构变化只改这里;用例层: await 报销页.提交报销(造数.报销单())
24
+ ```
25
+
26
+ ## 3. flaky 登记表(周清;重试通过≠通过)
27
+
28
+ | 用例 | 首次记录 | 重试通过次数(7天) | 根因分类(时序/数据残留/环境/选择器) | 处置(修/隔离/裁撤) | 期限 |
29
+ |---|---|---|---|---|---|
30
+
31
+ 处置纪律:隔离(挪出门禁池不拦人)→限期两周修→修不好裁撤——带病用例留门禁=全员学会无视红灯。
32
+
33
+ ## 4. 失败诊断三件确认
34
+
35
+ - [ ] 截图+trace 录制+页面快照自动保存
36
+ - [ ] traceId 从前端带出,失败用例一键跳后端日志
37
+ - [ ] 断言消息带业务语境("订单状态应为已支付,实际待支付",不是 element not found)
38
+
39
+ ## 5. 速度治理
40
+
41
+ 全量时长 __ 分钟(>30 治理:并行分片/裁用例/下沉);并行隔离:账号池 __ 个/数据前缀 __
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: quant-analysis
3
+ description: 行情量化分析(收益率/波动/最大回撤/夏普、均线 MACD RSI 等技术指标计算、策略回测与过拟合防护)。当用户给出行情数据说"分析这只股票/算收益回撤/技术指标/回测策略"时使用。研究工具,不构成投资建议。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 行情量化分析(证券技能链 · 投资分析环;全景见 securities-chain)
8
+
9
+ ## 合规红线(每份产出末尾固定声明)
10
+
11
+ 「本内容为历史数据的统计分析与研究工具输出,**不构成投资建议**;历史表现不代表未来;
12
+ 据此操作风险自担。」**禁止**:预测点位/荐股/"必涨必跌"措辞/承诺收益。
13
+ 数据来源与截止日期必须标注(用户提供数据以用户为准,联网获取注明渠道与抓取时间)。
14
+
15
+ ## 基础统计(`read_skill_file` 读 `scripts/quant.py`)
16
+
17
+ - `perf_stats()`:日收益率 → 累计收益/年化收益(252 口径)/年化波动/**夏普比率**
18
+ (rf 参数化,注明取值)/**最大回撤**(峰谷法,给回撤起止日)/最长水下时长——
19
+ **收益不看回撤=只看了一半**,两者并报;
20
+ - 分布特征:偏度峰度提示(肥尾时正态假设的 VaR 低估,如实标注);
21
+ - 多标的对比:同期口径对齐(交易日对齐/复权口径注明——**不复权的长期对比是错的**)。
22
+
23
+ ## 技术指标(计算器,不是信号灯)
24
+
25
+ `ma()/ema()/macd()/rsi()/boll()` 标准公式实现(参数与算法口径注明:RSI 用 Wilder 平滑);
26
+ 指标使用纪律:指标描述的是**已发生的价格**,把指标当预测器是最常见误用——
27
+ 产出措辞用"当前 RSI=72,处于传统超买区间"(陈述),不用"即将回调"(预测)。
28
+
29
+ ## 策略回测(`backtest()`,防自欺三件套内置)
30
+
31
+ 1. **防前视偏差**:信号一律 shift(1)——今天收盘算出的信号明天才能执行,
32
+ 脚本内置且**不可关闭**;
33
+ 2. **成本计入**:手续费+滑点参数化(默认双边千一,高换手策略不算成本=纸面富贵);
34
+ 3. **过拟合防护**:样本内/样本外切分(默认 70/30),**样本外单独报告**;
35
+ 参数敏感性(参数 ±20% 收益剧变=过拟合嫌疑);
36
+ 产出固定含「回测局限声明」:未含分红送转处理细节/流动性冲击/幸存者偏差(单票回测
37
+ 天然幸存者偏差)。
38
+ - 回测报告规范:策略收益 vs **买入持有基准**(跑不赢基准的复杂策略=负价值)、
39
+ 年化/回撤/夏普/换手四件套、样本外衰减度。
40
+
41
+ ## 组合视角
42
+
43
+ 多标的相关性矩阵(分散化的前提是低相关,**危机时相关性趋同**的提示);
44
+ 组合层面分析转 portfolio-analysis(贡献分解/Brinson 归因/再平衡)。
45
+
46
+ ## 与研究链的衔接
47
+
48
+ 量化是 securities-research 基本面研究的补充视角(估值锚 vs 价格行为);
49
+ 数据加工大表走 data-report-pro;结论进报告走 docx-author 并带全套声明。
50
+
51
+ ## 验收自查
52
+
53
+ - [ ] 收益与回撤并报;口径(复权/年化基数/rf)注明
54
+ - [ ] 回测过防前视/含成本/样本外三关
55
+ - [ ] 措辞全部陈述式,无预测荐股
56
+ - [ ] 末尾声明与数据来源日期在
57
+
58
+ ## 附件
59
+
60
+ - `scripts/quant.py` — perf_stats/MA/EMA/MACD/RSI/BOLL/backtest(shift 防前视+成本+样本外切分);可直接执行自测
@@ -0,0 +1,102 @@
1
+ # 行情量化计算件(经 run_python 执行):绩效统计 / 技术指标 / 防前视回测(含成本与样本外切分)。
2
+ # ⚠ 研究工具,不构成投资建议;历史表现不代表未来。直接执行本文件 = 自测(合成数据)。
3
+ import numpy as np
4
+ import pandas as pd
5
+
6
+ ANN = 252 # 年化交易日
7
+
8
+
9
+ def perf_stats(prices, rf=0.02, name='标的'):
10
+ """输入价格序列(pd.Series,索引为日期或序号)。输出年化收益/波动/夏普/最大回撤等。"""
11
+ p = pd.Series(prices).astype(float).dropna()
12
+ ret = p.pct_change().dropna()
13
+ total = p.iloc[-1] / p.iloc[0] - 1
14
+ years = len(ret) / ANN
15
+ cagr = (1 + total) ** (1 / years) - 1 if years > 0 else np.nan
16
+ vol = ret.std(ddof=1) * np.sqrt(ANN)
17
+ sharpe = (cagr - rf) / vol if vol > 0 else np.nan
18
+ cum = (1 + ret).cumprod()
19
+ peak = cum.cummax()
20
+ dd = cum / peak - 1
21
+ mdd = float(dd.min())
22
+ end_i = int(dd.idxmin()) if dd.index.dtype != 'O' else dd.idxmin()
23
+ print(f'[{name}] 累计 {total:+.1%} · 年化 {cagr:+.2%} · 波动 {vol:.2%} · '
24
+ f'夏普 {sharpe:.2f}(rf={rf:.1%}) · 最大回撤 {mdd:.1%}')
25
+ return {'total': round(total, 4), 'cagr': round(cagr, 4), 'vol': round(vol, 4),
26
+ 'sharpe': round(float(sharpe), 2), 'max_drawdown': round(mdd, 4), 'dd_end': end_i}
27
+
28
+
29
+ def ma(prices, n):
30
+ return pd.Series(prices).rolling(n).mean()
31
+
32
+
33
+ def ema(prices, n):
34
+ return pd.Series(prices).ewm(span=n, adjust=False).mean()
35
+
36
+
37
+ def macd(prices, fast=12, slow=26, signal=9):
38
+ dif = ema(prices, fast) - ema(prices, slow)
39
+ dea = dif.ewm(span=signal, adjust=False).mean()
40
+ return dif, dea, (dif - dea) * 2
41
+
42
+
43
+ def rsi(prices, n=14):
44
+ """Wilder 平滑 RSI。"""
45
+ p = pd.Series(prices).astype(float)
46
+ delta = p.diff()
47
+ up = delta.clip(lower=0).ewm(alpha=1 / n, adjust=False).mean()
48
+ dn = (-delta.clip(upper=0)).ewm(alpha=1 / n, adjust=False).mean()
49
+ rs = up / dn.replace(0, np.nan)
50
+ return 100 - 100 / (1 + rs)
51
+
52
+
53
+ def boll(prices, n=20, k=2.0):
54
+ mid = ma(prices, n)
55
+ sd = pd.Series(prices).rolling(n).std(ddof=1)
56
+ return mid, mid + k * sd, mid - k * sd
57
+
58
+
59
+ def backtest(prices, signal, fee=0.001, split=0.7, name='策略'):
60
+ """防自欺回测:signal 为持仓意图(0/1),**内部强制 shift(1)**(今日信号明日执行,防前视);
61
+ 双边费率 fee;按 split 切样本内/外分别报告。返回 (整体统计, 样本外统计, 净值序列)。"""
62
+ p = pd.Series(prices).astype(float).reset_index(drop=True)
63
+ sig = pd.Series(signal).astype(float).reset_index(drop=True).clip(0, 1)
64
+ pos = sig.shift(1).fillna(0) # 防前视:不可关闭
65
+ ret = p.pct_change().fillna(0)
66
+ turns = pos.diff().abs().fillna(pos.iloc[0])
67
+ strat = pos * ret - turns * fee
68
+ nav = (1 + strat).cumprod()
69
+ cut = int(len(p) * split)
70
+ print(f'—— {name}:整体(含样本内) ——')
71
+ full = perf_stats((1 + strat).cumprod() * 100, name=f'{name}-整体')
72
+ print(f'—— {name}:样本外(后 {1 - split:.0%},唯一算数的部分) ——')
73
+ oos = perf_stats((1 + strat.iloc[cut:]).cumprod() * 100, name=f'{name}-样本外')
74
+ bh = perf_stats(p, name='买入持有基准')
75
+ print(f'[对比] 策略样本外年化 {oos["cagr"]:+.2%} vs 基准全期年化 {bh["cagr"]:+.2%} · '
76
+ f'年换手 {turns.sum() / (len(p) / ANN):.1f} 次')
77
+ print('⚠ 回测局限:历史≠未来;未含分红细节/流动性冲击/幸存者偏差。不构成投资建议。')
78
+ return full, oos, nav
79
+
80
+
81
+ if __name__ == '__main__':
82
+ rng = np.random.default_rng(9)
83
+ steps = rng.normal(0.0004, 0.015, 750)
84
+ px = pd.Series(100 * np.exp(np.cumsum(steps)))
85
+ s = perf_stats(px, name='合成标的')
86
+ assert -1 < s['max_drawdown'] < 0 and s['vol'] > 0
87
+ # 手工校验最大回撤:与逐点扫描一致
88
+ cum = px / px.iloc[0]
89
+ manual_mdd = float((cum / cum.cummax() - 1).min())
90
+ assert abs(s['max_drawdown'] - manual_mdd) < 1e-4 # 返回值四舍五入到 4 位,按同精度比较
91
+ r = rsi(px)
92
+ assert r.dropna().between(0, 100).all()
93
+ dif, dea, hist = macd(px)
94
+ assert abs(float(hist.iloc[-1]) - 2 * (float(dif.iloc[-1]) - float(dea.iloc[-1]))) < 1e-9
95
+ sig = (px > ma(px, 20)).astype(int)
96
+ full, oos, nav = backtest(px, sig, name='MA20 择时')
97
+ # 防前视验证:把"作弊版"(不 shift)与正版比,作弊版收益应显著更高(同信号)
98
+ cheat = ((sig * px.pct_change().fillna(0)) - sig.diff().abs().fillna(0) * 0.001)
99
+ honest = ((sig.shift(1).fillna(0) * px.pct_change().fillna(0)) - sig.shift(1).fillna(0).diff().abs().fillna(0) * 0.001)
100
+ assert (1 + cheat).prod() != (1 + honest).prod(), '正版必须与作弊版不同(shift 生效)'
101
+ assert len(nav) == len(px)
102
+ print('OK quant.py')
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: real-estate-property
3
+ description: 房地产与物业(投资测算 IRR、租赁运营报表、租约到期管理、物业经营分析、资产盘点)。当用户说"测算这个物业/租金回报/出租率/租约管理/物业收缴率/资产台账"时使用。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 房地产与物业(现金流测算可复算,运营报表口径先行)
8
+
9
+ ## 投资测算(`read_skill_file` 读 `scripts/property_calc.py`)
10
+
11
+ - **持有型物业现金流模型**:期初投入(购置+改造+税费)→ 逐年净现金流
12
+ (潜在租金 ×(1−空置率) − 运营费用 − 税费)→ 退出(退出年 NOI ÷ 退出资本化率 − 交易成本);
13
+ `irr()`(牛顿法+二分兜底,可复算)与回收期、`cap_rate()`(NOI/资产价值——**买卖双方的
14
+ 资本化率之争就是价格之争**,给敏感性);
15
+ - 口径纪律:NOI 不含折旧与财务费用;租金增长率与空置率分开设参(合并设参会互相掩盖);
16
+ 改造 Capex 与运营费分列;
17
+ - 杠杆测算:加入贷款后算权益 IRR 与 DSCR(转 banking-credit 口径),**杠杆放大的是波动
18
+ 不是价值**——无杠杆 IRR 先看;
19
+ - 租售比/毛租金回报率速查(年租金/总价),与 cap rate 区分(毛 vs 净)。
20
+
21
+ ## 租赁运营(收益管理三张表)
22
+
23
+ 1. **租约台账**:租户/面积/单价/起止/免租期/递增条款/押金/中介费——免租期与中介费
24
+ **摊销进有效租金**(Effective Rent)才可比,`effective_rent()` 计算;
25
+ 2. **到期瀑布**:`lease_expiry_waterfall()` 按年(或季)到期面积与租金占比——
26
+ 到期集中度 >30%/年 = 续租风险预警,提前 6–12 个月启动续谈;
27
+ 3. **出租率双口径**:面积出租率与租金出租率(低价填坑会让面积口径虚高);
28
+ 空置分析:空置面积×市场租金=机会成本,倒逼定价决策。
29
+
30
+ ## 物业经营分析
31
+
32
+ 收缴率(**当期收缴率与累计清欠分开**,合并口径会掩盖历史欠费)/ 报事工单
33
+ (响应-完成时效分位数、重复报修率=质量信号、分类帕累托转 customer-service 方法)/
34
+ 能耗(公区能耗单价面积口径,同比+异常月归因)/ 增值收入占比(多经/停车/广告位);
35
+ 物业费测算:成本清单法(人员/能耗/维保/管理分摊)→ 单价倒算与市场对标。
36
+
37
+ ## 资产盘点与台账
38
+
39
+ 产权状态(证载/抵押/查封核查项)/ 使用状态(自用/出租/闲置——**闲置资产年持有成本
40
+ 显性化**:折旧+税费+维保,推动处置决策)/ 账面 vs 评估价值差异表。
41
+
42
+ ## 验收自查
43
+
44
+ - [ ] 测算含空置率与退出假设,IRR 给敏感性
45
+ - [ ] 有效租金摊销了免租与中介费
46
+ - [ ] 到期瀑布做了集中度预警
47
+ - [ ] 收缴率双口径,报事看分位数
48
+
49
+ ## 附件
50
+
51
+ - `scripts/property_calc.py` — irr(牛顿+二分)/cap_rate/effective_rent/lease_expiry_waterfall;可直接执行自测