@tinkcarlos/skillora 0.2.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.
- package/.claude/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Batch Processing Strategy
|
|
2
|
+
|
|
3
|
+
## 核心原则
|
|
4
|
+
|
|
5
|
+
**大范围 code review 必须分批处理,避免上下文溢出导致遗漏。**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 分批阈值
|
|
10
|
+
|
|
11
|
+
| 指标 | 阈值 | 处理方式 |
|
|
12
|
+
|------|------|----------|
|
|
13
|
+
| 文件数 | ≤ 5 | 单批处理 |
|
|
14
|
+
| 文件数 | 6-15 | 分 2-3 批 |
|
|
15
|
+
| 文件数 | > 15 | 分 4+ 批 |
|
|
16
|
+
| 单文件行数 | ≤ 200 | 正常处理 |
|
|
17
|
+
| 单文件行数 | 201-500 | 重点关注 |
|
|
18
|
+
| 单文件行数 | > 500 | 单独一批 |
|
|
19
|
+
| 总变更行数 | ≤ 400 | 单批处理 |
|
|
20
|
+
| 总变更行数 | > 400 | 必须分批 |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 分批策略
|
|
25
|
+
|
|
26
|
+
### Strategy 1: 按依赖关系分批
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Batch 1: 基础层 (models, types, utils)
|
|
30
|
+
↓
|
|
31
|
+
Batch 2: 服务层 (services, repositories)
|
|
32
|
+
↓
|
|
33
|
+
Batch 3: 接口层 (controllers, routes, handlers)
|
|
34
|
+
↓
|
|
35
|
+
Batch 4: 表现层 (components, views)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**优点**: 按调用链顺序,便于追踪影响
|
|
39
|
+
|
|
40
|
+
### Strategy 2: 按风险等级分批
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Batch 1: 高风险 (auth, payment, data)
|
|
44
|
+
↓
|
|
45
|
+
Batch 2: 中风险 (business logic)
|
|
46
|
+
↓
|
|
47
|
+
Batch 3: 低风险 (UI, utils)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**优点**: 优先处理关键代码
|
|
51
|
+
|
|
52
|
+
### Strategy 3: 按变更类型分批
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
Batch 1: 新增文件
|
|
56
|
+
↓
|
|
57
|
+
Batch 2: 修改文件 (核心逻辑)
|
|
58
|
+
↓
|
|
59
|
+
Batch 3: 修改文件 (配置/测试)
|
|
60
|
+
↓
|
|
61
|
+
Batch 4: 删除文件 (验证无残留引用)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**优点**: 同类变更一起处理
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 分批执行流程
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
72
|
+
│ Phase 1: 分批规划 │
|
|
73
|
+
│ ───────────────────────────────────────────────────────── │
|
|
74
|
+
│ 1. 统计文件数和行数 │
|
|
75
|
+
│ 2. 选择分批策略 │
|
|
76
|
+
│ 3. 创建批次计划 │
|
|
77
|
+
│ 4. 记录到 Progress Tracker │
|
|
78
|
+
└─────────────────────────────────────────────────────────────┘
|
|
79
|
+
↓
|
|
80
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
81
|
+
│ Phase 2: 批次执行 │
|
|
82
|
+
│ ───────────────────────────────────────────────────────── │
|
|
83
|
+
│ For each batch: │
|
|
84
|
+
│ 1. 输出 "开始 Batch X/N" │
|
|
85
|
+
│ 2. 逐文件分析 + Checkpoint │
|
|
86
|
+
│ 3. 输出 "完成 Batch X/N" │
|
|
87
|
+
│ 4. 更新 Progress Tracker │
|
|
88
|
+
└─────────────────────────────────────────────────────────────┘
|
|
89
|
+
↓
|
|
90
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
91
|
+
│ Phase 3: 跨批次验证 │
|
|
92
|
+
│ ───────────────────────────────────────────────────────── │
|
|
93
|
+
│ 1. 检查跨批次依赖 │
|
|
94
|
+
│ 2. 验证调用链完整性 │
|
|
95
|
+
│ 3. 汇总所有发现 │
|
|
96
|
+
└─────────────────────────────────────────────────────────────┘
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 批次计划模板
|
|
102
|
+
|
|
103
|
+
```markdown
|
|
104
|
+
## Batch Plan
|
|
105
|
+
|
|
106
|
+
### Overview
|
|
107
|
+
- **Total Files**: 12
|
|
108
|
+
- **Total Lines**: 1,500
|
|
109
|
+
- **Strategy**: 按依赖关系分批
|
|
110
|
+
- **Batches**: 3
|
|
111
|
+
|
|
112
|
+
### Batch 1: 基础层 (4 files, ~400 lines)
|
|
113
|
+
| # | File | Lines | Risk |
|
|
114
|
+
|---|------|-------|------|
|
|
115
|
+
| 1 | models/user.ts | 120 | Medium |
|
|
116
|
+
| 2 | models/order.ts | 80 | Medium |
|
|
117
|
+
| 3 | types/index.ts | 50 | Low |
|
|
118
|
+
| 4 | utils/helpers.ts | 150 | Low |
|
|
119
|
+
|
|
120
|
+
### Batch 2: 服务层 (4 files, ~600 lines)
|
|
121
|
+
| # | File | Lines | Risk |
|
|
122
|
+
|---|------|-------|------|
|
|
123
|
+
| 5 | services/auth.ts | 200 | High |
|
|
124
|
+
| 6 | services/order.ts | 180 | High |
|
|
125
|
+
| 7 | services/payment.ts | 150 | High |
|
|
126
|
+
| 8 | repositories/user.ts | 70 | Medium |
|
|
127
|
+
|
|
128
|
+
### Batch 3: 接口层 (4 files, ~500 lines)
|
|
129
|
+
| # | File | Lines | Risk |
|
|
130
|
+
|---|------|-------|------|
|
|
131
|
+
| 9 | routes/auth.ts | 150 | High |
|
|
132
|
+
| 10 | routes/order.ts | 120 | Medium |
|
|
133
|
+
| 11 | controllers/user.ts | 130 | Medium |
|
|
134
|
+
| 12 | middleware/auth.ts | 100 | High |
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 批次完成确认
|
|
140
|
+
|
|
141
|
+
每个批次完成后,必须输出:
|
|
142
|
+
|
|
143
|
+
```markdown
|
|
144
|
+
## Batch X/N Complete
|
|
145
|
+
|
|
146
|
+
### Summary
|
|
147
|
+
- **Files Analyzed**: 4/4
|
|
148
|
+
- **Issues Found**: 3 (1×P0, 1×P1, 1×P2)
|
|
149
|
+
- **Checkpoints**: CP-001 ~ CP-004
|
|
150
|
+
|
|
151
|
+
### Cross-Batch Dependencies
|
|
152
|
+
| Symbol | Defined In | Used In Next Batch |
|
|
153
|
+
|--------|------------|-------------------|
|
|
154
|
+
| `User` | models/user.ts | services/auth.ts |
|
|
155
|
+
| `validateToken()` | utils/helpers.ts | middleware/auth.ts |
|
|
156
|
+
|
|
157
|
+
### Ready for Next Batch: ✅
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 上下文恢复机制
|
|
163
|
+
|
|
164
|
+
如果 review 中断,可以从 Progress Tracker 恢复:
|
|
165
|
+
|
|
166
|
+
```markdown
|
|
167
|
+
## Resume Point
|
|
168
|
+
|
|
169
|
+
**Last Completed**:
|
|
170
|
+
- Batch: 2/3
|
|
171
|
+
- File: services/payment.ts
|
|
172
|
+
- Checkpoint: CP-007
|
|
173
|
+
|
|
174
|
+
**Pending**:
|
|
175
|
+
- Batch 3: 4 files
|
|
176
|
+
- Files: routes/auth.ts, routes/order.ts, controllers/user.ts, middleware/auth.ts
|
|
177
|
+
|
|
178
|
+
**Resume Command**:
|
|
179
|
+
继续从 Batch 3 开始,先读取 CP-001 ~ CP-007 的发现摘要
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 与 Progress Tracker 集成
|
|
185
|
+
|
|
186
|
+
在 Progress Tracker 中添加批次信息:
|
|
187
|
+
|
|
188
|
+
```markdown
|
|
189
|
+
## Batch Progress
|
|
190
|
+
|
|
191
|
+
| Batch | Files | Status | Issues |
|
|
192
|
+
|-------|-------|--------|--------|
|
|
193
|
+
| 1/3 | 4 | ✅ Done | 1 |
|
|
194
|
+
| 2/3 | 4 | ✅ Done | 2 |
|
|
195
|
+
| 3/3 | 4 | 🔄 In Progress | - |
|
|
196
|
+
|
|
197
|
+
**Current**: Batch 3, File 2/4 (routes/order.ts)
|
|
198
|
+
```
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Call Chain Analysis Protocol
|
|
2
|
+
|
|
3
|
+
## 核心原则
|
|
4
|
+
|
|
5
|
+
**深度追踪调用链,确保不遗漏间接影响的 bug。**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 调用链分析层级
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
13
|
+
│ Level 0: 当前文件内的调用 │
|
|
14
|
+
│ ───────────────────────────────────────────────────────── │
|
|
15
|
+
│ 函数 A → 函数 B → 函数 C (同一文件内) │
|
|
16
|
+
└─────────────────────────────────────────────────────────────┘
|
|
17
|
+
↓
|
|
18
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
19
|
+
│ Level 1: 直接依赖 (import/require) │
|
|
20
|
+
│ ───────────────────────────────────────────────────────── │
|
|
21
|
+
│ 当前文件 → 直接导入的模块 │
|
|
22
|
+
└─────────────────────────────────────────────────────────────┘
|
|
23
|
+
↓
|
|
24
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
25
|
+
│ Level 2: 间接依赖 (依赖的依赖) │
|
|
26
|
+
│ ───────────────────────────────────────────────────────── │
|
|
27
|
+
│ 当前文件 → 模块 A → 模块 B │
|
|
28
|
+
└─────────────────────────────────────────────────────────────┘
|
|
29
|
+
↓
|
|
30
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
31
|
+
│ Level 3: 反向依赖 (谁调用了我) │
|
|
32
|
+
│ ───────────────────────────────────────────────────────── │
|
|
33
|
+
│ 调用者 A → 当前文件 │
|
|
34
|
+
│ 调用者 B → 当前文件 │
|
|
35
|
+
└─────────────────────────────────────────────────────────────┘
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 分析深度规则
|
|
41
|
+
|
|
42
|
+
| 变更类型 | 分析深度 | 原因 |
|
|
43
|
+
|----------|----------|------|
|
|
44
|
+
| 函数签名变更 | Level 3 (所有调用者) | 可能破坏调用方 |
|
|
45
|
+
| 返回值类型变更 | Level 3 (所有调用者) | 可能导致类型错误 |
|
|
46
|
+
| 内部逻辑变更 | Level 1 (直接依赖) | 影响范围有限 |
|
|
47
|
+
| 新增函数 | Level 0 (当前文件) | 无现有调用者 |
|
|
48
|
+
| 删除函数 | Level 3 (所有调用者) | 必须确认无残留调用 |
|
|
49
|
+
| 修改公共类型 | Level 2+ (递归追踪) | 影响范围广 |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 使用 MCP 工具分析调用链
|
|
54
|
+
|
|
55
|
+
### 使用 serena 工具
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
1. 查找符号定义:
|
|
59
|
+
mcp__serena__find_symbol(name_path="functionName", include_body=true)
|
|
60
|
+
|
|
61
|
+
2. 查找引用:
|
|
62
|
+
mcp__serena__find_referencing_symbols(name_path="functionName", relative_path="src/file.ts")
|
|
63
|
+
|
|
64
|
+
3. 获取文件概览:
|
|
65
|
+
mcp__serena__get_symbols_overview(relative_path="src/file.ts", depth=1)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 分析流程
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
Step 1: 识别变更的符号
|
|
72
|
+
↓
|
|
73
|
+
Step 2: 使用 find_referencing_symbols 查找调用者
|
|
74
|
+
↓
|
|
75
|
+
Step 3: 对每个调用者,递归查找其调用者
|
|
76
|
+
↓
|
|
77
|
+
Step 4: 直到达到入口点 (API/UI/Job) 或无更多调用者
|
|
78
|
+
↓
|
|
79
|
+
Step 5: 记录完整调用链到 Progress Tracker
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 调用链记录格式
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
## Call Chain Analysis
|
|
88
|
+
|
|
89
|
+
### Symbol: `validateUser()`
|
|
90
|
+
|
|
91
|
+
**Definition**: src/services/auth.ts:45
|
|
92
|
+
|
|
93
|
+
**Call Chain (Depth 3)**:
|
|
94
|
+
```
|
|
95
|
+
validateUser() [src/services/auth.ts:45]
|
|
96
|
+
├── login() [src/controllers/auth.ts:20]
|
|
97
|
+
│ ├── POST /api/login [src/routes/auth.ts:15]
|
|
98
|
+
│ └── LoginForm.onSubmit() [src/components/LoginForm.tsx:30]
|
|
99
|
+
├── register() [src/controllers/auth.ts:50]
|
|
100
|
+
│ └── POST /api/register [src/routes/auth.ts:25]
|
|
101
|
+
└── refreshToken() [src/services/auth.ts:80]
|
|
102
|
+
└── GET /api/refresh [src/routes/auth.ts:35]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Impact Analysis**:
|
|
106
|
+
- 入口点: 3 个 API 端点, 1 个 UI 组件
|
|
107
|
+
- 影响范围: 认证流程全部受影响
|
|
108
|
+
- 风险等级: HIGH
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 关键符号识别
|
|
114
|
+
|
|
115
|
+
### 高风险符号类型
|
|
116
|
+
|
|
117
|
+
| 类型 | 示例 | 分析深度 |
|
|
118
|
+
|------|------|----------|
|
|
119
|
+
| 认证/授权 | `validateToken`, `checkPermission` | Level 3 |
|
|
120
|
+
| 数据访问 | `findUser`, `saveOrder` | Level 2 |
|
|
121
|
+
| 业务逻辑 | `calculatePrice`, `processPayment` | Level 2 |
|
|
122
|
+
| 工具函数 | `formatDate`, `parseJSON` | Level 1 |
|
|
123
|
+
| 类型定义 | `User`, `Order` | Level 2 |
|
|
124
|
+
|
|
125
|
+
### 自动识别规则
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
如果符号名包含以下关键词,自动提升分析深度:
|
|
129
|
+
- auth, login, token, permission → Level 3
|
|
130
|
+
- save, update, delete, create → Level 2
|
|
131
|
+
- validate, check, verify → Level 2
|
|
132
|
+
- payment, order, transaction → Level 3
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 与 Checkpoint 集成
|
|
138
|
+
|
|
139
|
+
在 Checkpoint 中记录调用链分析:
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
### [CP-001] src/services/auth.ts
|
|
143
|
+
|
|
144
|
+
**Call Chain Analysis**:
|
|
145
|
+
| Symbol | Callers | Depth | Risk |
|
|
146
|
+
|--------|---------|-------|------|
|
|
147
|
+
| validateUser() | 4 | 3 | HIGH |
|
|
148
|
+
| hashPassword() | 2 | 2 | MEDIUM |
|
|
149
|
+
| generateToken() | 3 | 2 | HIGH |
|
|
150
|
+
|
|
151
|
+
**Cross-File Impact**:
|
|
152
|
+
- auth.ts 变更影响 5 个文件
|
|
153
|
+
- 需要检查: controllers/auth.ts, routes/auth.ts, components/LoginForm.tsx
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 终止条件
|
|
159
|
+
|
|
160
|
+
调用链追踪在以下情况停止:
|
|
161
|
+
|
|
162
|
+
1. **到达入口点**: API 路由、UI 事件处理、定时任务
|
|
163
|
+
2. **到达外部边界**: 第三方库、系统 API
|
|
164
|
+
3. **循环检测**: 发现循环依赖
|
|
165
|
+
4. **深度限制**: 超过 5 层(可配置)
|
|
166
|
+
5. **无更多调用者**: 符号未被任何代码引用
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
# Common Patterns & Anti-Patterns
|
|
2
|
+
|
|
3
|
+
Frequently identified issues and their solutions during code review.
|
|
4
|
+
|
|
5
|
+
## JavaScript/TypeScript
|
|
6
|
+
|
|
7
|
+
### Async/Await Issues
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// 🚫 Anti-Pattern: Sequential when parallel possible
|
|
11
|
+
const user = await getUser(id);
|
|
12
|
+
const posts = await getPosts(id);
|
|
13
|
+
const comments = await getComments(id);
|
|
14
|
+
|
|
15
|
+
// ✅ Pattern: Parallel execution
|
|
16
|
+
const [user, posts, comments] = await Promise.all([
|
|
17
|
+
getUser(id),
|
|
18
|
+
getPosts(id),
|
|
19
|
+
getComments(id)
|
|
20
|
+
]);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// 🚫 Anti-Pattern: Unhandled promise rejection
|
|
25
|
+
async function load() {
|
|
26
|
+
const data = await fetch(url); // Unhandled rejection
|
|
27
|
+
}
|
|
28
|
+
load();
|
|
29
|
+
|
|
30
|
+
// ✅ Pattern: Proper error handling
|
|
31
|
+
async function load() {
|
|
32
|
+
try {
|
|
33
|
+
const data = await fetch(url);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
handleError(error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// 🚫 Anti-Pattern: await in loop
|
|
42
|
+
for (const id of ids) {
|
|
43
|
+
const result = await fetch(id); // Sequential, slow
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ✅ Pattern: Promise.all for parallel
|
|
47
|
+
const results = await Promise.all(ids.map(id => fetch(id)));
|
|
48
|
+
|
|
49
|
+
// ✅ Pattern: For rate limiting, use p-limit
|
|
50
|
+
import pLimit from 'p-limit';
|
|
51
|
+
const limit = pLimit(5);
|
|
52
|
+
const results = await Promise.all(ids.map(id => limit(() => fetch(id))));
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Type Safety
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// 🚫 Anti-Pattern: Type assertion without validation
|
|
59
|
+
const user = data as User;
|
|
60
|
+
|
|
61
|
+
// ✅ Pattern: Runtime validation
|
|
62
|
+
import { z } from 'zod';
|
|
63
|
+
const UserSchema = z.object({
|
|
64
|
+
id: z.string(),
|
|
65
|
+
name: z.string(),
|
|
66
|
+
});
|
|
67
|
+
const user = UserSchema.parse(data);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// 🚫 Anti-Pattern: any type
|
|
72
|
+
function process(data: any) { }
|
|
73
|
+
|
|
74
|
+
// ✅ Pattern: Proper typing
|
|
75
|
+
function process<T extends BaseData>(data: T): ProcessedData<T> { }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Null Safety
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// 🚫 Anti-Pattern: Truthy check for 0 or ''
|
|
82
|
+
if (value) { } // Fails for 0, '', false
|
|
83
|
+
|
|
84
|
+
// ✅ Pattern: Explicit null check
|
|
85
|
+
if (value != null) { }
|
|
86
|
+
if (value !== undefined) { }
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// 🚫 Anti-Pattern: Optional chaining without fallback
|
|
91
|
+
const name = user?.profile?.name; // Could be undefined
|
|
92
|
+
|
|
93
|
+
// ✅ Pattern: Nullish coalescing
|
|
94
|
+
const name = user?.profile?.name ?? 'Anonymous';
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## React
|
|
98
|
+
|
|
99
|
+
### State Management
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
// 🚫 Anti-Pattern: Derived state in useState
|
|
103
|
+
const [fullName, setFullName] = useState(`${firstName} ${lastName}`);
|
|
104
|
+
|
|
105
|
+
// ✅ Pattern: Compute derived values
|
|
106
|
+
const fullName = useMemo(() => `${firstName} ${lastName}`, [firstName, lastName]);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// 🚫 Anti-Pattern: Stale closure
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
const interval = setInterval(() => {
|
|
113
|
+
setCount(count + 1); // Always uses initial count
|
|
114
|
+
}, 1000);
|
|
115
|
+
}, []);
|
|
116
|
+
|
|
117
|
+
// ✅ Pattern: Functional update
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
const interval = setInterval(() => {
|
|
120
|
+
setCount(c => c + 1); // Uses current value
|
|
121
|
+
}, 1000);
|
|
122
|
+
return () => clearInterval(interval);
|
|
123
|
+
}, []);
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Performance
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// 🚫 Anti-Pattern: Inline handlers creating new references
|
|
130
|
+
<Button onClick={() => handleClick(id)} />
|
|
131
|
+
|
|
132
|
+
// ✅ Pattern: Stable reference with useCallback
|
|
133
|
+
const handleButtonClick = useCallback(() => handleClick(id), [id]);
|
|
134
|
+
<Button onClick={handleButtonClick} />
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// 🚫 Anti-Pattern: Missing key or using index
|
|
139
|
+
{items.map((item, index) => <Item key={index} />)}
|
|
140
|
+
|
|
141
|
+
// ✅ Pattern: Stable unique key
|
|
142
|
+
{items.map(item => <Item key={item.id} />)}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Component Design
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// 🚫 Anti-Pattern: Prop drilling
|
|
149
|
+
<GrandParent>
|
|
150
|
+
<Parent data={data}>
|
|
151
|
+
<Child data={data}>
|
|
152
|
+
<GrandChild data={data} /> // Only one that uses it
|
|
153
|
+
</Child>
|
|
154
|
+
</Parent>
|
|
155
|
+
</GrandParent>
|
|
156
|
+
|
|
157
|
+
// ✅ Pattern: Context or composition
|
|
158
|
+
const DataContext = createContext();
|
|
159
|
+
<DataContext.Provider value={data}>
|
|
160
|
+
<GrandParent>
|
|
161
|
+
<Parent>
|
|
162
|
+
<Child>
|
|
163
|
+
<GrandChild /> // Uses useContext
|
|
164
|
+
</Child>
|
|
165
|
+
</Parent>
|
|
166
|
+
</GrandParent>
|
|
167
|
+
</DataContext.Provider>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Database/SQL
|
|
171
|
+
|
|
172
|
+
### Query Optimization
|
|
173
|
+
|
|
174
|
+
```sql
|
|
175
|
+
-- 🚫 Anti-Pattern: SELECT *
|
|
176
|
+
SELECT * FROM users WHERE id = 1;
|
|
177
|
+
|
|
178
|
+
-- ✅ Pattern: Select only needed columns
|
|
179
|
+
SELECT id, name, email FROM users WHERE id = 1;
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
```sql
|
|
183
|
+
-- 🚫 Anti-Pattern: No index on WHERE clause
|
|
184
|
+
SELECT * FROM orders WHERE created_at > '2024-01-01';
|
|
185
|
+
|
|
186
|
+
-- ✅ Pattern: Add appropriate index
|
|
187
|
+
CREATE INDEX idx_orders_created_at ON orders(created_at);
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```sql
|
|
191
|
+
-- 🚫 Anti-Pattern: OR on different columns
|
|
192
|
+
SELECT * FROM users WHERE email = 'x' OR phone = 'y';
|
|
193
|
+
|
|
194
|
+
-- ✅ Pattern: UNION for different indexes
|
|
195
|
+
SELECT * FROM users WHERE email = 'x'
|
|
196
|
+
UNION
|
|
197
|
+
SELECT * FROM users WHERE phone = 'y';
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Transaction Safety
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// 🚫 Anti-Pattern: No transaction for related operations
|
|
204
|
+
await db.users.update(userId, { balance: newBalance });
|
|
205
|
+
await db.transactions.create({ userId, amount }); // What if this fails?
|
|
206
|
+
|
|
207
|
+
// ✅ Pattern: Use transaction
|
|
208
|
+
await db.transaction(async (tx) => {
|
|
209
|
+
await tx.users.update(userId, { balance: newBalance });
|
|
210
|
+
await tx.transactions.create({ userId, amount });
|
|
211
|
+
});
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## API Design
|
|
215
|
+
|
|
216
|
+
### Error Handling
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// 🚫 Anti-Pattern: Generic error response
|
|
220
|
+
res.status(500).json({ error: 'Something went wrong' });
|
|
221
|
+
|
|
222
|
+
// ✅ Pattern: Structured error response
|
|
223
|
+
res.status(400).json({
|
|
224
|
+
code: 'VALIDATION_ERROR',
|
|
225
|
+
message: 'Invalid input',
|
|
226
|
+
details: [
|
|
227
|
+
{ field: 'email', error: 'Invalid email format' }
|
|
228
|
+
]
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Input Validation
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// 🚫 Anti-Pattern: No validation
|
|
236
|
+
app.post('/users', (req, res) => {
|
|
237
|
+
db.users.create(req.body); // Trust user input
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// ✅ Pattern: Validate and sanitize
|
|
241
|
+
app.post('/users', async (req, res) => {
|
|
242
|
+
const validated = UserCreateSchema.parse(req.body);
|
|
243
|
+
const sanitized = sanitize(validated);
|
|
244
|
+
await db.users.create(sanitized);
|
|
245
|
+
});
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Testing
|
|
249
|
+
|
|
250
|
+
### Test Quality
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
// 🚫 Anti-Pattern: Testing implementation details
|
|
254
|
+
expect(component.state.isLoading).toBe(true);
|
|
255
|
+
|
|
256
|
+
// ✅ Pattern: Test behavior/output
|
|
257
|
+
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// 🚫 Anti-Pattern: Brittle snapshot
|
|
262
|
+
expect(component).toMatchSnapshot(); // Breaks on any change
|
|
263
|
+
|
|
264
|
+
// ✅ Pattern: Specific assertions
|
|
265
|
+
expect(screen.getByText('Welcome')).toBeInTheDocument();
|
|
266
|
+
expect(screen.getByRole('button', { name: 'Submit' })).toBeEnabled();
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Mock Patterns
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// 🚫 Anti-Pattern: Over-mocking
|
|
273
|
+
jest.mock('./database');
|
|
274
|
+
jest.mock('./cache');
|
|
275
|
+
jest.mock('./logger');
|
|
276
|
+
jest.mock('./utils');
|
|
277
|
+
// Test is now meaningless
|
|
278
|
+
|
|
279
|
+
// ✅ Pattern: Minimal mocking
|
|
280
|
+
jest.mock('./externalApi'); // Only mock external dependencies
|
|
281
|
+
// Let internal modules work naturally
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Security Patterns
|
|
285
|
+
|
|
286
|
+
### Authentication
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
// 🚫 Anti-Pattern: Password in URL
|
|
290
|
+
GET /login?password=secret
|
|
291
|
+
|
|
292
|
+
// ✅ Pattern: POST with body
|
|
293
|
+
POST /login
|
|
294
|
+
{ "password": "secret" } // Over HTTPS
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
// 🚫 Anti-Pattern: Predictable session ID
|
|
299
|
+
const sessionId = `user-${userId}`;
|
|
300
|
+
|
|
301
|
+
// ✅ Pattern: Cryptographic randomness
|
|
302
|
+
const sessionId = crypto.randomBytes(32).toString('hex');
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Data Exposure
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
// 🚫 Anti-Pattern: Return entire user object
|
|
309
|
+
res.json(user); // Includes passwordHash
|
|
310
|
+
|
|
311
|
+
// ✅ Pattern: Explicit field selection
|
|
312
|
+
res.json({
|
|
313
|
+
id: user.id,
|
|
314
|
+
name: user.name,
|
|
315
|
+
email: user.email
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
// Or use a DTO
|
|
319
|
+
res.json(UserDTO.fromEntity(user));
|
|
320
|
+
```
|
|
321
|
+
|