create-vibe-workflow 0.1.0 → 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/README.md +248 -57
- package/dist/adapters/next-only/skills.recommend.json +1 -0
- package/dist/adapters/node-api/skills.recommend.json +1 -0
- package/dist/cli.js +163 -5
- package/dist/cli.js.map +1 -1
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +255 -44
- package/dist/generator.js.map +1 -1
- package/dist/questions.d.ts +11 -1
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +103 -16
- package/dist/questions.js.map +1 -1
- package/dist/templates/claude-md/CLAUDE.zh-CN.md +51 -46
- package/dist/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
- package/dist/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
- package/dist/templates/commands/gstack/cso.md.ejs +213 -0
- package/dist/templates/commands/gstack/office-hours.md.ejs +109 -0
- package/dist/templates/commands/gstack/review.md.ejs +192 -0
- package/dist/templates/commands/gstack/ship.md.ejs +256 -0
- package/dist/templates/commands/opsx/apply.md.ejs +106 -0
- package/dist/templates/commands/opsx/archive.md.ejs +88 -0
- package/dist/templates/commands/opsx/explore.md.ejs +84 -0
- package/dist/templates/commands/opsx/propose.md.ejs +185 -0
- package/dist/templates/commands/superpowers/brainstorm.md.ejs +240 -0
- package/dist/templates/commands/superpowers/tdd.md.ejs +230 -0
- package/dist/templates/commands/superpowers/verify.md.ejs +211 -0
- package/dist/templates/commands/workflow/plan.md.ejs +219 -0
- package/dist/templates/hooks/check-deps.mjs +66 -65
- package/dist/templates/memory/.gitkeep +0 -0
- package/dist/templates/memory/MEMORY.md.ejs +88 -0
- package/dist/templates/memory/dev-notes.md.ejs +61 -0
- package/dist/templates/memory/troubleshooting.md.ejs +30 -0
- package/dist/templates/rules/agents.md +49 -49
- package/dist/templates/rules/coding-style.md +156 -117
- package/dist/templates/rules/development-workflow.md +103 -50
- package/dist/templates/rules/git-workflow.md +103 -47
- package/dist/templates/rules/hooks.md +159 -0
- package/dist/templates/rules/hooks.md.ejs +159 -0
- package/dist/templates/rules/memory.md +106 -0
- package/dist/templates/rules/memory.md.ejs +106 -0
- package/dist/templates/rules/patterns.md +117 -48
- package/dist/templates/rules/performance.md +108 -0
- package/dist/templates/rules/performance.md.ejs +108 -0
- package/dist/templates/rules/security.md +52 -37
- package/dist/templates/rules/testing.md +83 -30
- package/dist/templates/settings/settings.template.json +18 -2
- package/dist/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
- package/dist/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
- package/dist/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
- package/dist/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
- package/dist/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
- package/dist/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
- package/dist/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
- package/dist/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
- package/dist/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
- package/dist/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
- package/dist/templates/skills/skill-manifest.json +59 -0
- package/dist/templates/skills/skills-lock.template.json +12 -0
- package/dist/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
- package/dist/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
- package/dist/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
- package/dist/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
- package/dist/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
- package/dist/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
- package/dist/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +110 -0
- package/dist/utils.js.map +1 -0
- package/package.json +2 -2
- package/templates/claude-md/CLAUDE.zh-CN.md +51 -46
- package/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
- package/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
- package/templates/commands/gstack/cso.md.ejs +213 -0
- package/templates/commands/gstack/office-hours.md.ejs +109 -0
- package/templates/commands/gstack/review.md.ejs +192 -0
- package/templates/commands/gstack/ship.md.ejs +256 -0
- package/templates/commands/opsx/apply.md.ejs +106 -0
- package/templates/commands/opsx/archive.md.ejs +88 -0
- package/templates/commands/opsx/explore.md.ejs +84 -0
- package/templates/commands/opsx/propose.md.ejs +185 -0
- package/templates/commands/superpowers/brainstorm.md.ejs +240 -0
- package/templates/commands/superpowers/tdd.md.ejs +230 -0
- package/templates/commands/superpowers/verify.md.ejs +211 -0
- package/templates/commands/workflow/plan.md.ejs +219 -0
- package/templates/hooks/check-deps.mjs +66 -65
- package/templates/memory/.gitkeep +0 -0
- package/templates/memory/MEMORY.md.ejs +88 -0
- package/templates/memory/dev-notes.md.ejs +61 -0
- package/templates/memory/troubleshooting.md.ejs +30 -0
- package/templates/rules/agents.md +49 -49
- package/templates/rules/coding-style.md +156 -117
- package/templates/rules/development-workflow.md +103 -50
- package/templates/rules/git-workflow.md +103 -47
- package/templates/rules/hooks.md +159 -0
- package/templates/rules/memory.md +106 -0
- package/templates/rules/patterns.md +117 -48
- package/templates/rules/performance.md +108 -0
- package/templates/rules/security.md +52 -37
- package/templates/rules/testing.md +83 -30
- package/templates/settings/settings.template.json +18 -2
- package/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
- package/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
- package/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
- package/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
- package/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
- package/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
- package/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
- package/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
- package/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
- package/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
- package/templates/skills/skill-manifest.json +59 -0
- package/templates/skills/skills-lock.template.json +12 -0
- package/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
- package/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
- package/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
- package/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
- package/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
- package/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
- package/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.ts"
|
|
4
|
+
- "**/*.tsx"
|
|
5
|
+
- "**/*.js"
|
|
6
|
+
- "**/*.jsx"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Hooks 配置指南
|
|
10
|
+
|
|
11
|
+
> 本文件定义如何通过 `.claude/settings.json` 配置 Claude Code 的 PostToolUse 和 Stop hooks。
|
|
12
|
+
> 具体依赖声明见 `.claude/settings.json`(由 `create-vibe-workflow` 生成)。
|
|
13
|
+
|
|
14
|
+
## 什么是 Hooks
|
|
15
|
+
|
|
16
|
+
Hooks 是 Claude Code 在工具调用前后触发的自动化脚本,用于:
|
|
17
|
+
|
|
18
|
+
- **PostToolUse hooks**: 在工具使用后自动执行(如自动格式化代码)
|
|
19
|
+
- **Stop hooks**: 在会话停止/结束时执行(如最终检查)
|
|
20
|
+
|
|
21
|
+
Hooks 在 `.claude/settings.json` 中配置,脚本存放在 `.claude/hooks/` 目录。
|
|
22
|
+
|
|
23
|
+
## PostToolUse Hooks
|
|
24
|
+
|
|
25
|
+
在每次工具调用后触发。适用于自动化质量检查。
|
|
26
|
+
|
|
27
|
+
### 配置结构
|
|
28
|
+
|
|
29
|
+
```jsonc
|
|
30
|
+
// .claude/settings.json
|
|
31
|
+
{
|
|
32
|
+
"hooks": {
|
|
33
|
+
"PostToolUse": [
|
|
34
|
+
{
|
|
35
|
+
"matcher": {
|
|
36
|
+
"tool_name": "$<工具名>",
|
|
37
|
+
"scope": "project" // 或 "user" / "global"
|
|
38
|
+
},
|
|
39
|
+
"command": "node .claude/hooks/<脚本名>",
|
|
40
|
+
"description": "描述这个 hook 的作用"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### matcher 字段说明
|
|
48
|
+
|
|
49
|
+
| 字段 | 说明 | 示例 |
|
|
50
|
+
|------|------|------|
|
|
51
|
+
| `tool_name` | 匹配的工具名称 | `Bash`、`Edit`、`Write` |
|
|
52
|
+
| `scope` | 作用域 | `project`(项目级)、`user`(用户级)、`global`(全局) |
|
|
53
|
+
|
|
54
|
+
### Stop Hooks
|
|
55
|
+
|
|
56
|
+
在会话停止时触发。适用于清理、审计等一次性操作。
|
|
57
|
+
|
|
58
|
+
```jsonc
|
|
59
|
+
// .claude/settings.json
|
|
60
|
+
{
|
|
61
|
+
"hooks": {
|
|
62
|
+
"Stop": [
|
|
63
|
+
{
|
|
64
|
+
"matcher": {
|
|
65
|
+
"scope": "project"
|
|
66
|
+
},
|
|
67
|
+
"command": "node .claude/hooks/<脚本名>",
|
|
68
|
+
"description": "描述这个 hook 的作用"
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 本项目生成的 Hooks
|
|
76
|
+
|
|
77
|
+
本模板生成了以下两个 hook 脚本(在 `.claude/hooks/` 目录):
|
|
78
|
+
|
|
79
|
+
| 脚本 | 类型 | 触发时机 | 作用 |
|
|
80
|
+
|------|------|----------|------|
|
|
81
|
+
| `post-commit-check.js` | PostToolUse | 每次 Bash 工具调用后 | 检测到 `git commit` 命令后提示文档反写检查清单 |
|
|
82
|
+
| `check-deps.mjs` | PostToolUse | 每次工具调用后 | 检查 git 配置是否满足项目规范 |
|
|
83
|
+
|
|
84
|
+
## 自定义 Hooks 示例
|
|
85
|
+
|
|
86
|
+
### 示例 1:PostToolUse — 自动格式化
|
|
87
|
+
|
|
88
|
+
编辑 TypeScript 文件后自动运行 Prettier:
|
|
89
|
+
|
|
90
|
+
```jsonc
|
|
91
|
+
{
|
|
92
|
+
"hooks": {
|
|
93
|
+
"PostToolUse": [
|
|
94
|
+
{
|
|
95
|
+
"matcher": {
|
|
96
|
+
"tool_name": "Edit",
|
|
97
|
+
"scope": "project"
|
|
98
|
+
},
|
|
99
|
+
"command": "npx prettier --write --ignore-unknown .claude/hooks/post-commit-check.js",
|
|
100
|
+
"description": "编辑文件后自动格式化"
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 示例 2:PostToolUse — 每次 Bash 后检查 TypeScript 编译
|
|
108
|
+
|
|
109
|
+
```jsonc
|
|
110
|
+
{
|
|
111
|
+
"hooks": {
|
|
112
|
+
"PostToolUse": [
|
|
113
|
+
{
|
|
114
|
+
"matcher": {
|
|
115
|
+
"tool_name": "Bash",
|
|
116
|
+
"scope": "project"
|
|
117
|
+
},
|
|
118
|
+
"command": "npx tsc --noEmit 2>&1 | head -30",
|
|
119
|
+
"description": "Bash 命令后检查 TypeScript 编译"
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 示例 3:Stop — 格式化所有文件
|
|
127
|
+
|
|
128
|
+
```jsonc
|
|
129
|
+
{
|
|
130
|
+
"hooks": {
|
|
131
|
+
"Stop": [
|
|
132
|
+
{
|
|
133
|
+
"matcher": {
|
|
134
|
+
"scope": "project"
|
|
135
|
+
},
|
|
136
|
+
"command": "npx prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\"",
|
|
137
|
+
"description": "会话结束时格式化所有源文件"
|
|
138
|
+
}
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 最佳实践
|
|
145
|
+
|
|
146
|
+
1. **Hook 脚本要轻量**: hook 在每次工具调用后触发,脚本执行时间不宜超过 1 秒
|
|
147
|
+
2. **避免副作用**: hook 脚本应该只读或只写格式化相关的内容,不要修改业务逻辑
|
|
148
|
+
3. **合理使用 matcher**: 精确匹配工具名,避免不必要的触发
|
|
149
|
+
4. **静默执行**: hook 脚本不应该输出大量日志到终端,除非有错误
|
|
150
|
+
5. **错误不影响主流程**: hook 脚本执行失败不应阻断主工具调用
|
|
151
|
+
|
|
152
|
+
## 故障排查
|
|
153
|
+
|
|
154
|
+
| 现象 | 可能原因 | 解决 |
|
|
155
|
+
|------|----------|------|
|
|
156
|
+
| Hook 未触发 | matcher 不匹配或路径错误 | 检查 `tool_name` 和脚本路径 |
|
|
157
|
+
| Hook 输出乱码 | 脚本编码问题 | 确保脚本使用 UTF-8 编码 |
|
|
158
|
+
| Hook 执行缓慢 | 脚本中存在耗时操作 | 简化脚本逻辑 |
|
|
159
|
+
| Hook 报错但未被注意 | 错误被静默吞掉 | 在脚本中添加 `console.error` 输出 |
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 记忆系统使用规则
|
|
7
|
+
|
|
8
|
+
> 本文件定义了 AI 如何读写项目记忆文件。记忆系统是项目的"长期大脑",记录经验、决策和上下文。
|
|
9
|
+
|
|
10
|
+
## 记忆类型
|
|
11
|
+
|
|
12
|
+
| 类型 | 目录 | 内容 | 谁写 | 谁读 |
|
|
13
|
+
|------|------|------|------|------|
|
|
14
|
+
| **用户 & 团队** | `memory/` (MEMORY.md 索引) | 团队角色、用户偏好、沟通方式 | AI 记录 | AI 在启动时读取 |
|
|
15
|
+
| **反馈 & 经验** | `memory/` | 用户反馈、经验教训、历史决策 | AI + 用户 | AI 在相关任务时读取 |
|
|
16
|
+
| **项目状态** | `memory/` | 里程碑、活跃模块、TODO、技术债务 | AI 维护 | AI 在规划时读取 |
|
|
17
|
+
| **参考 & 外部** | `memory/` | ADR、外部 API、术语表 | AI + 用户 | 按需读取 |
|
|
18
|
+
|
|
19
|
+
## 记忆文件格式
|
|
20
|
+
|
|
21
|
+
每条记忆文件使用以下格式:
|
|
22
|
+
|
|
23
|
+
```markdown
|
|
24
|
+
# 标题
|
|
25
|
+
|
|
26
|
+
> 记忆元数据
|
|
27
|
+
> - 创建: YYYY-MM-DD
|
|
28
|
+
> - 相关: 关联的模块/功能
|
|
29
|
+
> - 状态: active | archived | deprecated
|
|
30
|
+
|
|
31
|
+
## 内容
|
|
32
|
+
|
|
33
|
+
记忆正文...
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 相关链接
|
|
38
|
+
|
|
39
|
+
- [相关记忆](../other-memory.md)
|
|
40
|
+
- [相关代码](../../src/modules/xxx.ts)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 元数据说明
|
|
44
|
+
|
|
45
|
+
| 字段 | 必填 | 说明 |
|
|
46
|
+
|------|------|------|
|
|
47
|
+
| `创建` | 是 | 该条记忆的创建日期 |
|
|
48
|
+
| `相关` | 否 | 关联的模块、功能、PR 编号等 |
|
|
49
|
+
| `状态` | 否 | `active`(默认)、`archived`(不再相关但保留)、`deprecated`(已过时) |
|
|
50
|
+
|
|
51
|
+
## MEMORY.md 索引格式
|
|
52
|
+
|
|
53
|
+
`memory/MEMORY.md` 是所有记忆的索引文件,每次对话开始时 AI 会自动读取。
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
# 记忆索引
|
|
57
|
+
|
|
58
|
+
## 👤 用户 & 团队
|
|
59
|
+
- [标题](file.md) — 一句话钩子
|
|
60
|
+
|
|
61
|
+
## 💬 反馈 & 经验
|
|
62
|
+
- [标题](file.md) — 一句话钩子
|
|
63
|
+
|
|
64
|
+
## 📋 项目状态
|
|
65
|
+
- [标题](file.md) — 一句话钩子
|
|
66
|
+
|
|
67
|
+
## 📚 参考 & 外部
|
|
68
|
+
- [标题](file.md) — 一句话钩子
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 索引规则
|
|
72
|
+
|
|
73
|
+
1. **每行一个记忆文件**,用 `- [标题](相对路径)` 格式
|
|
74
|
+
2. **一句话钩子**帮助 AI 在启动时判断是否值得深入阅读
|
|
75
|
+
3. 新增记忆后**立即更新** MEMORY.md
|
|
76
|
+
4. 已归档的记忆保留索引行,标注 `(archived)`
|
|
77
|
+
5. 不做硬性分类,四条大类足够
|
|
78
|
+
|
|
79
|
+
## 写入前置检查清单
|
|
80
|
+
|
|
81
|
+
在写入或修改任何记忆文件前,检查以下四项:
|
|
82
|
+
|
|
83
|
+
- [ ] **是否重复**: 这条信息是否已经存在于某条记忆中?如果是,更新已有记录而不是新建
|
|
84
|
+
- [ ] **是否有价值**: 这条信息对未来开发有用吗?3 个月后还会需要它吗?
|
|
85
|
+
- [ ] **是否事实**: 这是客观事实还是主观猜测?如是猜测,标注 `(待确认)`
|
|
86
|
+
- [ ] **一个主题一个文件**: 相关事实是否应归入同一条目或同一个文件?
|
|
87
|
+
|
|
88
|
+
## 何时读取记忆
|
|
89
|
+
|
|
90
|
+
| 场景 | 应该读取 |
|
|
91
|
+
|------|----------|
|
|
92
|
+
| 对话开始时 | MEMORY.md 索引 |
|
|
93
|
+
| 开始新功能 | 用户偏好、相关模块状态 |
|
|
94
|
+
| 遇到错误 | troubleshooting.md |
|
|
95
|
+
| 做技术决策 | architecture-decisions.md |
|
|
96
|
+
| 修 Bug | 相关模块记忆、troubleshooting.md |
|
|
97
|
+
| 用户给反馈 | 反馈历史(避免重复讨论) |
|
|
98
|
+
|
|
99
|
+
## 记忆目录保护规则
|
|
100
|
+
|
|
101
|
+
> **关键规则:在合并模式下(已有 `.claude/` 目录),`memory/` 目录永不覆盖。**
|
|
102
|
+
|
|
103
|
+
- 合并模式下:`memory/` 目录**完全保留不动**,不写入、不修改、不删除任何文件
|
|
104
|
+
- 覆盖模式下(`--overwrite`):仍保留 `memory/`,但会添加缺失的模板文件
|
|
105
|
+
- 卸载模式下(`--uninstall`):`memory/` 中的文件不列入 manifest,不会被卸载删除
|
|
106
|
+
- 原因:记忆是项目积累的宝贵上下文,新生成的模板不应冲掉已有记录
|
|
@@ -1,48 +1,117 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/*.ts"
|
|
4
|
-
- "**/*.tsx"
|
|
5
|
-
- "**/*.js"
|
|
6
|
-
- "**/*.jsx"
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.ts"
|
|
4
|
+
- "**/*.tsx"
|
|
5
|
+
- "**/*.js"
|
|
6
|
+
- "**/*.jsx"
|
|
7
|
+
---
|
|
8
|
+
# 代码模式规范(Patterns)
|
|
9
|
+
|
|
10
|
+
> 本文件定义项目中应遵循的通用代码模式。保持一致性比"最好"更重要。
|
|
11
|
+
|
|
12
|
+
## API 响应格式
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
interface ApiResponse<T> {
|
|
16
|
+
success: boolean
|
|
17
|
+
data?: T
|
|
18
|
+
error?: string
|
|
19
|
+
meta?: {
|
|
20
|
+
total: number
|
|
21
|
+
page: number
|
|
22
|
+
limit: number
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 自定义 Hook 模式(前端)
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
export function useDebounce<T>(value: T, delay: number): T {
|
|
31
|
+
const [debouncedValue, setDebouncedValue] = useState<T>(value)
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
const handler = setTimeout(() => setDebouncedValue(value), delay)
|
|
34
|
+
return () => clearTimeout(handler)
|
|
35
|
+
}, [value, delay])
|
|
36
|
+
return debouncedValue
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Repository 模式(后端)
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
interface Repository<T, CreateDto, UpdateDto> {
|
|
44
|
+
findAll(filters?: FilterOptions): Promise<T[]>
|
|
45
|
+
findById(id: string): Promise<T | null>
|
|
46
|
+
findByUnique(field: keyof T, value: unknown): Promise<T | null>
|
|
47
|
+
create(data: CreateDto): Promise<T>
|
|
48
|
+
update(id: string, data: UpdateDto): Promise<T>
|
|
49
|
+
softDelete?(id: string): Promise<T> // 可选:软删除
|
|
50
|
+
delete(id: string): Promise<void>
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Service 层模式
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
@Injectable() // NestJS 示例,其他框架类似
|
|
58
|
+
export class UserService {
|
|
59
|
+
constructor(
|
|
60
|
+
private readonly userRepo: UserRepository,
|
|
61
|
+
private readonly logger: LoggerService,
|
|
62
|
+
) {}
|
|
63
|
+
|
|
64
|
+
async createUser(dto: CreateUserDto): Promise<User> {
|
|
65
|
+
// 1. 校验
|
|
66
|
+
const exists = await this.userRepo.findByEmail(dto.email)
|
|
67
|
+
if (exists) throw new ConflictException('用户已存在')
|
|
68
|
+
|
|
69
|
+
// 2. 业务逻辑
|
|
70
|
+
const hashedPassword = await hash(dto.password, 10)
|
|
71
|
+
|
|
72
|
+
// 3. 持久化
|
|
73
|
+
const user = await this.userRepo.create({
|
|
74
|
+
...dto,
|
|
75
|
+
password: hashedPassword,
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
this.logger.info('用户创建成功', { userId: user.id })
|
|
79
|
+
return user
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 错误处理统一模式
|
|
85
|
+
|
|
86
|
+
> **底层错误收窄技巧(unknown → Error、async/await try-catch)见 `.claude/rules/coding-style.md` § 错误处理**
|
|
87
|
+
> 本节定义业务层错误分类体系,与 coding-style.md 互补。
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// 自定义业务错误类
|
|
91
|
+
export class AppError extends Error {
|
|
92
|
+
constructor(
|
|
93
|
+
message: string,
|
|
94
|
+
public statusCode: number = 500,
|
|
95
|
+
public code: string = 'INTERNAL_ERROR',
|
|
96
|
+
) {
|
|
97
|
+
super(message);
|
|
98
|
+
this.name = 'AppError';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// 常用快捷错误
|
|
103
|
+
export class NotFoundError extends AppError {
|
|
104
|
+
constructor(resource: string, id?: string) {
|
|
105
|
+
super(`${resource}${id ? ` (${id})` : ''} 不存在`, 404, 'NOT_FOUND');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export class ValidationError extends AppError {
|
|
110
|
+
constructor(details: string) {
|
|
111
|
+
super(details, 400, 'VALIDATION_ERROR');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 使用示例
|
|
116
|
+
if (!user) throw new NotFoundError('User', userId);
|
|
117
|
+
```
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.ts"
|
|
4
|
+
- "**/*.tsx"
|
|
5
|
+
- "**/*.js"
|
|
6
|
+
- "**/*.jsx"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 性能优化规则
|
|
10
|
+
|
|
11
|
+
> 本文件定义了模型选择、上下文管理和构建调优策略。
|
|
12
|
+
|
|
13
|
+
## 模型选择策略
|
|
14
|
+
|
|
15
|
+
根据任务类型选择最合适的模型,平衡性能和成本。
|
|
16
|
+
|
|
17
|
+
| 模型 | 适用场景 | 成本效益 |
|
|
18
|
+
|------|----------|----------|
|
|
19
|
+
| **Haiku 4.5** | 90% Sonnet 能力,3 倍成本节省 | 高频轻量任务的首选 |
|
|
20
|
+
| **Sonnet 4.6** | 最佳编码模型 | 主要开发工作、复杂编码 |
|
|
21
|
+
| **Opus 4.5** | 最深推理能力 | 复杂架构决策、研究分析 |
|
|
22
|
+
|
|
23
|
+
### 推荐分配
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
轻量 Agent(频繁调用) → Haiku 4.5
|
|
27
|
+
- 代码审查
|
|
28
|
+
- 简单重构
|
|
29
|
+
- 测试生成
|
|
30
|
+
|
|
31
|
+
主要开发工作 → Sonnet 4.6
|
|
32
|
+
- 功能实现
|
|
33
|
+
- Bug 修复
|
|
34
|
+
- 多文件修改
|
|
35
|
+
|
|
36
|
+
深度推理 → Opus 4.5
|
|
37
|
+
- 架构决策
|
|
38
|
+
- 复杂问题排查
|
|
39
|
+
- 安全审计
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 上下文窗口管理
|
|
43
|
+
|
|
44
|
+
上下文窗口的最后 20% 区域执行效率显著下降。以下操作应**避免**在最后 20% 区域执行:
|
|
45
|
+
|
|
46
|
+
- ❌ 大规模重构(跨多个文件)
|
|
47
|
+
- ❌ 涉及多文件的功能实现
|
|
48
|
+
- ❌ 复杂交互的 Debug
|
|
49
|
+
|
|
50
|
+
以下操作对上下文位置**不敏感**,可在任意位置执行:
|
|
51
|
+
|
|
52
|
+
- ✅ 单文件编辑
|
|
53
|
+
- ✅ 独立工具函数创建
|
|
54
|
+
- ✅ 文档更新
|
|
55
|
+
- ✅ 简单 Bug 修复
|
|
56
|
+
|
|
57
|
+
### 最佳实践
|
|
58
|
+
|
|
59
|
+
- **分段提交**: 大任务拆分为多个小段,每段独立提交
|
|
60
|
+
- **关键操作前置**: 需要全上下文感知的操作优先在对话早期完成
|
|
61
|
+
- **适时重启**: 如果上下文已满且还有复杂任务,保存进度后开启新对话
|
|
62
|
+
|
|
63
|
+
## 扩展思考 + Plan 模式
|
|
64
|
+
|
|
65
|
+
扩展思考(Extended Thinking)默认启用,保留最多 31,999 个 token 用于内部推理。
|
|
66
|
+
|
|
67
|
+
### 控制方式
|
|
68
|
+
|
|
69
|
+
| 操作 | 快捷键 |
|
|
70
|
+
|------|--------|
|
|
71
|
+
| 开启/关闭 | Option+T (macOS) / Alt+T (Windows/Linux) |
|
|
72
|
+
| 配置文件 | `~/.claude/settings.json` 中的 `alwaysThinkingEnabled` |
|
|
73
|
+
| 预算上限 | 环境变量 `MAX_THINKING_TOKENS` |
|
|
74
|
+
|
|
75
|
+
### 适用场景
|
|
76
|
+
|
|
77
|
+
对于复杂任务,结合 Plan 模式获得最佳效果:
|
|
78
|
+
|
|
79
|
+
1. 确保扩展思考已启用(默认开启)
|
|
80
|
+
2. 启用 Plan 模式进行结构化规划
|
|
81
|
+
3. 多轮 Critique 确保充分分析
|
|
82
|
+
4. 使用子 Agent 分工获取多角度视角
|
|
83
|
+
|
|
84
|
+
## 构建调优
|
|
85
|
+
|
|
86
|
+
如果构建失败,按以下流程排查:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
构建失败
|
|
90
|
+
↓
|
|
91
|
+
① 分析错误信息
|
|
92
|
+
↓
|
|
93
|
+
② 定位出错文件/模块
|
|
94
|
+
↓
|
|
95
|
+
③ 增量修复(一次修一个错误)
|
|
96
|
+
↓
|
|
97
|
+
④ 重新编译验证
|
|
98
|
+
↓
|
|
99
|
+
⑤ 重复直至通过
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 如果构建反复失败
|
|
103
|
+
|
|
104
|
+
1. 使用 **build-error-resolver** agent 专项排查
|
|
105
|
+
2. 检查依赖版本是否兼容
|
|
106
|
+
3. 检查 TypeScript 配置(`tsconfig.json`)是否正确
|
|
107
|
+
4. 清除缓存后重试(`rm -rf node_modules/.cache`、`rm -rf dist/`)
|
|
108
|
+
5. 逐文件排查增量编译报错
|
|
@@ -1,37 +1,52 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/*.ts"
|
|
4
|
-
- "**/*.tsx"
|
|
5
|
-
- "**/*.js"
|
|
6
|
-
- "**/*.jsx"
|
|
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
|
-
- [ ]
|
|
32
|
-
- [ ]
|
|
33
|
-
- [ ]
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.ts"
|
|
4
|
+
- "**/*.tsx"
|
|
5
|
+
- "**/*.js"
|
|
6
|
+
- "**/*.jsx"
|
|
7
|
+
---
|
|
8
|
+
# 安全规范(Security)
|
|
9
|
+
|
|
10
|
+
> 安全是特性,不是事后补救。
|
|
11
|
+
> **触发条件**: 仅 auth / finance / system 模块(或涉及用户数据、支付、权限的代码变更)。
|
|
12
|
+
> **跳过条件**: 非安全敏感模块(纯 UI 调整、文档修改、重构不涉数据流等)。
|
|
13
|
+
> 完整触发/跳过规则见 `development-workflow.md` 第 ⑦ 步。
|
|
14
|
+
|
|
15
|
+
## 密钥管理
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// ❌ 硬编码密钥(绝对禁止)
|
|
19
|
+
const apiKey = "sk-proj-xxxxx"
|
|
20
|
+
|
|
21
|
+
// ✅ 使用环境变量
|
|
22
|
+
const apiKey = process.env.OPENAI_API_KEY
|
|
23
|
+
if (!apiKey) {
|
|
24
|
+
throw new Error('OPENAI_API_KEY not configured')
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 提交前强制检查清单
|
|
29
|
+
|
|
30
|
+
- [ ] 无硬编码密钥(API Key、密码、Token)
|
|
31
|
+
- [ ] 所有用户输入已校验(Zod schema)
|
|
32
|
+
- [ ] SQL 注入防护(参数化查询 / ORM 内置防护)
|
|
33
|
+
- [ ] XSS 防护(HTML 净化 / 转义输出)
|
|
34
|
+
- [ ] CSRF 保护已启用(有表单提交时)
|
|
35
|
+
- [ ] 身份认证/授权已验证
|
|
36
|
+
- [ ] 所有端点已限流
|
|
37
|
+
- [ ] 错误消息不泄露敏感数据(不返回堆栈、内部路径等)
|
|
38
|
+
|
|
39
|
+
## 常见安全漏洞防范
|
|
40
|
+
|
|
41
|
+
| 漏洞 | 防范方式 |
|
|
42
|
+
|------|----------|
|
|
43
|
+
| SQL 注入 | 使用 ORM / 参数化查询 |
|
|
44
|
+
| XSS | 输出转义、CSP 头、HTML Sanitizer |
|
|
45
|
+
| CSRF | SameSite Cookie、CSRF Token |
|
|
46
|
+
| SSRF | 白名单域名 + 不响应内网 IP |
|
|
47
|
+
| IDOR (越权) | 每次操作验证资源所有权 |
|
|
48
|
+
| 敏感数据泄露 | 日志脱敏、错误信息泛化 |
|
|
49
|
+
|
|
50
|
+
## Agent 支持
|
|
51
|
+
|
|
52
|
+
- 使用 **security-review** skill 进行全面的安全审计
|