@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,535 @@
|
|
|
1
|
+
# 逻辑完整性检查清单 (Logic Completeness Checklist)
|
|
2
|
+
|
|
3
|
+
> **核心原则**: 每个功能必须形成完整闭环,不能有逻辑断点或死路。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🔴 什么是逻辑闭环
|
|
8
|
+
|
|
9
|
+
### 定义
|
|
10
|
+
|
|
11
|
+
逻辑闭环指:**从用户发起操作到获得最终反馈的完整路径,每个分支都有明确的处理和响应。**
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
用户操作 → 输入验证 → 业务处理 → 结果反馈
|
|
15
|
+
↓ ↓ ↓ ↓
|
|
16
|
+
有响应 有错误提示 有异常处理 有成功/失败提示
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 逻辑不闭环的典型表现
|
|
20
|
+
|
|
21
|
+
| 问题 | 表现 | 用户体验 |
|
|
22
|
+
|------|------|----------|
|
|
23
|
+
| 无响应 | 点击按钮没反应 | 不知道发生了什么 |
|
|
24
|
+
| 无错误提示 | 操作失败但没提示 | 以为成功了 |
|
|
25
|
+
| 无加载状态 | 等待时页面空白 | 以为卡死了 |
|
|
26
|
+
| 无边界处理 | 空数据时报错 | 看到错误页面 |
|
|
27
|
+
| 无异常恢复 | 出错后无法继续 | 只能刷新页面 |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 📋 Phase 1: 条件分支完整性检查
|
|
32
|
+
|
|
33
|
+
### 1.1 if-else 完整性
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// ❌ 不完整:缺少 else 分支
|
|
37
|
+
function getStatus(code: number): string {
|
|
38
|
+
if (code === 200) {
|
|
39
|
+
return 'success';
|
|
40
|
+
}
|
|
41
|
+
if (code === 404) {
|
|
42
|
+
return 'not found';
|
|
43
|
+
}
|
|
44
|
+
// code 是其他值时返回 undefined!
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ✅ 完整:所有情况都处理
|
|
48
|
+
function getStatus(code: number): string {
|
|
49
|
+
if (code === 200) {
|
|
50
|
+
return 'success';
|
|
51
|
+
}
|
|
52
|
+
if (code === 404) {
|
|
53
|
+
return 'not found';
|
|
54
|
+
}
|
|
55
|
+
return 'unknown'; // 默认情况
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ✅ 更好:使用 switch + default
|
|
59
|
+
function getStatus(code: number): string {
|
|
60
|
+
switch (code) {
|
|
61
|
+
case 200: return 'success';
|
|
62
|
+
case 404: return 'not found';
|
|
63
|
+
case 500: return 'server error';
|
|
64
|
+
default: return 'unknown';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**检查清单**:
|
|
70
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
71
|
+
|---|--------|----------|------|
|
|
72
|
+
| 1.1.1 | 每个 if 是否有对应处理 | 所有分支都有返回值或副作用 | ⬜ |
|
|
73
|
+
| 1.1.2 | 是否有 else/default | 处理了所有可能情况 | ⬜ |
|
|
74
|
+
| 1.1.3 | 条件是否互斥完备 | 不会遗漏任何情况 | ⬜ |
|
|
75
|
+
|
|
76
|
+
### 1.2 switch-case 完整性
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// ❌ 不完整:缺少 default
|
|
80
|
+
function handleAction(action: string) {
|
|
81
|
+
switch (action) {
|
|
82
|
+
case 'create':
|
|
83
|
+
return createItem();
|
|
84
|
+
case 'update':
|
|
85
|
+
return updateItem();
|
|
86
|
+
// 其他 action 会静默失败!
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ✅ 完整:有 default 处理
|
|
91
|
+
function handleAction(action: string) {
|
|
92
|
+
switch (action) {
|
|
93
|
+
case 'create':
|
|
94
|
+
return createItem();
|
|
95
|
+
case 'update':
|
|
96
|
+
return updateItem();
|
|
97
|
+
case 'delete':
|
|
98
|
+
return deleteItem();
|
|
99
|
+
default:
|
|
100
|
+
throw new Error(`Unknown action: ${action}`);
|
|
101
|
+
// 或 return { error: 'Unknown action' };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**检查清单**:
|
|
107
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
108
|
+
|---|--------|----------|------|
|
|
109
|
+
| 1.2.1 | switch 是否有 default | 必须有 default 分支 | ⬜ |
|
|
110
|
+
| 1.2.2 | default 是否有意义 | 不是空的或只有 break | ⬜ |
|
|
111
|
+
| 1.2.3 | 是否处理了所有枚举值 | 枚举类型全覆盖 | ⬜ |
|
|
112
|
+
|
|
113
|
+
### 1.3 三元运算符完整性
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// ❌ 不完整:嵌套三元难以理解
|
|
117
|
+
const result = a ? b ? c : d : e ? f : g; // 什么鬼?
|
|
118
|
+
|
|
119
|
+
// ✅ 完整:简单的三元
|
|
120
|
+
const status = isLoading ? 'loading' : 'ready';
|
|
121
|
+
|
|
122
|
+
// ✅ 复杂情况用 if-else 或 switch
|
|
123
|
+
function getStatus(state: State): string {
|
|
124
|
+
if (state.isLoading) return 'loading';
|
|
125
|
+
if (state.isError) return 'error';
|
|
126
|
+
if (state.isEmpty) return 'empty';
|
|
127
|
+
return 'ready';
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 📋 Phase 2: 异常处理完整性检查
|
|
134
|
+
|
|
135
|
+
### 2.1 try-catch 完整性
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// ❌ 不完整:catch 后没有处理
|
|
139
|
+
async function fetchData() {
|
|
140
|
+
try {
|
|
141
|
+
const data = await api.getData();
|
|
142
|
+
return data;
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.log(error); // 只打印,没有处理!
|
|
145
|
+
// 返回 undefined,调用方不知道失败了
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ✅ 完整:catch 有明确处理
|
|
150
|
+
async function fetchData() {
|
|
151
|
+
try {
|
|
152
|
+
const data = await api.getData();
|
|
153
|
+
return { success: true, data };
|
|
154
|
+
} catch (error) {
|
|
155
|
+
logger.error('Failed to fetch data', error);
|
|
156
|
+
return { success: false, error: error.message };
|
|
157
|
+
// 或 throw new CustomError('Failed to fetch data', error);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**检查清单**:
|
|
163
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
164
|
+
|---|--------|----------|------|
|
|
165
|
+
| 2.1.1 | catch 是否有实际处理 | 不只是 console.log | ⬜ |
|
|
166
|
+
| 2.1.2 | 错误是否向上传递 | 调用方能知道失败 | ⬜ |
|
|
167
|
+
| 2.1.3 | 是否有 finally 清理 | 资源正确释放 | ⬜ |
|
|
168
|
+
|
|
169
|
+
### 2.2 Promise 错误处理
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// ❌ 不完整:Promise 错误未处理
|
|
173
|
+
function loadData() {
|
|
174
|
+
api.getData().then(data => {
|
|
175
|
+
setData(data);
|
|
176
|
+
});
|
|
177
|
+
// 如果失败,错误被吞掉!
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ✅ 完整:有 catch 处理
|
|
181
|
+
function loadData() {
|
|
182
|
+
api.getData()
|
|
183
|
+
.then(data => {
|
|
184
|
+
setData(data);
|
|
185
|
+
})
|
|
186
|
+
.catch(error => {
|
|
187
|
+
setError(error.message);
|
|
188
|
+
toast.error('加载失败');
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ✅ 使用 async/await
|
|
193
|
+
async function loadData() {
|
|
194
|
+
try {
|
|
195
|
+
const data = await api.getData();
|
|
196
|
+
setData(data);
|
|
197
|
+
} catch (error) {
|
|
198
|
+
setError(error.message);
|
|
199
|
+
toast.error('加载失败');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**检查清单**:
|
|
205
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
206
|
+
|---|--------|----------|------|
|
|
207
|
+
| 2.2.1 | Promise 是否有 .catch() | 所有 Promise 都处理错误 | ⬜ |
|
|
208
|
+
| 2.2.2 | async 函数是否有 try-catch | 异步错误被捕获 | ⬜ |
|
|
209
|
+
| 2.2.3 | 错误是否有用户提示 | 用户知道发生了什么 | ⬜ |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 📋 Phase 3: 状态流转完整性检查
|
|
214
|
+
|
|
215
|
+
### 3.1 状态机完整性
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// ❌ 不完整:状态转换不完整
|
|
219
|
+
type OrderStatus = 'pending' | 'paid' | 'shipped' | 'delivered' | 'cancelled';
|
|
220
|
+
|
|
221
|
+
function updateStatus(current: OrderStatus, action: string): OrderStatus {
|
|
222
|
+
if (action === 'pay' && current === 'pending') {
|
|
223
|
+
return 'paid';
|
|
224
|
+
}
|
|
225
|
+
if (action === 'ship' && current === 'paid') {
|
|
226
|
+
return 'shipped';
|
|
227
|
+
}
|
|
228
|
+
// 其他情况返回 undefined!
|
|
229
|
+
// cancelled 状态无法处理!
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ✅ 完整:所有状态转换都定义
|
|
233
|
+
const transitions: Record<OrderStatus, Record<string, OrderStatus>> = {
|
|
234
|
+
pending: { pay: 'paid', cancel: 'cancelled' },
|
|
235
|
+
paid: { ship: 'shipped', refund: 'cancelled' },
|
|
236
|
+
shipped: { deliver: 'delivered', return: 'cancelled' },
|
|
237
|
+
delivered: { return: 'cancelled' },
|
|
238
|
+
cancelled: {}, // 终态,无法转换
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
function updateStatus(current: OrderStatus, action: string): OrderStatus {
|
|
242
|
+
const nextStatus = transitions[current]?.[action];
|
|
243
|
+
if (!nextStatus) {
|
|
244
|
+
throw new Error(`Invalid transition: ${current} -> ${action}`);
|
|
245
|
+
}
|
|
246
|
+
return nextStatus;
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**检查清单**:
|
|
251
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
252
|
+
|---|--------|----------|------|
|
|
253
|
+
| 3.1.1 | 是否定义了所有状态 | 状态枚举完整 | ⬜ |
|
|
254
|
+
| 3.1.2 | 是否定义了所有转换 | 每个状态的出边完整 | ⬜ |
|
|
255
|
+
| 3.1.3 | 是否有非法转换处理 | 非法转换有错误提示 | ⬜ |
|
|
256
|
+
| 3.1.4 | 是否有终态 | 流程能正常结束 | ⬜ |
|
|
257
|
+
|
|
258
|
+
### 3.2 UI 状态完整性
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// ❌ 不完整:缺少状态
|
|
262
|
+
function UserList() {
|
|
263
|
+
const [users, setUsers] = useState([]);
|
|
264
|
+
|
|
265
|
+
useEffect(() => {
|
|
266
|
+
api.getUsers().then(setUsers);
|
|
267
|
+
}, []);
|
|
268
|
+
|
|
269
|
+
return (
|
|
270
|
+
<ul>
|
|
271
|
+
{users.map(user => <li key={user.id}>{user.name}</li>)}
|
|
272
|
+
</ul>
|
|
273
|
+
);
|
|
274
|
+
// 加载中显示空白!
|
|
275
|
+
// 加载失败显示空白!
|
|
276
|
+
// 空数据显示空白!
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// ✅ 完整:所有状态都处理
|
|
280
|
+
function UserList() {
|
|
281
|
+
const [users, setUsers] = useState<User[]>([]);
|
|
282
|
+
const [loading, setLoading] = useState(true);
|
|
283
|
+
const [error, setError] = useState<string | null>(null);
|
|
284
|
+
|
|
285
|
+
useEffect(() => {
|
|
286
|
+
setLoading(true);
|
|
287
|
+
setError(null);
|
|
288
|
+
api.getUsers()
|
|
289
|
+
.then(setUsers)
|
|
290
|
+
.catch(e => setError(e.message))
|
|
291
|
+
.finally(() => setLoading(false));
|
|
292
|
+
}, []);
|
|
293
|
+
|
|
294
|
+
if (loading) return <Spinner />;
|
|
295
|
+
if (error) return <ErrorMessage message={error} onRetry={refetch} />;
|
|
296
|
+
if (users.length === 0) return <EmptyState message="暂无用户" />;
|
|
297
|
+
|
|
298
|
+
return (
|
|
299
|
+
<ul>
|
|
300
|
+
{users.map(user => <li key={user.id}>{user.name}</li>)}
|
|
301
|
+
</ul>
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**检查清单**:
|
|
307
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
308
|
+
|---|--------|----------|------|
|
|
309
|
+
| 3.2.1 | 是否有 loading 状态 | 加载时有提示 | ⬜ |
|
|
310
|
+
| 3.2.2 | 是否有 error 状态 | 错误时有提示 | ⬜ |
|
|
311
|
+
| 3.2.3 | 是否有 empty 状态 | 空数据时有提示 | ⬜ |
|
|
312
|
+
| 3.2.4 | 是否有 success 状态 | 成功时有反馈 | ⬜ |
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 📋 Phase 4: 数据流完整性检查
|
|
317
|
+
|
|
318
|
+
### 4.1 输入验证完整性
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
// ❌ 不完整:没有验证
|
|
322
|
+
function createUser(data: any) {
|
|
323
|
+
return db.insert('users', data); // 任何数据都能插入!
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ✅ 完整:全面验证
|
|
327
|
+
function createUser(data: CreateUserInput) {
|
|
328
|
+
// 必填验证
|
|
329
|
+
if (!data.email) throw new ValidationError('Email is required');
|
|
330
|
+
if (!data.password) throw new ValidationError('Password is required');
|
|
331
|
+
|
|
332
|
+
// 格式验证
|
|
333
|
+
if (!isValidEmail(data.email)) throw new ValidationError('Invalid email format');
|
|
334
|
+
if (data.password.length < 8) throw new ValidationError('Password too short');
|
|
335
|
+
|
|
336
|
+
// 业务验证
|
|
337
|
+
const existing = await db.findByEmail(data.email);
|
|
338
|
+
if (existing) throw new ValidationError('Email already exists');
|
|
339
|
+
|
|
340
|
+
// 数据清理
|
|
341
|
+
const cleanData = {
|
|
342
|
+
email: data.email.toLowerCase().trim(),
|
|
343
|
+
password: hashPassword(data.password),
|
|
344
|
+
name: sanitize(data.name),
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
return db.insert('users', cleanData);
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**检查清单**:
|
|
352
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
353
|
+
|---|--------|----------|------|
|
|
354
|
+
| 4.1.1 | 必填字段是否验证 | 所有必填都检查 | ⬜ |
|
|
355
|
+
| 4.1.2 | 格式是否验证 | 邮箱/手机等格式正确 | ⬜ |
|
|
356
|
+
| 4.1.3 | 边界是否验证 | 长度/范围限制 | ⬜ |
|
|
357
|
+
| 4.1.4 | 业务规则是否验证 | 唯一性等业务约束 | ⬜ |
|
|
358
|
+
|
|
359
|
+
### 4.2 空值处理完整性
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
// ❌ 不完整:没有空值处理
|
|
363
|
+
function getUserName(user: User | null): string {
|
|
364
|
+
return user.name; // user 为 null 时报错!
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// ✅ 完整:处理空值
|
|
368
|
+
function getUserName(user: User | null): string {
|
|
369
|
+
if (!user) return 'Unknown';
|
|
370
|
+
return user.name || 'Anonymous';
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// ✅ 使用可选链
|
|
374
|
+
function getUserName(user: User | null): string {
|
|
375
|
+
return user?.name ?? 'Unknown';
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
**检查清单**:
|
|
380
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
381
|
+
|---|--------|----------|------|
|
|
382
|
+
| 4.2.1 | null 是否处理 | 不会因 null 报错 | ⬜ |
|
|
383
|
+
| 4.2.2 | undefined 是否处理 | 不会因 undefined 报错 | ⬜ |
|
|
384
|
+
| 4.2.3 | 空字符串是否处理 | 空字符串有默认值 | ⬜ |
|
|
385
|
+
| 4.2.4 | 空数组是否处理 | 空数组不会报错 | ⬜ |
|
|
386
|
+
|
|
387
|
+
### 4.3 边界值处理完整性
|
|
388
|
+
|
|
389
|
+
```typescript
|
|
390
|
+
// ❌ 不完整:没有边界处理
|
|
391
|
+
function getPage(items: Item[], page: number, pageSize: number): Item[] {
|
|
392
|
+
const start = page * pageSize;
|
|
393
|
+
return items.slice(start, start + pageSize);
|
|
394
|
+
// page 为负数时?
|
|
395
|
+
// page 超出范围时?
|
|
396
|
+
// pageSize 为 0 时?
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// ✅ 完整:处理边界
|
|
400
|
+
function getPage(items: Item[], page: number, pageSize: number): Item[] {
|
|
401
|
+
// 参数验证
|
|
402
|
+
if (page < 0) page = 0;
|
|
403
|
+
if (pageSize <= 0) pageSize = 10;
|
|
404
|
+
if (pageSize > 100) pageSize = 100; // 最大限制
|
|
405
|
+
|
|
406
|
+
const totalPages = Math.ceil(items.length / pageSize);
|
|
407
|
+
if (page >= totalPages) page = Math.max(0, totalPages - 1);
|
|
408
|
+
|
|
409
|
+
const start = page * pageSize;
|
|
410
|
+
return items.slice(start, start + pageSize);
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**检查清单**:
|
|
415
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
416
|
+
|---|--------|----------|------|
|
|
417
|
+
| 4.3.1 | 负数是否处理 | 负数有合理处理 | ⬜ |
|
|
418
|
+
| 4.3.2 | 零是否处理 | 零值有合理处理 | ⬜ |
|
|
419
|
+
| 4.3.3 | 最大值是否处理 | 超大值有限制 | ⬜ |
|
|
420
|
+
| 4.3.4 | 越界是否处理 | 数组越界不报错 | ⬜ |
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## 📋 Phase 5: 用户反馈完整性检查
|
|
425
|
+
|
|
426
|
+
### 5.1 操作反馈完整性
|
|
427
|
+
|
|
428
|
+
```typescript
|
|
429
|
+
// ❌ 不完整:没有反馈
|
|
430
|
+
async function deleteItem(id: string) {
|
|
431
|
+
await api.delete(id);
|
|
432
|
+
// 用户不知道删除成功了没有
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// ✅ 完整:有明确反馈
|
|
436
|
+
async function deleteItem(id: string) {
|
|
437
|
+
try {
|
|
438
|
+
setDeleting(true);
|
|
439
|
+
await api.delete(id);
|
|
440
|
+
toast.success('删除成功');
|
|
441
|
+
refreshList();
|
|
442
|
+
} catch (error) {
|
|
443
|
+
toast.error(`删除失败: ${error.message}`);
|
|
444
|
+
} finally {
|
|
445
|
+
setDeleting(false);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**检查清单**:
|
|
451
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
452
|
+
|---|--------|----------|------|
|
|
453
|
+
| 5.1.1 | 操作中是否有提示 | loading/进度条 | ⬜ |
|
|
454
|
+
| 5.1.2 | 成功是否有提示 | toast/消息/跳转 | ⬜ |
|
|
455
|
+
| 5.1.3 | 失败是否有提示 | 错误信息清晰 | ⬜ |
|
|
456
|
+
| 5.1.4 | 是否可以重试 | 失败后能重试 | ⬜ |
|
|
457
|
+
|
|
458
|
+
### 5.2 确认操作完整性
|
|
459
|
+
|
|
460
|
+
```typescript
|
|
461
|
+
// ❌ 不完整:危险操作没有确认
|
|
462
|
+
<button onClick={() => deleteAccount()}>删除账户</button>
|
|
463
|
+
|
|
464
|
+
// ✅ 完整:有确认步骤
|
|
465
|
+
<button onClick={() => setShowConfirm(true)}>删除账户</button>
|
|
466
|
+
|
|
467
|
+
{showConfirm && (
|
|
468
|
+
<ConfirmDialog
|
|
469
|
+
title="确认删除账户?"
|
|
470
|
+
message="此操作不可恢复,所有数据将被永久删除。"
|
|
471
|
+
confirmText="确认删除"
|
|
472
|
+
cancelText="取消"
|
|
473
|
+
onConfirm={deleteAccount}
|
|
474
|
+
onCancel={() => setShowConfirm(false)}
|
|
475
|
+
/>
|
|
476
|
+
)}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
**检查清单**:
|
|
480
|
+
| # | 检查项 | 通过标准 | 结果 |
|
|
481
|
+
|---|--------|----------|------|
|
|
482
|
+
| 5.2.1 | 删除操作是否有确认 | 有二次确认 | ⬜ |
|
|
483
|
+
| 5.2.2 | 不可逆操作是否有警告 | 明确告知后果 | ⬜ |
|
|
484
|
+
| 5.2.3 | 批量操作是否有确认 | 显示影响范围 | ⬜ |
|
|
485
|
+
|
|
486
|
+
---
|
|
487
|
+
|
|
488
|
+
## 📊 逻辑完整性检查汇总
|
|
489
|
+
|
|
490
|
+
```markdown
|
|
491
|
+
## 逻辑完整性审查结果
|
|
492
|
+
|
|
493
|
+
### 条件分支检查
|
|
494
|
+
| 检查项 | 数量 | 通过 | 问题 |
|
|
495
|
+
|--------|------|------|------|
|
|
496
|
+
| if-else 完整性 | | | |
|
|
497
|
+
| switch-default | | | |
|
|
498
|
+
| 三元运算符 | | | |
|
|
499
|
+
|
|
500
|
+
### 异常处理检查
|
|
501
|
+
| 检查项 | 数量 | 通过 | 问题 |
|
|
502
|
+
|--------|------|------|------|
|
|
503
|
+
| try-catch 完整性 | | | |
|
|
504
|
+
| Promise 错误处理 | | | |
|
|
505
|
+
| 错误用户提示 | | | |
|
|
506
|
+
|
|
507
|
+
### 状态流转检查
|
|
508
|
+
| 检查项 | 数量 | 通过 | 问题 |
|
|
509
|
+
|--------|------|------|------|
|
|
510
|
+
| 状态机完整性 | | | |
|
|
511
|
+
| UI 状态完整性 | | | |
|
|
512
|
+
|
|
513
|
+
### 数据流检查
|
|
514
|
+
| 检查项 | 数量 | 通过 | 问题 |
|
|
515
|
+
|--------|------|------|------|
|
|
516
|
+
| 输入验证 | | | |
|
|
517
|
+
| 空值处理 | | | |
|
|
518
|
+
| 边界值处理 | | | |
|
|
519
|
+
|
|
520
|
+
### 用户反馈检查
|
|
521
|
+
| 检查项 | 数量 | 通过 | 问题 |
|
|
522
|
+
|--------|------|------|------|
|
|
523
|
+
| 操作反馈 | | | |
|
|
524
|
+
| 确认操作 | | | |
|
|
525
|
+
|
|
526
|
+
### 问题列表
|
|
527
|
+
| # | 文件:行号 | 问题类型 | 描述 | 严重级别 |
|
|
528
|
+
|---|-----------|----------|------|----------|
|
|
529
|
+
| 1 | | | | |
|
|
530
|
+
| 2 | | | | |
|
|
531
|
+
|
|
532
|
+
### 判定
|
|
533
|
+
- [ ] **通过** - 逻辑完整闭环
|
|
534
|
+
- [ ] **不通过** - 存在逻辑断点,需修复
|
|
535
|
+
```
|