sumulige-claude 1.5.1 → 1.5.2
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/hooks/hook-registry.json +0 -15
- package/.claude/rules/coding-style.md +18 -7
- package/.claude/rules/hooks.md +15 -4
- package/.claude/rules/performance.md +15 -5
- package/.claude/rules/security.md +140 -4
- package/.claude/rules/testing.md +138 -9
- package/.claude/rules/web-design-standard.md +16 -5
- package/.claude/skills/algorithmic-art/metadata.yaml +28 -0
- package/.claude/skills/api-tester/SKILL.md +61 -0
- package/.claude/skills/api-tester/examples/basic.md +3 -0
- package/.claude/skills/api-tester/metadata.yaml +30 -0
- package/.claude/skills/api-tester/templates/default.md +3 -0
- package/.claude/skills/brand-guidelines/metadata.yaml +26 -0
- package/.claude/skills/canvas-design/metadata.yaml +27 -0
- package/.claude/skills/code-reviewer-123/SKILL.md +61 -0
- package/.claude/skills/code-reviewer-123/examples/basic.md +3 -0
- package/.claude/skills/code-reviewer-123/metadata.yaml +30 -0
- package/.claude/skills/code-reviewer-123/templates/default.md +3 -0
- package/.claude/skills/doc-coauthoring/metadata.yaml +27 -0
- package/.claude/skills/docx/metadata.yaml +30 -0
- package/.claude/skills/frontend-design/metadata.yaml +28 -0
- package/.claude/skills/internal-comms/metadata.yaml +28 -0
- package/.claude/skills/mcp-builder/metadata.yaml +26 -0
- package/.claude/skills/my-skill/SKILL.md +61 -0
- package/.claude/skills/my-skill/examples/basic.md +3 -0
- package/.claude/skills/my-skill/metadata.yaml +30 -0
- package/.claude/skills/my-skill/templates/default.md +3 -0
- package/.claude/skills/pdf/metadata.yaml +29 -0
- package/.claude/skills/pptx/metadata.yaml +29 -0
- package/.claude/skills/react-best-practices/metadata.yaml +26 -0
- package/.claude/skills/react-node-practices/SKILL.md +409 -0
- package/.claude/skills/react-node-practices/metadata.yaml +56 -0
- package/.claude/skills/skill-creator/metadata.yaml +25 -0
- package/.claude/skills/slack-gif-creator/metadata.yaml +28 -0
- package/.claude/skills/test-skill-name/SKILL.md +61 -0
- package/.claude/skills/test-skill-name/examples/basic.md +3 -0
- package/.claude/skills/test-skill-name/metadata.yaml +30 -0
- package/.claude/skills/test-skill-name/templates/default.md +3 -0
- package/.claude/skills/test-workflow/metadata.yaml +32 -0
- package/.claude/skills/theme-factory/metadata.yaml +26 -0
- package/.claude/skills/threejs-fundamentals/metadata.yaml +27 -0
- package/.claude/skills/web-artifacts-builder/metadata.yaml +30 -0
- package/.claude/skills/web-design-guidelines/metadata.yaml +26 -0
- package/.claude/skills/webapp-testing/metadata.yaml +26 -0
- package/.claude/skills/xlsx/metadata.yaml +29 -0
- package/LICENSE +21 -0
- package/cli.js +1 -1
- package/package.json +25 -3
- package/.claude/.kickoff-hint.txt +0 -52
- package/.claude/.sumulige-claude-version +0 -1
- package/.claude/.version +0 -1
- package/.claude/AGENTS.md +0 -42
- package/.claude/ANCHORS.md +0 -40
- package/.claude/CLAUDE.md +0 -138
- package/.claude/MEMORY.md +0 -69
- package/.claude/PROJECT_LOG.md +0 -101
- package/.claude/THINKING_CHAIN_GUIDE.md +0 -287
- package/.claude/USAGE.md +0 -175
- package/.claude/boris-optimizations.md +0 -167
- package/.claude/handoffs/INDEX.md +0 -21
- package/.claude/handoffs/LATEST.md +0 -76
- package/.claude/handoffs/handoff_2026-01-22T13-07-04-757Z.md +0 -76
- package/.claude/quality-gate.json +0 -82
- package/.claude/rag/skill-index.json +0 -135
- package/.claude/settings.json +0 -99
- package/.claude/settings.local.json +0 -175
- package/.claude/templates/PROJECT_KICKOFF.md +0 -89
- package/.claude/templates/PROJECT_PROPOSAL.md +0 -227
- package/.claude/templates/TASK_PLAN.md +0 -121
- package/.claude/templates/hooks/README.md +0 -302
- package/.claude/templates/hooks/hook.sh.template +0 -94
- package/.claude/templates/hooks/user-prompt-submit.cjs.template +0 -116
- package/.claude/templates/hooks/user-response-submit.cjs.template +0 -94
- package/.claude/templates/hooks/validate.js +0 -173
- package/.claude/templates/tasks/develop.md +0 -69
- package/.claude/templates/tasks/research.md +0 -64
- package/.claude/templates/tasks/test.md +0 -96
- package/.claude/thinking-routes/.last-sync +0 -1
- package/.claude/thinking-routes/QUICKREF.md +0 -98
- package/.claude/workflow/document-scanner.js +0 -426
- package/.claude/workflow/knowledge-engine.js +0 -941
- package/.claude/workflow/notebooklm/browser.js +0 -1028
- package/.claude/workflow/phases/phase1-research.js +0 -578
- package/.claude/workflow/phases/phase1-research.ts +0 -465
- package/.claude/workflow/phases/phase2-approve.js +0 -722
- package/.claude/workflow/phases/phase3-plan.js +0 -1200
- package/.claude/workflow/phases/phase4-develop.js +0 -894
- package/.claude/workflow/search-cache.js +0 -230
- package/.claude/workflow/templates/approval.md +0 -315
- package/.claude/workflow/templates/development.md +0 -377
- package/.claude/workflow/templates/planning.md +0 -328
- package/.claude/workflow/templates/research.md +0 -250
- package/.claude/workflow/types.js +0 -37
- package/.claude/workflow/web-search.js +0 -278
- package/.claude-plugin/marketplace.json +0 -71
- package/.github/workflows/sync-skills.yml +0 -74
- package/.versionrc +0 -25
- package/AGENTS.md +0 -580
- package/CHANGELOG.md +0 -481
- package/CLAUDE-template.md +0 -114
- package/DEV_TOOLS_GUIDE.md +0 -190
- package/PROJECT_STRUCTURE.md +0 -266
- package/Q&A.md +0 -325
- package/config/defaults.json +0 -34
- package/config/official-skills.json +0 -183
- package/config/quality-gate.json +0 -67
- package/config/skill-categories.json +0 -40
- package/config/version-manifest.json +0 -85
- package/demos/power-3d-scatter.html +0 -683
- package/development/cache/web-search/search_1193d605f8eb364651fc2f2041b58a31.json +0 -36
- package/development/cache/web-search/search_3798bf06960edc125f744a1abb5b72c5.json +0 -36
- package/development/cache/web-search/search_37c7d4843a53f0d83f1122a6f908a2a3.json +0 -36
- package/development/cache/web-search/search_44166fa0153709ee168485a22aa0ab40.json +0 -36
- package/development/cache/web-search/search_4deaebb1f77e86a8ca066dc5a49c59fd.json +0 -36
- package/development/cache/web-search/search_94da91789466070a7f545612e73c7372.json +0 -36
- package/development/cache/web-search/search_dd5de8491b8b803a3cb01339cd210fb0.json +0 -36
- package/development/knowledge-base/.index.clean.json +0 -1
- package/development/knowledge-base/.index.json +0 -486
- package/development/knowledge-base/test-best-practices.md +0 -29
- package/development/projects/proj_mkh1pazz_ixmt1/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4jvnb_z7rwf/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4jxkd_ewz5a/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4k84n_ni73k/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4wfyd_u9w88/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4wsbo_iahvf/development/projects/proj_mkh4xbpg_4na5w/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4wsbo_iahvf/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4xulg_1ka8x/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4xwhj_gch8j/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4y2qk_9lm8z/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh4y2qk_9lm8z/phase2/requirements.md +0 -226
- package/development/projects/proj_mkh4y2qk_9lm8z/phase3/PRD.md +0 -345
- package/development/projects/proj_mkh4y2qk_9lm8z/phase3/TASK_PLAN.md +0 -284
- package/development/projects/proj_mkh4y2qk_9lm8z/phase3/prototype/README.md +0 -14
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/DEVELOPMENT_LOG.md +0 -35
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/TASKS.md +0 -34
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/.env.example +0 -5
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/README.md +0 -60
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/package.json +0 -25
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/src/index.js +0 -70
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/src/routes/index.js +0 -48
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/tests/health.test.js +0 -20
- package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/tests/jest.config.js +0 -21
- package/development/projects/proj_mkh7veqg_3lypc/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh7veqg_3lypc/phase2/requirements.md +0 -226
- package/development/projects/proj_mkh7veqg_3lypc/phase3/PRD.md +0 -345
- package/development/projects/proj_mkh7veqg_3lypc/phase3/TASK_PLAN.md +0 -284
- package/development/projects/proj_mkh7veqg_3lypc/phase3/prototype/README.md +0 -14
- package/development/projects/proj_mkh8k8fo_rmqn5/phase1/feasibility-report.md +0 -160
- package/development/projects/proj_mkh8xyhy_1vshq/phase1/feasibility-report.md +0 -178
- package/development/projects/proj_mkh8zddd_dhamf/phase1/feasibility-report.md +0 -377
- package/development/projects/proj_mkh8zddd_dhamf/phase2/requirements.md +0 -442
- package/development/projects/proj_mkh8zddd_dhamf/phase3/api-design.md +0 -800
- package/development/projects/proj_mkh8zddd_dhamf/phase3/architecture.md +0 -625
- package/development/projects/proj_mkh8zddd_dhamf/phase3/data-model.md +0 -830
- package/development/projects/proj_mkh8zddd_dhamf/phase3/risks.md +0 -957
- package/development/projects/proj_mkh8zddd_dhamf/phase3/wbs.md +0 -381
- package/development/todos/.state.json +0 -19
- package/development/todos/INDEX.md +0 -63
- package/development/todos/active/_README.md +0 -49
- package/development/todos/archived/_README.md +0 -11
- package/development/todos/backlog/_README.md +0 -11
- package/development/todos/backlog/mcp-integration.md +0 -35
- package/development/todos/completed/_README.md +0 -11
- package/development/todos/completed/boris-optimizations.md +0 -39
- package/development/todos/completed/develop/local-knowledge-index.md +0 -85
- package/development/todos/completed/develop/todo-system.md +0 -47
- package/development/todos/completed/develop/web-search-integration.md +0 -83
- package/development/todos/completed/test/phase1-e2e-test.md +0 -103
- package/docs/DEVELOPMENT.md +0 -461
- package/docs/MARKETPLACE.md +0 -352
- package/docs/RELEASE.md +0 -93
- package/jest.config.js +0 -63
- package/lib/commands.js +0 -3588
- package/lib/config-manager.js +0 -441
- package/lib/config-schema.js +0 -408
- package/lib/config-validator.js +0 -330
- package/lib/config.js +0 -122
- package/lib/errors.js +0 -305
- package/lib/incremental-sync.js +0 -274
- package/lib/marketplace.js +0 -487
- package/lib/migrations.js +0 -154
- package/lib/permission-audit.js +0 -255
- package/lib/quality-gate.js +0 -431
- package/lib/quality-rules.js +0 -373
- package/lib/utils.js +0 -150
- package/lib/version-check.js +0 -169
- package/lib/version-manifest.js +0 -171
- package/project-paradigm.md +0 -313
- package/prompts/how-to-find.md +0 -163
- package/prompts/linus-architect.md +0 -71
- package/prompts/software-architect.md +0 -173
- package/prompts/web-designer.md +0 -249
- package/scripts/fix-hooks.mjs +0 -97
- package/scripts/sync-external.mjs +0 -298
- package/scripts/sync-to-home.sh +0 -108
- package/scripts/update-registry.mjs +0 -325
- package/sources.yaml +0 -83
- package/tests/README.md +0 -263
- package/tests/commands.test.js +0 -1086
- package/tests/config-manager.test.js +0 -677
- package/tests/config-schema.test.js +0 -425
- package/tests/config-validator.test.js +0 -436
- package/tests/config.test.js +0 -100
- package/tests/errors.test.js +0 -477
- package/tests/manual/phase1-e2e.sh +0 -389
- package/tests/manual/phase2-test-cases.md +0 -311
- package/tests/manual/phase3-test-cases.md +0 -309
- package/tests/manual/phase4-test-cases.md +0 -414
- package/tests/manual/test-cases.md +0 -417
- package/tests/marketplace.test.js +0 -420
- package/tests/migrations.test.js +0 -187
- package/tests/quality-gate.test.js +0 -679
- package/tests/quality-rules.test.js +0 -619
- package/tests/sync-external.test.js +0 -214
- package/tests/update-registry.test.js +0 -251
- package/tests/utils.test.js +0 -171
- package/tests/version-check.test.js +0 -75
- package/tests/web-search.test.js +0 -392
- package/thinkinglens-silent.md +0 -138
|
@@ -2,21 +2,6 @@
|
|
|
2
2
|
"$schema": "hook-registry-schema.json",
|
|
3
3
|
"$comment": "Hook Dispatcher Registry - Controls which hooks run and when",
|
|
4
4
|
|
|
5
|
-
"plan-gate": {
|
|
6
|
-
"events": ["PreToolUse"],
|
|
7
|
-
"toolMatch": ["Write", "Edit"],
|
|
8
|
-
"enabled": true,
|
|
9
|
-
"description": "强制规划检查 - 无批准计划阻止 Write/Edit"
|
|
10
|
-
},
|
|
11
|
-
|
|
12
|
-
"live-quality": {
|
|
13
|
-
"events": ["PostToolUse"],
|
|
14
|
-
"toolMatch": ["Write", "Edit"],
|
|
15
|
-
"debounce": 1000,
|
|
16
|
-
"enabled": true,
|
|
17
|
-
"description": "实时质量检查 - 写入后立即检查代码质量"
|
|
18
|
-
},
|
|
19
|
-
|
|
20
5
|
"thinking-silent": {
|
|
21
6
|
"events": ["AgentStop"],
|
|
22
7
|
"debounce": 5000,
|
|
@@ -2,7 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
> 代码风格规则 - 所有代码必须遵守
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 优先级说明
|
|
6
|
+
|
|
7
|
+
| 标签 | 含义 | 处理方式 |
|
|
8
|
+
|------|------|----------|
|
|
9
|
+
| 🔴 CRITICAL | 必须遵守 | 违反将阻止提交 |
|
|
10
|
+
| 🟠 HIGH | 应该遵守 | 代码审查必查 |
|
|
11
|
+
| 🟡 MEDIUM | 建议遵守 | 提升代码质量 |
|
|
12
|
+
| 🟢 LOW | 可选遵守 | 团队约定 |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🔴 CRITICAL: 不可变性 [CS-001]
|
|
6
17
|
|
|
7
18
|
**始终创建新对象,永不变异:**
|
|
8
19
|
|
|
@@ -22,7 +33,7 @@ function updateUser(user, name) {
|
|
|
22
33
|
}
|
|
23
34
|
```
|
|
24
35
|
|
|
25
|
-
## 文件组织
|
|
36
|
+
## 🟠 HIGH: 文件组织 [CS-002]
|
|
26
37
|
|
|
27
38
|
**多个小文件 > 少数大文件:**
|
|
28
39
|
|
|
@@ -34,7 +45,7 @@ function updateUser(user, name) {
|
|
|
34
45
|
|
|
35
46
|
原则:高内聚,低耦合
|
|
36
47
|
|
|
37
|
-
## 错误处理
|
|
48
|
+
## 🔴 CRITICAL: 错误处理 [CS-003]
|
|
38
49
|
|
|
39
50
|
**始终全面处理错误:**
|
|
40
51
|
|
|
@@ -48,7 +59,7 @@ try {
|
|
|
48
59
|
}
|
|
49
60
|
```
|
|
50
61
|
|
|
51
|
-
## 输入验证
|
|
62
|
+
## 🔴 CRITICAL: 输入验证 [CS-004]
|
|
52
63
|
|
|
53
64
|
**始终验证用户输入:**
|
|
54
65
|
|
|
@@ -63,7 +74,7 @@ const schema = z.object({
|
|
|
63
74
|
const validated = schema.parse(input)
|
|
64
75
|
```
|
|
65
76
|
|
|
66
|
-
## 代码质量检查清单
|
|
77
|
+
## 🟡 MEDIUM: 代码质量检查清单 [CS-005]
|
|
67
78
|
|
|
68
79
|
完成工作前确认:
|
|
69
80
|
|
|
@@ -76,7 +87,7 @@ const validated = schema.parse(input)
|
|
|
76
87
|
- [ ] 无硬编码值
|
|
77
88
|
- [ ] 无变异(使用不可变模式)
|
|
78
89
|
|
|
79
|
-
## 命名规范
|
|
90
|
+
## 🟢 LOW: 命名规范 [CS-006]
|
|
80
91
|
|
|
81
92
|
| 类型 | 规范 | 示例 |
|
|
82
93
|
|------|------|------|
|
|
@@ -86,7 +97,7 @@ const validated = schema.parse(input)
|
|
|
86
97
|
| 类/组件 | PascalCase | `UserProfile`, `DataService` |
|
|
87
98
|
| 文件 | kebab-case 或 PascalCase | `user-service.ts`, `UserProfile.tsx` |
|
|
88
99
|
|
|
89
|
-
## 禁止的模式
|
|
100
|
+
## 🟠 HIGH: 禁止的模式 [CS-007]
|
|
90
101
|
|
|
91
102
|
```typescript
|
|
92
103
|
// ❌ 魔法数字
|
package/.claude/rules/hooks.md
CHANGED
|
@@ -2,7 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
> 自动化钩子使用指南 - 融合自 everything-claude-code
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 优先级说明
|
|
6
|
+
|
|
7
|
+
| 标签 | 含义 | 处理方式 |
|
|
8
|
+
|------|------|----------|
|
|
9
|
+
| 🔴 CRITICAL | 安全相关 | 必须配置 |
|
|
10
|
+
| 🟠 HIGH | 质量保障 | 强烈推荐 |
|
|
11
|
+
| 🟡 MEDIUM | 效率提升 | 建议配置 |
|
|
12
|
+
| 🟢 LOW | 便利功能 | 可选配置 |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🟠 HIGH: Hook 类型 [HOOK-001]
|
|
6
17
|
|
|
7
18
|
| 类型 | 触发时机 | 用途 |
|
|
8
19
|
|------|---------|------|
|
|
@@ -10,11 +21,11 @@
|
|
|
10
21
|
| PostToolUse | 工具执行后 | 格式化、检查、通知 |
|
|
11
22
|
| Stop | 会话结束时 | 总结、清理、保存 |
|
|
12
23
|
|
|
13
|
-
## 推荐的 Hook 配置
|
|
24
|
+
## 🔴 CRITICAL: 推荐的 Hook 配置 [HOOK-002]
|
|
14
25
|
|
|
15
26
|
### PreToolUse Hooks
|
|
16
27
|
|
|
17
|
-
**1. Git Push 审查**
|
|
28
|
+
**1. Git Push 审查** (🔴 安全)
|
|
18
29
|
|
|
19
30
|
在 `git push` 前确认分支和状态:
|
|
20
31
|
|
|
@@ -43,7 +54,7 @@ module.exports = {
|
|
|
43
54
|
}
|
|
44
55
|
```
|
|
45
56
|
|
|
46
|
-
**2. 敏感文件保护**
|
|
57
|
+
**2. 敏感文件保护** (🔴 安全)
|
|
47
58
|
|
|
48
59
|
防止修改关键配置文件:
|
|
49
60
|
|
|
@@ -2,7 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
> 性能和资源管理规则
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 优先级说明
|
|
6
|
+
|
|
7
|
+
| 标签 | 含义 | 处理方式 |
|
|
8
|
+
|------|------|----------|
|
|
9
|
+
| 🔴 CRITICAL | 必须遵守 | 影响系统稳定性 |
|
|
10
|
+
| 🟠 HIGH | 应该遵守 | 影响效率和成本 |
|
|
11
|
+
| 🟡 MEDIUM | 建议遵守 | 优化体验 |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 🟠 HIGH: 模型选择策略 [PERF-001]
|
|
6
16
|
|
|
7
17
|
根据任务复杂度选择合适的模型:
|
|
8
18
|
|
|
@@ -22,7 +32,7 @@ Reviewer → Opus (需要严谨分析)
|
|
|
22
32
|
Librarian → Haiku (文档整理)
|
|
23
33
|
```
|
|
24
34
|
|
|
25
|
-
## Context Window 管理
|
|
35
|
+
## 🔴 CRITICAL: Context Window 管理 [PERF-002]
|
|
26
36
|
|
|
27
37
|
**关键原则**:避免在 context 的最后 20% 进行复杂操作
|
|
28
38
|
|
|
@@ -37,7 +47,7 @@ Librarian → Haiku (文档整理)
|
|
|
37
47
|
- 文档更新
|
|
38
48
|
- 简单 bug 修复
|
|
39
49
|
|
|
40
|
-
## MCP 管理
|
|
50
|
+
## 🟠 HIGH: MCP 管理 [PERF-003]
|
|
41
51
|
|
|
42
52
|
**关键**:不要同时启用所有 MCP
|
|
43
53
|
|
|
@@ -59,7 +69,7 @@ Librarian → Haiku (文档整理)
|
|
|
59
69
|
}
|
|
60
70
|
```
|
|
61
71
|
|
|
62
|
-
## 构建故障排除
|
|
72
|
+
## 🟡 MEDIUM: 构建故障排除 [PERF-004]
|
|
63
73
|
|
|
64
74
|
构建失败时:
|
|
65
75
|
|
|
@@ -68,7 +78,7 @@ Librarian → Haiku (文档整理)
|
|
|
68
78
|
3. 增量修复
|
|
69
79
|
4. 每次修复后验证
|
|
70
80
|
|
|
71
|
-
## 复杂任务策略
|
|
81
|
+
## 🟡 MEDIUM: 复杂任务策略 [PERF-005]
|
|
72
82
|
|
|
73
83
|
对于需要深度推理的任务:
|
|
74
84
|
|
|
@@ -2,7 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
> 安全规则 - 所有提交必须遵守
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 优先级说明
|
|
6
|
+
|
|
7
|
+
| 标签 | 含义 | 处理方式 |
|
|
8
|
+
|------|------|----------|
|
|
9
|
+
| 🔴 CRITICAL | 必须遵守 | 违反将阻止提交 |
|
|
10
|
+
| 🟠 HIGH | 应该遵守 | 代码审查必查 |
|
|
11
|
+
|
|
12
|
+
**注意**:安全规则全部为 🔴 CRITICAL 或 🟠 HIGH,无低优先级项。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🔴 CRITICAL: 提交前强制检查 [SEC-001]
|
|
6
17
|
|
|
7
18
|
每次提交代码前必须确认:
|
|
8
19
|
|
|
@@ -15,7 +26,7 @@
|
|
|
15
26
|
- [ ] **速率限制** - API 端点有请求限制
|
|
16
27
|
- [ ] **错误信息** - 不泄露敏感数据
|
|
17
28
|
|
|
18
|
-
## 密钥管理
|
|
29
|
+
## 🔴 CRITICAL: 密钥管理 [SEC-002]
|
|
19
30
|
|
|
20
31
|
```typescript
|
|
21
32
|
// ❌ 永远不要这样做
|
|
@@ -29,7 +40,7 @@ if (!apiKey) {
|
|
|
29
40
|
}
|
|
30
41
|
```
|
|
31
42
|
|
|
32
|
-
## 安全响应协议
|
|
43
|
+
## 🔴 CRITICAL: 安全响应协议 [SEC-003]
|
|
33
44
|
|
|
34
45
|
发现安全问题时:
|
|
35
46
|
|
|
@@ -39,7 +50,7 @@ if (!apiKey) {
|
|
|
39
50
|
4. **轮换** 任何已暴露的密钥
|
|
40
51
|
5. **审查** 整个代码库是否有类似问题
|
|
41
52
|
|
|
42
|
-
##
|
|
53
|
+
## 🟠 HIGH: 敏感文件管理 [SEC-004]
|
|
43
54
|
|
|
44
55
|
以下文件永远不应提交:
|
|
45
56
|
|
|
@@ -54,3 +65,128 @@ secrets.yaml
|
|
|
54
65
|
```
|
|
55
66
|
|
|
56
67
|
确保 `.gitignore` 包含这些模式。
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 正确/错误对比示例
|
|
72
|
+
|
|
73
|
+
### SQL 注入防护
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// ❌ 错误:字符串拼接(SQL 注入风险)
|
|
77
|
+
const query = `SELECT * FROM users WHERE id = ${userId}`
|
|
78
|
+
db.query(query)
|
|
79
|
+
|
|
80
|
+
// ❌ 错误:模板字符串(同样危险)
|
|
81
|
+
db.query(`SELECT * FROM users WHERE email = '${email}'`)
|
|
82
|
+
|
|
83
|
+
// ✅ 正确:参数化查询
|
|
84
|
+
db.query('SELECT * FROM users WHERE id = $1', [userId])
|
|
85
|
+
|
|
86
|
+
// ✅ 正确:使用 ORM
|
|
87
|
+
await prisma.user.findUnique({ where: { id: userId } })
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### XSS 防护
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
// ❌ 错误:直接渲染用户内容
|
|
94
|
+
<div dangerouslySetInnerHTML={{ __html: userComment }} />
|
|
95
|
+
|
|
96
|
+
// ❌ 错误:URL 中注入
|
|
97
|
+
<a href={`javascript:${userInput}`}>Click</a>
|
|
98
|
+
|
|
99
|
+
// ✅ 正确:使用 DOMPurify 清理
|
|
100
|
+
import DOMPurify from 'dompurify'
|
|
101
|
+
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(userComment) }} />
|
|
102
|
+
|
|
103
|
+
// ✅ 更好:直接渲染文本(自动转义)
|
|
104
|
+
<div>{userComment}</div>
|
|
105
|
+
|
|
106
|
+
// ✅ 正确:URL 验证
|
|
107
|
+
const safeUrl = url.startsWith('https://') ? url : '#'
|
|
108
|
+
<a href={safeUrl}>Link</a>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 认证授权
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// ❌ 错误:仅前端检查权限
|
|
115
|
+
if (user.role === 'admin') {
|
|
116
|
+
showAdminPanel()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ❌ 错误:信任客户端传来的 userId
|
|
120
|
+
app.delete('/users/:id', (req, res) => {
|
|
121
|
+
userService.delete(req.params.id) // 谁都能删任何人!
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
// ✅ 正确:后端验证权限
|
|
125
|
+
app.delete('/users/:id', authenticate, authorize('admin'), (req, res) => {
|
|
126
|
+
// 只有 admin 角色才能到达这里
|
|
127
|
+
userService.delete(req.params.id)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
// ✅ 正确:用户只能操作自己的资源
|
|
131
|
+
app.delete('/users/:id', authenticate, (req, res) => {
|
|
132
|
+
if (req.user.id !== req.params.id && req.user.role !== 'admin') {
|
|
133
|
+
return res.status(403).json({ error: 'Forbidden' })
|
|
134
|
+
}
|
|
135
|
+
userService.delete(req.params.id)
|
|
136
|
+
})
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 错误信息处理
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
// ❌ 错误:暴露内部细节
|
|
143
|
+
app.use((err, req, res, next) => {
|
|
144
|
+
res.status(500).json({
|
|
145
|
+
error: err.message,
|
|
146
|
+
stack: err.stack, // 泄露代码路径!
|
|
147
|
+
query: req.query, // 泄露请求参数!
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
// ❌ 错误:暴露数据库错误
|
|
152
|
+
catch (err) {
|
|
153
|
+
res.json({ error: `Database error: ${err.message}` })
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ✅ 正确:通用错误 + 内部日志
|
|
157
|
+
app.use((err, req, res, next) => {
|
|
158
|
+
// 内部记录详细错误
|
|
159
|
+
logger.error('Request failed', {
|
|
160
|
+
error: err,
|
|
161
|
+
requestId: req.id,
|
|
162
|
+
path: req.path
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
// 返回通用错误给客户端
|
|
166
|
+
res.status(500).json({
|
|
167
|
+
error: 'Internal server error',
|
|
168
|
+
requestId: req.id // 用于追踪
|
|
169
|
+
})
|
|
170
|
+
})
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 速率限制
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
// ❌ 错误:无速率限制(DDoS/暴力破解风险)
|
|
177
|
+
app.post('/login', (req, res) => {
|
|
178
|
+
// 攻击者可以无限尝试密码
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
// ✅ 正确:添加速率限制
|
|
182
|
+
import rateLimit from 'express-rate-limit'
|
|
183
|
+
|
|
184
|
+
const loginLimiter = rateLimit({
|
|
185
|
+
windowMs: 15 * 60 * 1000, // 15 分钟
|
|
186
|
+
max: 5, // 最多 5 次
|
|
187
|
+
message: 'Too many login attempts, please try again later'
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
app.post('/login', loginLimiter, (req, res) => {
|
|
191
|
+
// 现在受保护了
|
|
192
|
+
})
|
package/.claude/rules/testing.md
CHANGED
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
> 测试规则 - 所有代码必须遵守
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 优先级说明
|
|
6
|
+
|
|
7
|
+
| 标签 | 含义 | 处理方式 |
|
|
8
|
+
|------|------|----------|
|
|
9
|
+
| 🔴 CRITICAL | 必须遵守 | 违反将阻止提交 |
|
|
10
|
+
| 🟠 HIGH | 应该遵守 | 代码审查必查 |
|
|
11
|
+
| 🟡 MEDIUM | 建议遵守 | 提升代码质量 |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 🟠 HIGH: 核心原则 [TEST-001]
|
|
6
16
|
|
|
7
17
|
**测试先于代码**:使用 TDD 工作流,先写测试再实现。
|
|
8
18
|
|
|
9
|
-
## 覆盖率要求
|
|
19
|
+
## 🔴 CRITICAL: 覆盖率要求 [TEST-002]
|
|
10
20
|
|
|
11
21
|
| 代码类型 | 最低覆盖率 |
|
|
12
22
|
|---------|-----------|
|
|
@@ -15,7 +25,7 @@
|
|
|
15
25
|
| 认证逻辑 | 100% |
|
|
16
26
|
| 安全相关代码 | 100% |
|
|
17
27
|
|
|
18
|
-
## 提交前检查
|
|
28
|
+
## 🔴 CRITICAL: 提交前检查 [TEST-003]
|
|
19
29
|
|
|
20
30
|
每次提交前必须:
|
|
21
31
|
|
|
@@ -30,27 +40,27 @@
|
|
|
30
40
|
npm test && npm run lint
|
|
31
41
|
```
|
|
32
42
|
|
|
33
|
-
## 测试类型要求
|
|
43
|
+
## 🟠 HIGH: 测试类型要求 [TEST-004]
|
|
34
44
|
|
|
35
|
-
### 单元测试 (必须)
|
|
45
|
+
### 单元测试 (🔴 必须)
|
|
36
46
|
|
|
37
47
|
- 每个公共函数都有测试
|
|
38
48
|
- 测试边界情况(null, empty, max)
|
|
39
49
|
- 测试错误路径
|
|
40
50
|
|
|
41
|
-
### 集成测试 (必须)
|
|
51
|
+
### 集成测试 (🟠 必须)
|
|
42
52
|
|
|
43
53
|
- 每个 API 端点都有测试
|
|
44
54
|
- 测试正常响应和错误响应
|
|
45
55
|
- Mock 外部依赖
|
|
46
56
|
|
|
47
|
-
### E2E 测试 (关键流程)
|
|
57
|
+
### E2E 测试 (🟡 关键流程)
|
|
48
58
|
|
|
49
59
|
- 登录/认证流程
|
|
50
60
|
- 核心业务流程
|
|
51
61
|
- 支付/金融流程
|
|
52
62
|
|
|
53
|
-
## 测试反模式
|
|
63
|
+
## 🟠 HIGH: 测试反模式 [TEST-005]
|
|
54
64
|
|
|
55
65
|
❌ **测试实现细节**
|
|
56
66
|
```typescript
|
|
@@ -71,7 +81,126 @@ test('updates same user', () => { ... }) // 依赖前一个
|
|
|
71
81
|
await page.waitForTimeout(5000)
|
|
72
82
|
```
|
|
73
83
|
|
|
74
|
-
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 正确/错误对比示例
|
|
87
|
+
|
|
88
|
+
### 异步测试
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// ❌ 错误:忘记 await
|
|
92
|
+
test('fetches user', () => {
|
|
93
|
+
const user = fetchUser(1) // Promise 未等待!
|
|
94
|
+
expect(user.name).toBe('John') // 总是失败
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
// ❌ 错误:回调地狱
|
|
98
|
+
test('creates user', (done) => {
|
|
99
|
+
createUser({ name: 'John' }).then(user => {
|
|
100
|
+
expect(user.name).toBe('John')
|
|
101
|
+
done()
|
|
102
|
+
})
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
// ✅ 正确:async/await
|
|
106
|
+
test('fetches user', async () => {
|
|
107
|
+
const user = await fetchUser(1)
|
|
108
|
+
expect(user.name).toBe('John')
|
|
109
|
+
})
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Mock 使用
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// ❌ 错误:Mock 真实数据库(测试太慢)
|
|
116
|
+
test('creates user', async () => {
|
|
117
|
+
const user = await db.user.create({ data: { name: 'John' } })
|
|
118
|
+
expect(user.name).toBe('John')
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
// ❌ 错误:过度 Mock(测不到真问题)
|
|
122
|
+
jest.mock('../services/userService')
|
|
123
|
+
jest.mock('../repositories/userRepo')
|
|
124
|
+
jest.mock('../utils/validator')
|
|
125
|
+
// 一切都是假的,测试毫无意义
|
|
126
|
+
|
|
127
|
+
// ✅ 正确:只 Mock 外部依赖
|
|
128
|
+
jest.mock('../lib/emailClient') // 外部服务
|
|
129
|
+
|
|
130
|
+
test('creates user and sends welcome email', async () => {
|
|
131
|
+
const user = await userService.create({ name: 'John', email: 'j@example.com' })
|
|
132
|
+
|
|
133
|
+
expect(user.name).toBe('John')
|
|
134
|
+
expect(emailClient.send).toHaveBeenCalledWith({
|
|
135
|
+
to: 'j@example.com',
|
|
136
|
+
subject: 'Welcome!'
|
|
137
|
+
})
|
|
138
|
+
})
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 测试数据
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// ❌ 错误:硬编码 ID(脆弱)
|
|
145
|
+
test('fetches user', async () => {
|
|
146
|
+
const user = await fetchUser('123e4567-e89b-12d3-a456-426614174000')
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// ❌ 错误:依赖全局状态
|
|
150
|
+
let createdUserId: string
|
|
151
|
+
|
|
152
|
+
test('creates user', async () => {
|
|
153
|
+
const user = await createUser({ name: 'John' })
|
|
154
|
+
createdUserId = user.id // 污染其他测试
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
test('fetches user', async () => {
|
|
158
|
+
const user = await fetchUser(createdUserId) // 依赖上一个测试
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
// ✅ 正确:每个测试独立
|
|
162
|
+
describe('UserService', () => {
|
|
163
|
+
let testUser: User
|
|
164
|
+
|
|
165
|
+
beforeEach(async () => {
|
|
166
|
+
testUser = await createTestUser() // 工厂函数
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
afterEach(async () => {
|
|
170
|
+
await cleanupTestData()
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
test('fetches user', async () => {
|
|
174
|
+
const user = await fetchUser(testUser.id)
|
|
175
|
+
expect(user.name).toBe(testUser.name)
|
|
176
|
+
})
|
|
177
|
+
})
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 断言方式
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// ❌ 错误:只测 truthy(不精确)
|
|
184
|
+
expect(result).toBeTruthy()
|
|
185
|
+
expect(users).toBeTruthy()
|
|
186
|
+
expect(count).toBeTruthy()
|
|
187
|
+
|
|
188
|
+
// ❌ 错误:测试实现细节
|
|
189
|
+
expect(component.state.isLoading).toBe(false)
|
|
190
|
+
expect(component.instance().handleClick).toBeDefined()
|
|
191
|
+
|
|
192
|
+
// ✅ 正确:测试行为和输出
|
|
193
|
+
expect(result).toEqual({ id: 1, name: 'John' })
|
|
194
|
+
expect(users).toHaveLength(3)
|
|
195
|
+
expect(count).toBe(42)
|
|
196
|
+
|
|
197
|
+
// ✅ 正确:测试用户可见的结果
|
|
198
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument()
|
|
199
|
+
expect(screen.queryByText('Loading...')).not.toBeInTheDocument()
|
|
200
|
+
expect(screen.getByRole('button', { name: 'Submit' })).toBeEnabled()
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## 🟡 MEDIUM: CI 集成 [TEST-006]
|
|
75
204
|
|
|
76
205
|
CI 流水线必须:
|
|
77
206
|
|
|
@@ -2,7 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
> 定义什么是好的设计,而非仅提供资源
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 优先级说明
|
|
6
|
+
|
|
7
|
+
| 标签 | 含义 | 处理方式 |
|
|
8
|
+
|------|------|----------|
|
|
9
|
+
| 🔴 CRITICAL | 必须遵守 | 违反将显著影响用户体验 |
|
|
10
|
+
| 🟠 HIGH | 应该遵守 | 设计审查必查 |
|
|
11
|
+
| 🟡 MEDIUM | 建议遵守 | 提升设计质量 |
|
|
12
|
+
| 🟢 LOW | 可选遵守 | 风格偏好 |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 🟠 HIGH: 核心哲学 [DESIGN-001]
|
|
6
17
|
|
|
7
18
|
```
|
|
8
19
|
"Visual design is not about expressing yourself.
|
|
@@ -12,7 +23,7 @@
|
|
|
12
23
|
|
|
13
24
|
**奥卡姆剃刀**:能删则删。文字、线条、边框——如果移除不影响含义,就移除它。
|
|
14
25
|
|
|
15
|
-
## 三大铁律
|
|
26
|
+
## 🔴 CRITICAL: 三大铁律 [DESIGN-002]
|
|
16
27
|
|
|
17
28
|
| 铁律 | 含义 | 检查方式 |
|
|
18
29
|
|------|------|----------|
|
|
@@ -20,13 +31,13 @@
|
|
|
20
31
|
| **接近 = 相关性** | 靠近的被感知为一组 | 相关内容放一起 |
|
|
21
32
|
| **视觉层级** | 对比 + 接近 = 导航路标 | 眯眼测试:第一眼看哪? |
|
|
22
33
|
|
|
23
|
-
## 设计决策流程
|
|
34
|
+
## 🟠 HIGH: 设计决策流程 [DESIGN-003]
|
|
24
35
|
|
|
25
36
|
```
|
|
26
37
|
需求 → 信息层级 → 排版 → 颜色 → 间距 → 交互 → 验证
|
|
27
38
|
```
|
|
28
39
|
|
|
29
|
-
### Step 1: 信息层级
|
|
40
|
+
### Step 1: 信息层级 (🔴)
|
|
30
41
|
|
|
31
42
|
```
|
|
32
43
|
问自己:
|
|
@@ -36,7 +47,7 @@
|
|
|
36
47
|
4. 什么可以删除?(装饰、冗余)
|
|
37
48
|
```
|
|
38
49
|
|
|
39
|
-
### Step 2: 排版系统
|
|
50
|
+
### Step 2: 排版系统 (🟠)
|
|
40
51
|
|
|
41
52
|
| 元素 | 规则 |
|
|
42
53
|
|------|------|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: algorithmic-art
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
author: "@sumulige"
|
|
4
|
+
description: |
|
|
5
|
+
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration.
|
|
6
|
+
Use this when users request creating art using code, generative art, algorithmic art, flow fields,
|
|
7
|
+
or particle systems. Create original algorithmic art rather than copying existing artists' work.
|
|
8
|
+
|
|
9
|
+
tags:
|
|
10
|
+
- generative-art
|
|
11
|
+
- p5js
|
|
12
|
+
- creative-coding
|
|
13
|
+
- visualization
|
|
14
|
+
- interactive
|
|
15
|
+
|
|
16
|
+
triggers:
|
|
17
|
+
- algorithmic art
|
|
18
|
+
- generative art
|
|
19
|
+
- p5.js
|
|
20
|
+
- flow fields
|
|
21
|
+
- particle systems
|
|
22
|
+
- creative coding
|
|
23
|
+
- procedural art
|
|
24
|
+
|
|
25
|
+
dependencies:
|
|
26
|
+
- p5.js
|
|
27
|
+
|
|
28
|
+
difficulty: advanced
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Api Tester
|
|
2
|
+
|
|
3
|
+
> 简短描述这个技能的作用(一句话)
|
|
4
|
+
|
|
5
|
+
**版本**: 1.0.0
|
|
6
|
+
**作者**: @username
|
|
7
|
+
**标签**: [category1, category2]
|
|
8
|
+
**难度**: 初级/中级/高级
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 概述
|
|
13
|
+
|
|
14
|
+
详细描述这个技能的功能和用途。
|
|
15
|
+
|
|
16
|
+
## 适用场景
|
|
17
|
+
|
|
18
|
+
- 场景 1
|
|
19
|
+
- 场景 2
|
|
20
|
+
- 场景 3
|
|
21
|
+
|
|
22
|
+
## 触发关键词
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
keyword1, keyword2, "exact phrase"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 使用方法
|
|
29
|
+
|
|
30
|
+
### 基础用法
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 示例命令
|
|
34
|
+
your-command-here
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 高级用法
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
# 配置示例
|
|
41
|
+
key: value
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 输出格式
|
|
45
|
+
|
|
46
|
+
描述这个技能的输出结果格式。
|
|
47
|
+
|
|
48
|
+
## 注意事项
|
|
49
|
+
|
|
50
|
+
- 注意事项 1
|
|
51
|
+
- 注意事项 2
|
|
52
|
+
|
|
53
|
+
## 相关技能
|
|
54
|
+
|
|
55
|
+
- [related-skill](../related-skill/)
|
|
56
|
+
- [another-skill](../another-skill/)
|
|
57
|
+
|
|
58
|
+
## 更新日志
|
|
59
|
+
|
|
60
|
+
### 1.0.0 (YYYY-MM-DD)
|
|
61
|
+
- 初始版本
|